// check for collision between 'this' sprite and sprite void Sprite::CheckCollision( Sprite &sprite ) { int c; c = CalculateCollision( GetBitmask(), sprite.GetBitmask(), (int)(sprite.GetX() - x), (int)(sprite.GetY() - y) ); if( c ) { if(( &sprite != owner ) && (sprite.owner != this)) { // we can't collide with our owner // a collision has occured // modify the velocities float avx, avy, bvx, bvy; // the kinetic energies of the collision float ke_him = .5 * sprite.GetMass() * (sprite.velocity.GetMagnitude() * sprite.velocity.GetMagnitude()); float ke_us = .5 * mass * (velocity.GetMagnitude() * velocity.GetMagnitude()); avx = sprite.velocity.GetX(); avy = sprite.velocity.GetY(); bvx = velocity.GetX(); bvy = velocity.GetY(); // calculate new velocities avx = (velocity.GetX() * (( 2. * mass ) / ( sprite.GetMass() + mass ) )) - (sprite.velocity.GetX() * (( mass - sprite.GetMass() )/( sprite.GetMass() + mass ))); avy = (velocity.GetY() * (( 2. * mass ) / ( sprite.GetMass() + mass ) )) - (sprite.velocity.GetY() * (( mass - sprite.GetMass() )/( sprite.GetMass() + mass ))); bvx = (sprite.velocity.GetX() * (( 2. * sprite.GetMass() ) / ( sprite.GetMass() + mass ) )) - (velocity.GetX() * (( sprite.GetMass() - mass )/( sprite.GetMass() + mass ))); bvy = (sprite.velocity.GetY() * (( 2. * sprite.GetMass() ) / ( sprite.GetMass() + mass ) )) - (velocity.GetY() * (( sprite.GetMass() - mass )/( sprite.GetMass() + mass ))); velocity.Set( bvx, bvy ); sprite.velocity.Set( avx, avy ); // until debugged ke_him = 1.; ke_us = 1.; // call the sprite-child's specific collision code Collision( ke_him ); // and the other's collision code sprite.Collision( ke_us ); } } }
bitmask *Sprite::GetBitmask( void ) { Camera *camera = Camera::Instance(); return( GetBitmask( ang + (camera->GetAngle() - 1.57) ) ); }
void Screen4::Start() { m_sky = new CloudActor("Resources/Images/clouds2.jpg"); m_ground = new GroundActor("Resources/Images/Levels/Screen2/Screen2.png", GetBitmask("Resources/Images/Levels/Screen2/Screen2Bitmask.png"), 0.0f, MathUtil::GetWorldDimensions()); m_ground->SetLayered(false); m_arth = new CharActor(GetBitmask("Resources/Images/animations/chars/arth/arthBitmask.png"),Vector2(-(MathUtil::GetWorldDimensions().X/2)+2,0)); int i; #pragma region snakes SnakeActor *snake[4]; Path pos; pos.begin = Vector2(-3,3); pos.end = Vector2(-5,-3); snake[0] = new SnakeActor(GetBitmask("Resources/Images/animations/chars/snake/snakeBitmask.png"), pos,1.2f,3.0f); //pos.end = Vector2(0,4); //pos.begin = Vector2(0,-4); //snake[1]= new SnakeActor(GetBitmask("Resources/Images/animations/chars/snake/snakeBitmask.png"), pos,1.5f,1.0f); //pos.end = Vector2(0,4); //pos.begin = Vector2(0,-4); //snake[2]= new SnakeActor(GetBitmask("Resources/Images/animations/chars/snake/snakeBitmask.png"), pos,1.5f,1.0f); //pos.end = Vector2(0,4); //pos.begin = Vector2(0,-4); //snake[3]= new SnakeActor(GetBitmask("Resources/Images/animations/chars/snake/snakeBitmask.png"), pos,1.5f,1.0f); #pragma endregion snakes #pragma region level #pragma region buttons ButtonActor *button[3]; std::vector<ButtonActor *> buttons; button[0] = new ButtonActor("Resources/Images/Button/", GetBitmask("Resources/Images/Button/mask.png"), Vector2(-3.0f,0.0f), Vector2(1.0f), 0.5f); button[1] = new ButtonActor("Resources/Images/Button/", GetBitmask("Resources/Images/Button/mask.png"), Vector2(3.0f,4.0f), Vector2(2.0f)); button[2] = new ButtonActor("Resources/Images/Button/", GetBitmask("Resources/Images/Button/mask.png"), Vector2(5.0f,-4.0f), Vector2(1.0f)); for(i=0;i<3;++i) buttons.push_back(button[i]); #pragma endregion buttons GroundActor* wall[18]; DoorActor *door[2]; #pragma region left border wall[0] = new GroundActor("Resources/Images/Wall/wallNNEE.png", GetBitmask("Resources/Images/Wall/wallNNEE_Bitmask.png"), Vector2(-(MathUtil::GetWorldDimensions().X/2)+1.0f, (MathUtil::GetWorldDimensions().Y/2)-1.0f), 2.0f); wall[1] = new GroundActor("Resources/Images/Wall/wallE.png", GetBitmask("Resources/Images/Wall/wallE_Bitmask.png"), Vector2(-(MathUtil::GetWorldDimensions().X/2)+1.0f, (MathUtil::GetWorldDimensions().Y/2)-3.0f), 2.0f); wall[2] = new GroundActor("Resources/Images/Wall/wallE.png", GetBitmask("Resources/Images/Wall/wallE_Bitmask.png"), Vector2(-(MathUtil::GetWorldDimensions().X/2)+1.0f, (MathUtil::GetWorldDimensions().Y/2)-5.0f), 2.0f); wall[3] = new GroundActor("Resources/Images/Wall/wallE.png", GetBitmask("Resources/Images/Wall/wallE_Bitmask.png"), Vector2(-(MathUtil::GetWorldDimensions().X/2)+1.0f, (MathUtil::GetWorldDimensions().Y/2)-7.0f), 2.0f); wall[4] = new GroundActor("Resources/Images/Wall/wallSSEE.png", GetBitmask("Resources/Images/Wall/wallSSEE_Bitmask.png"), Vector2(-(MathUtil::GetWorldDimensions().X/2)+1.0f, (MathUtil::GetWorldDimensions().Y/2)-9.0f), 2.0f); door[0] = new DoorActor("Resources/Images/Door/",GetBitmask("Resources/Images/Door/maskOpen.png"),GetBitmask("Resources/Images/Door/maskClosed.png"), Vector2(-(MathUtil::GetWorldDimensions().X/2)+0.5f, (MathUtil::GetWorldDimensions().Y/2)-10.5f), Vector2(1.0f, 4.0f), true); wall[5] = new GroundActor("Resources/Images/Wall/wallNNEE.png", GetBitmask("Resources/Images/Wall/wallNNEE_Bitmask.png"), Vector2(-(MathUtil::GetWorldDimensions().X/2)+1.0f, -2.0f), 2.0f); wall[6] = new GroundActor("Resources/Images/Wall/wallE.png", GetBitmask("Resources/Images/Wall/wallE_Bitmask.png"), Vector2(-(MathUtil::GetWorldDimensions().X/2)+1.0f, -4.0f), 2.0f); wall[7] = new GroundActor("Resources/Images/Wall/wallE.png", GetBitmask("Resources/Images/Wall/wallE_Bitmask.png"), Vector2(-(MathUtil::GetWorldDimensions().X/2)+1.0f, -6.0f), 2.0f); wall[8] = new GroundActor("Resources/Images/Wall/wallSSEE.png", GetBitmask("Resources/Images/Wall/wallSSEE_Bitmask.png"), Vector2(-(MathUtil::GetWorldDimensions().X/2)+1.0f, -8.0f), 2.0f); #pragma endregion left border #pragma region right border wall[9] = new GroundActor("Resources/Images/Wall/wallNNWW.png", GetBitmask("Resources/Images/Wall/wallNNWW_Bitmask.png"), (MathUtil::GetWorldDimensions()/2)-1.0f, 2.0f); wall[10] = new GroundActor("Resources/Images/Wall/wallW.png", GetBitmask("Resources/Images/Wall/wallW_Bitmask.png"), Vector2((MathUtil::GetWorldDimensions().X/2)-1.0f, (MathUtil::GetWorldDimensions().Y/2)-3.0f), 2.0f); wall[11] = new GroundActor("Resources/Images/Wall/wallW.png", GetBitmask("Resources/Images/Wall/wallW_Bitmask.png"), Vector2((MathUtil::GetWorldDimensions().X/2)-1.0f, (MathUtil::GetWorldDimensions().Y/2)-5.0f), 2.0f); wall[12] = new GroundActor("Resources/Images/Wall/wallW.png", GetBitmask("Resources/Images/Wall/wallW_Bitmask.png"), Vector2((MathUtil::GetWorldDimensions().X/2)-1.0f, (MathUtil::GetWorldDimensions().Y/2)-7.0f), 2.0f); wall[13] = new GroundActor("Resources/Images/Wall/wallSSWW.png", GetBitmask("Resources/Images/Wall/wallSSWW_Bitmask.png"), Vector2((MathUtil::GetWorldDimensions().X/2)-1.0f, (MathUtil::GetWorldDimensions().Y/2)-9.0f), 2.0f); door[1] = new DoorActor("Resources/Images/Door/", GetBitmask("Resources/Images/Door/maskOpen.png"), GetBitmask("Resources/Images/Door/maskClosed.png"), Vector2((MathUtil::GetWorldDimensions().X/2)-0.5f, (MathUtil::GetWorldDimensions().Y/2)-10.5f), Vector2(1.0f, 4.0f) , buttons); wall[14] = new GroundActor("Resources/Images/Wall/wallNNWW.png", GetBitmask("Resources/Images/Wall/wallNNWW_Bitmask.png"), Vector2((MathUtil::GetWorldDimensions().X/2)-1.0f, -2.0f), 2.0f); wall[15] = new GroundActor("Resources/Images/Wall/wallW.png", GetBitmask("Resources/Images/Wall/wallW_Bitmask.png"), Vector2((MathUtil::GetWorldDimensions().X/2)-1.0f, -4.0f), 2.0f); wall[16] = new GroundActor("Resources/Images/Wall/wallW.png", GetBitmask("Resources/Images/Wall/wallW_Bitmask.png"), Vector2((MathUtil::GetWorldDimensions().X/2)-1.0f, -6.0f), 2.0f); wall[17] = new GroundActor("Resources/Images/Wall/wallSSWW.png", GetBitmask("Resources/Images/Wall/wallSSWW_Bitmask.png"), Vector2((MathUtil::GetWorldDimensions().X/2)-1.0f, -8.0f), 2.0f); #pragma endregion right border #pragma endregion level for(i=0;i<1;++i) theWorld.Add(snake[i], i+1); for(i=0;i<3;++i) theWorld.Add(button[i], 1); for(i=0;i<2;++i) theWorld.Add(door[i], 1); for(i=1; i<18; ++i) theWorld.Add(wall[i], 1); //PixelArth housekeeping below this point. #pragma region PixelArth Housekeeping for(i=0;i<1;++i) _objects.push_back(snake[i]); for(i=0;i<3;++i) _objects.push_back(button[i]); for(i=0;i<2;++i) _objects.push_back(door[i]); for(i=0;i<18;++i) _objects.push_back(wall[i]); PixelArthScreen::Start(); #pragma endregion }