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; }
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++; }