void TileMap::Render( int OffsetX, int OffsetY, float ScaleX, float ScaleY ) { // Prevent non-graphical tilemaps from drawing if( tileGraphics == 0 ) { return; } float scaledTileW = tileWidth * ScaleX; float scaledTileH = tileHeight * ScaleY; int startX = OffsetX / scaledTileW; int startY = OffsetY / scaledTileH; int endX = startX + (DISPLAY->GetWidth() / scaledTileW) + 1; int endY = startY + (DISPLAY->GetHeight() / scaledTileH) + 1; al_hold_bitmap_drawing( true ); for( int ty = startY; ty <= endY; ty++ ) { if( ty >= height ) { break; } int actualy = (ty * scaledTileH) - OffsetY; for( int tx = startX; tx <= endX; tx++ ) { if( tx >= width ) { break; } int actualx = (tx * scaledTileW) - OffsetX; int tileIdx = tileData[ (ty * width) + tx ]; if( tileIdx < 0 ) { // Draw Animated Tile int animidx = (tileIdx * -1) - 1; if( animidx < (int)tileAnimations.size() ) { Animation* a = tileAnimations.at( animidx ); a->SetScale( ScaleX, ScaleY ); a->DrawFrame( actualx, actualy ); } } else { // Draw Normal Tile tileGraphics->DrawSprite( tileIdx, actualx, actualy, ScaleX, ScaleY, 0 ); } } } al_hold_bitmap_drawing( false ); }
void World::Render() { City* c; Animation* a; int tileScaleW = visualMap->GetTileWidth() * visualMapScale->X; int tileScaleH = visualMap->GetTileHeight() * visualMapScale->Y; int tileCentreX; int tileCentreY; visualMap->Render( 0, 0, visualMapScale->X, visualMapScale->Y ); // Draw shadow for( std::vector<City*>::iterator ci = Cities.begin(); ci != Cities.end(); ci++ ) { c = (City*)(*ci); tileCentreX = (c->MapPosition->X * tileScaleW) + (tileScaleW / 2); tileCentreY = (c->MapPosition->Y * tileScaleH) + (tileScaleH / 2); al_draw_filled_ellipse( tileCentreX, tileCentreY, (tileScaleW / 1.5), (tileScaleH / 4), al_map_rgba( 0, 0, 0, 128 ) ); } if( !IsBetweenTurns ) { for( int li = 0; li < Cities.at(AgentWillis->CurrentCity)->LinkedCityNumbers.size(); li++ ) { Vector2* la = Cities.at(AgentWillis->CurrentCity)->MapPosition; Vector2* lb = Cities.at(Cities.at(AgentWillis->CurrentCity)->LinkedCityNumbers.at(li))->MapPosition; al_draw_line( (la->X * tileScaleW) + (tileScaleW / 2), (la->Y * tileScaleH) + (tileScaleH / 2), (lb->X * tileScaleW) + (tileScaleW / 2), (lb->Y * tileScaleH) + (tileScaleH / 2), al_map_rgba( 0, 0, 0, 64 ), 3.0f ); } // Draw Navigation Lines if( visualNavigationLineIndex > 0 ) { Line* l = new Line( Cities.at(AgentWillis->CurrentCity)->MapPosition, Cities.at(AgentWillis->TargetCity)->MapPosition ); Vector2* segA = l->GetSegmentPoint( visualNavigationLineIndex, WORLD_NAVIGATION_LINE_SEGMENTS ); Vector2* segB = l->GetSegmentPoint( visualNavigationLineIndex - 1, WORLD_NAVIGATION_LINE_SEGMENTS ); segA->X = (segA->X * tileScaleW) + (tileScaleW / 2); segA->Y = (segA->Y * tileScaleH) + (tileScaleH / 2); segB->X = (segB->X * tileScaleW) + (tileScaleW / 2); segB->Y = (segB->Y * tileScaleH) + (tileScaleH / 2); al_draw_line( segA->X, segA->Y, segB->X, segB->Y, al_map_rgba( 255, 240, 64, 192 ), 3.0f ); } } // Draw Weather Indicator for( std::vector<City*>::iterator ci = Cities.begin(); ci != Cities.end(); ci++ ) { c = (City*)(*ci); a = WeatherAnimations.at( c->WeatherCondition ); tileCentreX = (c->MapPosition->X * tileScaleW) + (tileScaleW / 2); tileCentreY = (c->MapPosition->Y * tileScaleH) + (tileScaleH / 2); a->DrawFrame( tileCentreX - (visualSprites->GetFrame(0)->Width / 2), tileCentreY - visualSprites->GetFrame(0)->Height); } ProfessorFrost->WorldRender(); AgentWillis->WorldRender(); al_draw_filled_rectangle( 0, FRAMEWORK->Display_GetHeight() - (textFontHeight * 3), FRAMEWORK->Display_GetWidth(), FRAMEWORK->Display_GetHeight(), al_map_rgb( 0, 0, 0 ) ); int curY = FRAMEWORK->Display_GetHeight() - (textFontHeight * 3); int tmpX = (FRAMEWORK->Display_GetWidth() / 2) + 20; al_draw_text( textFont, al_map_rgb( 255, 255, 0 ), 20, curY, 0, Cities.at( AgentWillis->CurrentCity )->Name->c_str() ); al_draw_text( textFont, al_map_rgb( 255, 255, 0 ), tmpX, curY, 0, Cities.at( AgentWillis->TargetCity )->Name->c_str() ); curY += textFontHeight; al_draw_textf( textFont, al_map_rgb( 255, 255, 0 ), 20, curY, 0, "Population: %d", (int)(Cities.at( AgentWillis->CurrentCity )->Population * 1000.0) ); al_draw_textf( textFont, al_map_rgb( 255, 255, 0 ), tmpX, curY, 0, "Population: %d", (int)(Cities.at( AgentWillis->TargetCity )->Population * 1000.0) ); curY += textFontHeight; }