/**\brief Draws the radar. */ void Radar::Draw( Camera* camera, SpriteManager* sprites ) { short int radar_mid_x = RADAR_MIDDLE_X + Video::GetWidth() - 129; short int radar_mid_y = RADAR_MIDDLE_Y + 5; int radarSize; Coordinate focus = camera->GetFocusCoordinate(); /*if(largeMode) { if( visibility <= QUADRANTSIZE ) { Map* map = (Map*)UI::Search( "/Map/" ); assert(map); // large mode should only be on when there is a map. if(map) { map->SetCenter( focus ); map->SetScale( 300.0 / (2*visibility) ); } } return; }*/ list<Sprite*> *spriteList = sprites->GetSpritesNear(camera->GetFocusCoordinate(), (float)visibility); for( list<Sprite*>::const_iterator iter = spriteList->begin(); iter != spriteList->end(); iter++) { Coordinate blip; Sprite *sprite = *iter; // Calculate the blip coordinate for this sprite Coordinate wpos = sprite->GetWorldPosition(); WorldToBlip( focus, wpos, blip ); // Use the OpenGL Crop Rectangle to ensure that the blip is on the radar /* Convert to screen coords */ blip.SetX( blip.GetX() + radar_mid_x ); blip.SetY( blip.GetY() + radar_mid_y ); radarSize = int((sprite->GetRadarSize() / float(visibility)) * (RADAR_HEIGHT / 4.0)); if( radarSize >= 1 ) { if(sprite->GetID() == Hud::GetTarget() && Timer::GetTicks() % 1000 < 100) Video::DrawCircle( blip, radarSize, 2, WHITE ); else Video::DrawCircle( blip, radarSize, 1, sprite->GetRadarColor() ); } else { if(sprite->GetID() == Hud::GetTarget() && Timer::GetTicks() % 1000 < 100) Video::DrawCircle( blip, 1, 2, WHITE ); else Video::DrawPoint( blip, sprite->GetRadarColor() ); } } delete spriteList; }
/**\brief Update the Projectile * * Projectiles do all the normal Sprite things like moving. * Projectiles check for collisions with nearby Ships, and if they collide, * they deal damage to that ship. Note that since each projectile knows which ship fired it and will never collide with them. * * Projectiles have a life time limit (in milli-seconds). Each tick they need * to check if they've lived to long and need to disappear. * * Projectiles have the ability to track down a specific target. This only * means that they will turn slightly to head towards their target. */ void Projectile::Update( void ) { Sprite::Update(); // update momentum and other generic sprite attributes SpriteManager *sprites = SpriteManager::Instance(); // Check for projectile collisions Sprite* impact = sprites->GetNearestSprite( (Sprite*)this, 100,DRAW_ORDER_SHIP|DRAW_ORDER_PLAYER ); if( (impact != NULL) && (impact->GetID() != ownerID) && ((this->GetWorldPosition() - impact->GetWorldPosition()).GetMagnitude() < impact->GetRadarSize() )) { ((Ship*)impact)->Damage( (weapon->GetPayload())*damageBoost ); sprites->Delete( (Sprite*)this ); // Create a fire burst where this projectile hit the ship's shields. // TODO: This shows how much we need to improve our collision detection. Effect* hit = new Effect(this->GetWorldPosition(), "Resources/Animations/shield.ani", 0); hit->SetAngle( -this->GetAngle() ); hit->SetMomentum( impact->GetMomentum() ); sprites->Add( hit ); } // Expire the projectile after a time period if (( Timer::GetTicks() > secondsOfLife + start )) { sprites->Delete( (Sprite*)this ); } // Track the target Sprite* target = sprites->GetSpriteByID( targetID ); float tracking = weapon->GetTracking(); if( target != NULL && tracking > 0.00000001f ) { float angleTowards = normalizeAngle( ( target->GetWorldPosition() - this->GetWorldPosition() ).GetAngle() - GetAngle() ); SetMomentum( GetMomentum().RotateBy( angleTowards*tracking ) ); SetAngle( GetMomentum().GetAngle() ); } }
/**\brief Draws the radar. */ void Radar::Draw( void ) { short int radar_mid_x = RADAR_MIDDLE_X + Video::GetWidth() - 129; short int radar_mid_y = RADAR_MIDDLE_Y + 5; int radarSize; list<Sprite*> *spriteList = SpriteManager::Instance()->GetSpritesNear(Camera::Instance()->GetFocusCoordinate(), (float)visibility); for( list<Sprite*>::const_iterator iter = spriteList->begin(); iter != spriteList->end(); iter++) { Coordinate blip; Sprite *sprite = *iter; //if( sprite->GetDrawOrder() == DRAW_ORDER_PLAYER ) continue; // Calculate the blip coordinate for this sprite Coordinate wpos = sprite->GetWorldPosition(); WorldToBlip( wpos, blip ); // Use the OpenGL Crop Rectangle to ensure that the blip is on the radar /* Convert to screen coords */ blip.SetX( blip.GetX() + radar_mid_x ); blip.SetY( blip.GetY() + radar_mid_y ); radarSize = int((sprite->GetRadarSize() / float(visibility)) * (RADAR_HEIGHT/4.0)); if( radarSize >= 1 ) { if(sprite->GetID() == Hud::GetTarget() && Timer::GetTicks() % 1000 < 100) Video::DrawCircle( blip, radarSize, 2, WHITE ); else Video::DrawCircle( blip, radarSize, 1, sprite->GetRadarColor() ); } else { if(sprite->GetID() == Hud::GetTarget() && Timer::GetTicks() % 1000 < 100) Video::DrawCircle( blip, 1, 2, WHITE ); else Video::DrawPoint( blip, sprite->GetRadarColor() ); } } delete spriteList; }
void GameWorld::SetMessageFromInput(UINT msg, int x, int y) { char szMessage[MsgLen]={0}; char szDebugMessage[DebugMsgLen]={0}; sprintf((char *)szDebugMessage,"click X:%d Y:%d",x,y); SetWindowText(hwnd_window,szDebugMessage); x += ViewportPos_x; y += ViewportPos_y; switch (msg) { case WM_LBUTTONDOWN: if (spMainRole->AnimationBegin() || spMainRole->GetAction() == STAND) { FixToGrid(spMainRole, x, y); Sprite* pTarget = haveSprite(x, y); //typeid, id, statu, action, targetTypeID, targetid, x, y if (pTarget) { sprintf(szMessage, "%d,%d,%d,%d,%d,%d,%d,%d", spMainRole->GetTypeID() ,spMainRole->GetID(), spMainRole->GetStatu(), ATTACK, pTarget->GetTypeID(), pTarget->GetID(), x, y); } else { sprintf(szMessage, "%d,%d,%d,%d,%d,%d,%d,%d", spMainRole->GetTypeID(), spMainRole->GetID(), spMainRole->GetStatu(), WALK, 0, 0, x, y); } } break; default: break; } SendMsg(szMessage); }