//Set Z for everything void World::Update() { //Update everything first for (int i = 0; i < capacity; i++) { ICharacter* player = players[i]; if (player) player->Update(); //set z } //Update map box objects (lol, i dont have any that move) //Update map circle objects (lol, i dont have any) //Check for collisions second for (int i = 0; i < capacity; i++) { ICharacter* player = players[i]; if (player) { Collision coll; Circle& circle = player->circle; //player collision with map boxes Box* pBox = boxList.Begin(); while (pBox != NULL) { if (Physics::CircleToBox(circle, *pBox, &coll)) Physics::ResolveCollision(circle, *pBox, coll); //player's balls (only circles) BallList* pBallList = &player->ballList; IBall* pBall = pBallList->Begin(); while (pBall != NULL) { Circle* pCircle = pBall->circle; if (pCircle != NULL && Physics::CircleToBox(*pCircle, *pBox, &coll)) if (pBall->Hit(COLL::OBJ, NULL) == COLL::BOUNCE) Physics::ResolveCollision(*pCircle, *pBox, coll); pBallList->Next(); pBall = pBallList->At(); } boxList.Next(); pBox = boxList.At(); } //Player collision with map circles Circle* pCircle = circleList.Begin(); while (pCircle != NULL) { if (Physics::CircleToCircle(circle, *pCircle, &coll)) Physics::ResolveCollision(circle, *pCircle, coll); //player's balls BallList* pBallList = &player->ballList; IBall* pBall = pBallList->Begin(); while (pBall != NULL) { Circle* pCircle2 = pBall->circle; Box* pBox = pBall->box; //Note at least one of these hitboxes is null if ((pBox != NULL && Physics::CircleToBox(*pCircle, *pBox, &coll)) || (pCircle2 != NULL && Physics::CircleToCircle(*pCircle, *pCircle2, &coll))) { if (pBall->Hit(COLL::OBJ, NULL) == COLL::BOUNCE) { if (pBox != NULL) Physics::ResolveCollision(*pCircle, *pBox, coll); else if (pCircle2 != NULL) Physics::ResolveCollision(*pCircle, *pCircle2, coll); } } pBallList->Next(); pBall = pBallList->At(); } circleList.Next(); pCircle = circleList.At(); } //player-player collisions for (int n = i + 1; n < capacity; n++) { ICharacter* player2 = players[n]; if (player2) { //player to player collision Circle& circle2 = player2->circle; if (Physics::CircleToCircle(circle, circle2, &coll)) Physics::ResolveCollision(circle, circle2, coll); //player's balls to player collisions BallList* pBallList = &player->ballList; IBall* pBall = pBallList->Begin(); while (pBall != NULL) { Circle* pCircle = pBall->circle; Box* pBox = pBall->box; COLL type; //Note at least one of these hitboxes is null if ((pBox != NULL && Physics::CircleToBox(circle2, *pBox, &coll)) || (pCircle != NULL && Physics::CircleToCircle(circle2, *pCircle, &coll))) { if (pBall->Hit(COLL::HIT, player2) == COLL::BOUNCE) { if (pBox != NULL) Physics::ResolveCollision(circle2, *pBox, coll); else if (pCircle != NULL) Physics::ResolveCollision(circle2, *pCircle, coll); } } //to player's balls collisions BallList* pBallList2 = &player2->ballList; IBall* pBall2 = pBallList2->Begin(); while (pBall2 != NULL) { Circle* pCircle2 = pBall2->circle; Box* pBox2 = pBall2->box; if (pBox != NULL) { if (pBox2 != NULL && Physics::BoxToBox(*pBox, *pBox2)) { pBall->Hit(COLL::BALL, NULL); pBall2->Hit(COLL::BALL, NULL); } else if (pCircle2 != NULL && Physics::CircleToBox(*pCircle2, *pBox, &coll)) if (pBall->Hit(COLL::BALL, NULL) == COLL::BOUNCE && pBall2->Hit(COLL::BALL, NULL) == COLL::BOUNCE) Physics::ResolveCollision(*pCircle2, *pBox, coll); } else if (pCircle != NULL) { if (pBox2 != NULL && Physics::CircleToBox(*pCircle, *pBox2, &coll)) { if (pBall->Hit(COLL::BALL, NULL) == COLL::BOUNCE && pBall2->Hit(COLL::BALL, NULL) == COLL::BOUNCE) Physics::ResolveCollision(*pCircle, *pBox2, coll); } else if (pCircle2 != NULL && Physics::CircleToCircle(*pCircle, *pCircle2, &coll)) if (pBall->Hit(COLL::BALL, NULL) == COLL::BOUNCE && pBall2->Hit(COLL::BALL, NULL) == COLL::BOUNCE) Physics::ResolveCollision(*pCircle, *pCircle2, coll); } if ((pBox != NULL && Physics::CircleToBox(circle2, *pBox, &coll)) || (pCircle != NULL && Physics::CircleToCircle(circle2, *pCircle, &coll))) { type = pBall->Hit(COLL::HIT, player2); if (type == COLL::BOUNCE) { if (pBox != NULL) Physics::ResolveCollision(circle2, *pBox, coll); else if (pCircle != NULL) Physics::ResolveCollision(circle2, *pCircle, coll); } } pBallList2->Next(); pBall2 = pBallList->At(); } pBallList->Next(); pBall = pBallList->At(); } } } } } }