void GameBlock::Move(double delta, GameObjects* Objects){ if (alive) { angle += (rand()%20 - 10); double Multiplier = 1; MoveByAngle(delta, Multiplier); int Resoult = NONE; Resoult += CollidesWith(Objects->Player); if (Resoult % 10 == LEFT) x = Objects->Player.x + Objects->Player.w + r; if (Resoult % 10 == RIGHT) x = Objects->Player.x - r; Resoult += OutOfMap(); Resoult += CollidesWith(Objects->Brick); Resoult += CollidesWith(Objects->Block); if (Resoult) { MoveByAngle(delta, -Multiplier); if (Resoult % 10 > 0) BounceVertical(); if (Resoult / 10 > 0) BounceHorizontal(); } } }
void Player::Update(float deltaTime) { if(Lives <= 0) return; if(CurrentAnimation == ExplodeAnimation) { if(CurrentAnimation->Finished) { CurrentAnimation = 0; Lives--; if(this->LoadedMissile != 0) { MainGame->RemoveEntity(LoadedMissile); this->LoadedMissile = 0; } Player::Init(); } return; } VelocityX = 0; if(MainGame->LeftPressed) { VelocityX = -5; } if(MainGame->RightPressed) { VelocityX = 5; } PosX += VelocityX; PosX = min(SCRWIDTH - SizeX, PosX); PosX = max(0, PosX); if(MainGame->SpacePressed) { if(LoadedMissile != 0) { LoadedMissile->Type = "missile_player"; LoadedMissile->Fire(); LoadedMissile = 0; Mix_PlayChannel(-1, Assets::Sounds["player_shoot"], 0); } } if(CollidesWith("missile_invader") || CollidesWith("invader")) { Mix_PlayChannel(-1, Assets::Sounds["player_explode"], 0); CurrentAnimation = ExplodeAnimation; CurrentAnimation->Play(false); } if(LoadedMissile != 0) { LoadedMissile->PosX = PosX + (Graphic->GetWidth() / 2) - LoadedMissile->Graphic->GetWidth() / 2; LoadedMissile->PosY = PosY - 8; } }
//Based upon the tested collider, we'll look for a circle-circle collision or a circle-rectangle collision. bool CCircle::CheckCollision(Collider* collider) { bool isColliding = false; if (collider->GetType() == Type::CIRCLE) { isColliding = CollidesWith((CCircle*)collider); } else if (collider->GetType() == Type::RECTANGLE) { isColliding = CollidesWith((CRectangle*)collider); } return isColliding; }
void LevelTrigger::Update(float deltaTime) { if(CollidesWith("player")) { GameScene* scene = (GameScene*)Scene; int roomX = scene->CurrentLevel->CurrentRoomX; int roomY = scene->CurrentLevel->CurrentRoomY; if(roomX == 7 && roomY == 7) { scene->SwitchLevel("room 1"); return; } if(roomX == 4 && roomY == 6) { scene->SwitchLevel("boss"); return; } if(roomX == 6 && roomY == 6) { scene->SwitchLevel("shopkeeper"); return; } scene->SwitchLevel("random"); } }
void GameBullet::Move(double delta, GameObjects* Objects){ if (alive) { MoveByAngle(delta, 1.0f); CollidesWith(Objects->Brick); OutOfMap(); } }
void GameBall::Move(double delta, GameObjects* Objects){ if (alive) { double Multiplier = 1; if (glued) Multiplier = 0; if (Objects->Player.ActiveBonus[SLOW] > 0) Multiplier /= 2; MoveByAngle(delta, Multiplier); int Resoult = NONE; Resoult += CollidesWith(Objects->Player); if (Resoult % 10 == LEFT) x = Objects->Player.x + Objects->Player.w + r; if (Resoult % 10 == RIGHT) x = Objects->Player.x - r; if (Resoult == CENTER) y = Objects->Player.y - r; Resoult += OutOfMap(); Resoult += CollidesWith(Objects->Brick); CollidesWith(Objects->Block); if (Resoult) { MoveByAngle(delta, -Multiplier); if (Resoult % 10 > 0) BounceVertical(); if (Resoult / 10 > 0) BounceHorizontal(); if (newAngle) { angle = newAngle; newAngle = 0.0f; } } } }
void GameBonus::Move(double delta, GameObjects* Objects){ if (alive) { double Multiplier = 1; if (Objects->Player.ActiveBonus[SLOW] > 0) Multiplier /= 2; MoveByAngle(delta, Multiplier); CollidesWith(Objects->Player); if (OutOfMap() == DOWN) Destroy(); } }
void Entity::NotifyCollisions() { std::vector<RectangleShape*> collidables; level_->CollidablesFor(this, collidables); for(RectangleShape* collidable : collidables) { if(collidable->IsEntity() && ((Entity*)collidable)->IsMob()) { Mob* mob = (Mob*)collidable; if(CanCollideWith(mob) && CollidesWith(mob)) { if(HandleCollisionWith(mob)) { return; } } } } }
bool Quad::CollidesWith (Line& line, Vector* vIntersection) { if (GetAsyncKeyState (0x41 + 'b' - 'a')) int blah = 0; // first, check if the line even intersects the plane containing the quad Vector vNormal = (v2 - v1) & (v4 - v1); Vector vPlaneIntersection; if (Plane(vNormal, v1).CollidesWith (line, &vPlaneIntersection) == false) return false; // now check of the plane's intersection point is in the quad if (!CollidesWith (vPlaneIntersection)) return false; // the line intersects the quad, so return the result if (vIntersection) *vIntersection = vPlaneIntersection; return true; }
// default collision algorithms bool BoundingShape::CollidesWith (Triangle& triangle, Vector* vIntersection) { // test the plane on which the triangle lies Vector vPlaneIntersect; if (!CollidesWith (Plane (triangle.vNormal, triangle.v1), &vPlaneIntersect)) return false; // run 3 half-space tests if (! Line(triangle.v1, triangle.v2).SameSide (triangle.v3, vPlaneIntersect)) return false; if (! Line(triangle.v2, triangle.v3).SameSide (triangle.v1, vPlaneIntersect)) return false; if (! Line(triangle.v3, triangle.v1).SameSide (triangle.v2, vPlaneIntersect)) return false; if (vIntersection) *vIntersection = vPlaneIntersect; return true; }
bool BoundingShape::CollidesWith (Quad& quad, Vector* vIntersection) { // test the plane on which the triangle lies Vector vPlaneIntersect; Vector vQuadNormal = ((quad.v2 - quad.v1) & (quad.v3 - quad.v1)).Normalize(); if (!CollidesWith (Plane (vQuadNormal, quad.v1), &vPlaneIntersect)) return false; // run 4 half-space tests if (! Line(quad.v1, quad.v2).SameSide (quad.v3, vPlaneIntersect)) return false; if (! Line(quad.v2, quad.v3).SameSide (quad.v4, vPlaneIntersect)) return false; if (! Line(quad.v3, quad.v4).SameSide (quad.v1, vPlaneIntersect)) return false; if (! Line(quad.v4, quad.v1).SameSide (quad.v2, vPlaneIntersect)) return false; if (vIntersection) *vIntersection = vPlaneIntersect; return true; }
void Alien::update() { Move(motionX, motionY); if(GetY() < 0) { SetY(0); resetMotion(); } else if(GetY() > 480-GetHeight()) { SetY(480-GetHeight()); resetMotion(); } int i; for(i=0;i<numEnemyShots;i++) { if(enemyShots[i]->isFired() == false) continue; if(CollidesWith(enemyShots[i])) { enemyShots[i]->remove(); resetPosition(); resetMotion(); resetShotCountdown(); score++; break; } } if(--lockMotionFrames == 0) resetMotion(); if(GetX() < 0) resetPosition(); if(--nextShotCountdown == 0) { resetShotCountdown(); for(i=0;i<numOwnShots;i++) { if(ownShots[i]->isFired() == false) { ownShots[i]->fire(GetX(), GetY() + (GetHeight() / 2) - 10, -6); break; } } } }