Esempio n. 1
0
int world_testCollision(float boundingBox[3]) {
	float triangle[3][3] = {{0,0,0},{0,0,0},{0,0,0}};
	int i, j, k;
	vect_t **triPtr = triangleList, *tri;
	vect4_t q;
	// Create camera-rotation quaternion
	buildTransform(q);
	for (i = 0; i < numTriangles; i++, triPtr++) {
		// Copy triangle into correct format
		// and translate by camera position
		tri = *triPtr;
		for (j = 0; j < 3; j++)
			for (k = 0; k < 3; k++)
				triangle[j][k] = tri[k + 3*j] - camera.position[k];
		// Apply camera rotation to each vertex
		for (k = 0; k < 3; k++)
			transform(triangle[k], q);
		// Test for collision
		if (doesCollide(boundingBox, triangle)) {
			return 1;
		}
	}
	return 0;
}
Esempio n. 2
0
void world_getPushBack(float boundingBox[3], vect3_t velocity, vect3_t pushback) {
	float triangle[3][3] = {{0,0,0},{0,0,0},{0,0,0}},
		  matrix[16],
		  force;
	int i, j, k, collided = 0, collisions = 0;
	vect_t **triPtr = triangleList,
		   *tri;
	vect3_t triangleNormal;

	// Reset the pushback value
	pushback[0] = 0;
	pushback[1] = 0;
	pushback[2] = 0;

	// Setup the rotation matrix
	setupRotationMatrix(matrix);
//	setFlipMatrix(matrix);

	for (i = 0; i < numTriangles; i++, triPtr++) {
		// Copy triangle into correct format
		// and translate by camera position
		tri = *triPtr;
		for (j = 0; j < 3; j++)
			for (k = 0; k < 3; k++)
				triangle[j][k] = tri[k + 3*j] - camera.position[k];

		// Apply camera rotation to each vertex
		for (k = 0; k < 3; k++)
			rotatePoint(triangle[k], matrix);

		// If if collides, get pushback vector
		if (doesCollide(boundingBox, triangle)) {
			collided = 1;
			if (math_absF(pushback[1]) < math_absF(triangleNormal[1]))
				 pushback[1] = triangleNormal[1];
			pushback[0] += triangleNormal[0];
			pushback[2] += triangleNormal[2];
			math_triangleNormal(&triangle[0][0], triangleNormal);
			VectorDot(triangleNormal, velocity, force);
//			printf("Collided with normal %6.2f %6.2f %6.2f\n",
//					triangleNormal[0], triangleNormal[1], triangleNormal[2]);

			if (force > 0) {
	//			printf("Force = %6.2f\n", force);
				collisions++;
				VectorScale(triangleNormal, -1);
				// Scale the triangleNormal by the force
				// to get the amount pushed back

				// Set the maximum pushback amount
				for (j = 0; j < 3; j++) {
					if (math_absF(pushback[j]) < math_absF(triangleNormal[j]))
						pushback[j] = triangleNormal[j];
				}
			}
		}
	}
//	if (collided) {
//		printf("Pushback = (%6.2f, %6.2f, %6.2f)\n",
//				pushback[0], pushback[1], pushback[2]);
//	}
}
void KeyboardScene::update(float delta) {
	bool blockdie = false;
	int boo = -1;
	for (int b = 0; b < blocks.size(); b++) {
		if (doesCollideBlock(blocks.at(b)->getPosition(), ball->getPosition())) {
			blockdie = true;
			boo = b;
			break;
		}
	}
	if (ball->getPosition().y < sb / 2) {
		life = life - 1;
		if (life>0)
		showscore->setString("Lives: " + std::to_string(life));
		balldir = sqrt(-1);
		ball->setPosition(-301,0);
		if (life == 0) {
			showscore->setString("Gameover!");
		}
			
	}
	if (cd > 0 && (ball->getPosition().y>sh - sb / 2)) {
		cd = -mball;
		balldir = -balldir;
		audio->playEffect("boop.mp3");
	}
	else if (cd > 0 && (ball->getPosition().x<sb / 2 || ball->getPosition().x>sw - sb / 2)) {
		cd = -mball;
		balldir = -balldir + M_PI;
		audio->playEffect("boop.mp3");
	}
	else if (blockdie) {
		audio->playEffect("boop.mp3");
		auto leri = std::abs(blocks.at(boo)->getPosition().x - ball->getPosition().x);
		auto updo = std::abs(blocks.at(boo)->getPosition().y - ball->getPosition().y);
		if (cd > 0 && updo < (bh / 2)) {
			balldir = -balldir + M_PI;
		}
		else if (cd > 0 && leri < (bw / 2) ) {
			balldir = -balldir;
		}
		if (leri == bw/2){
			balldir = -balldir;
		}
		else if (updo == bh/2) {
			balldir = -balldir + M_PI;
		}
		cd = -mball;
		this->removeChild(blocks.at(boo));
		blocks.erase(blocks.begin() + boo);
		if (blocks.size() == 0) {
			showscore->setString("You win!");
			life = -1;
		}
	}
	//check paddle collide and bounce off using - complement - arctan(derivative sqrt(1-x^2)) where x=(padcenter-ballcenter)/padsize (assuming ball is point particle)
	else if (cd>0 && doesCollide(ball->getPosition(), sprite->getPosition())) {
		cd = -mball-mpad;
		balldir = -balldir - atan(-((sprite->getPosition().x- ball->getPosition().x)/ss) / sqrt(1-pow((sprite->getPosition().x- ball->getPosition().x)/ss, 2)));
		audio->playEffect("boop.mp3");
	}
	//move paddle and ball
	if (left && !right)
		sprite->setPosition(sprite->getPosition().x - mpad, sprite->getPosition().y);
	else if (right && !left)
		sprite->setPosition(sprite->getPosition().x + mpad, sprite->getPosition().y);
	ball->setPosition(ball->getPosition().x+mball*cos(balldir), ball->getPosition().y+mball*sin(balldir));
	cd++;
}