/* * DrawScreen * * This does a lot of work. It draws the background and * all the units, as well as the radar. This routine is * essentially the main loop that gets called by the * timer every update frequency. */ void DrawScreen (GdkPixmap *pixmap, GtkWidget *drawing_area) { /* --- Move player based on keys pressed --- */ HandleKeysPressed (); /* --- Get the screen width --- */ nScreenWidth = drawing_area->allocation.width; /* --- Figure out the offset of the player --- */ CalculateAdjustments (drawing_area); /* --- clear pixmap (background image) --- */ gdk_draw_rectangle (pixmap, drawing_area->style->black_gc, TRUE, 0, 0, drawing_area->allocation.width, drawing_area->allocation.height); /* --- Draw top border and radar screen --- */ gdk_draw_line (pixmap, drawing_area->style->white_gc, 0, RADAR_HEIGHT, drawing_area->allocation.width, RADAR_HEIGHT); /* --- Oh those high peaks --- */ DrawMountains (pixmap, drawing_area, drawing_area->allocation.height - 65, drawing_area->allocation.height - BOTTOM_HEIGHT); /* --- Draw the characters --- */ DrawAllUnits (pixmap, drawing_area); /* --- Draw the units on the radar --- */ DrawRadar (pixmap, drawing_area); /* --- Look for collisions --- */ CollisionCheck (); /* --- Clean up those that got destroyed --- */ FreeDestroyedUnits (); }
// Draw player's score, health etc. static void DrawPlayerStatus( HUD *hud, const PlayerData *data, const TActor *p, const int flags, const Rect2i r) { if (p != NULL) { DrawObjectiveCompass( hud->device, Vec2iFull2Real(p->Pos), r, hud->showExit); } Vec2i pos = Vec2iNew(5, 5); FontOpts opts = FontOptsNew(); if (flags & HUDFLAGS_PLACE_RIGHT) { opts.HAlign = ALIGN_END; } if (flags & HUDFLAGS_PLACE_BOTTOM) { opts.VAlign = ALIGN_END; pos.y += BOTTOM_PADDING; } opts.Area = gGraphicsDevice.cachedConfig.Res; opts.Pad = pos; FontStrOpt(data->name, Vec2iZero(), opts); const int rowHeight = 1 + FontH(); pos.y += rowHeight; char s[50]; if (IsScoreNeeded(gCampaign.Entry.Mode)) { if (ConfigGetBool(&gConfig, "Game.Ammo")) { // Display money instead of ammo sprintf(s, "Cash: $%d", data->score); } else { sprintf(s, "Score: %d", data->score); } } else { s[0] = 0; } if (p) { // Score/money opts.Pad = pos; FontStrOpt(s, Vec2iZero(), opts); // Health pos.y += rowHeight; DrawHealth(hud->device, p, pos, opts.HAlign, opts.VAlign); // Lives pos.y += rowHeight; DrawLives(hud->device, data, pos, opts.HAlign, opts.VAlign); // Weapon pos.y += rowHeight + LIVES_ROW_EXTRA_Y; DrawWeaponStatus(hud, p, pos, opts.HAlign, opts.VAlign); } else { opts.Pad = pos; FontStrOpt(s, Vec2iZero(), opts); } if (ConfigGetBool(&gConfig, "Interface.ShowHUDMap") && !(flags & HUDFLAGS_SHARE_SCREEN) && IsAutoMapEnabled(gCampaign.Entry.Mode)) { DrawRadar(hud->device, p, RADAR_SCALE, flags, hud->showExit); } }
void GameMainScene::Render() { glPushAttrib(GL_ALL_ATTRIB_BITS); { //ビューポートの設定 const int width = oka::Screen::GetInstance()->GetWidth(); const int height = oka::Screen::GetInstance()->GetHeight(); glViewport(0, 0, width, height); if (nullptr != oka::CharacterManager::GetInstance()->GetPlayer()) { //カメラの注視点 glm::vec3 target = oka::CharacterManager::GetInstance()->GetPlayer()->m_transform.m_position; //攻撃を受けている際は注視点を揺らす const bool isHit = oka::CharacterManager::GetInstance()->GetPlayer()->GetIsHitAttack(); if (isHit) { glm::vec3 shake; std::random_device rnd; std::mt19937 mt(rnd()); std::uniform_int_distribution<> x(-1, 1); std::uniform_int_distribution<> y(-1, 1); std::uniform_int_distribution<> z(-1, 1); shake.x = x(mt); shake.y = y(mt); shake.z = z(mt); shake *= 0.02f; target += shake; } g_camera->SetTarget(target); const glm::vec3 toVec = oka::CharacterManager::GetInstance()->GetPlayer()->m_transform.m_myToVec; const glm::vec3 upVec = oka::CharacterManager::GetInstance()->GetPlayer()->m_transform.m_myUpVec; //カメラの座標 glm::vec3 pos; pos += upVec*3.0f; pos += target - (toVec * 8.0f); g_camera->SetPos(pos); //カメラの上 glm::vec3 up = g_camera->GetUp(); up = up + (upVec - up)*0.05f; up = glm::normalize(up); g_camera->SetUp(up); } g_camera->Perspective(); g_camera->SetViewMatrix(); g_camera->MultViewMatrix(); /* 光の位置 */ float light[] = { 0.0f, 1.0f, 0.0f, 0 }; glLightfv(GL_LIGHT0, GL_POSITION, light); //全オブジェクトの描画 auto itr = oka::GameManager::GetInstance()->m_gameObjects.begin(); auto end = oka::GameManager::GetInstance()->m_gameObjects.end(); while (itr != end) { itr->second->Draw(); itr++; } if (nullptr != oka::CharacterManager::GetInstance()->GetPlayer()) { oka::CharacterManager::GetInstance()->GetPlayer()->DrawTarget(); } glDisable(GL_LIGHTING); glDisable(GL_DEPTH_TEST); const float left = 0.0f; const float right = (float)oka::Screen::GetInstance()->GetWidth(); const float bottom = 0.0f; const float top = (float)oka::Screen::GetInstance()->GetHeight(); g_camera->Ortho(left, right, bottom, top, 1.0f, -1.0f); if (nullptr != oka::CharacterManager::GetInstance()->GetPlayer()) { bool isHit = oka::CharacterManager::GetInstance()->GetPlayer()->GetIsHitAttack(); //マスク if (isHit) { oka::Screen::GetInstance()->SetMask(glm::vec4(1.0f, 0.0f, 0.0f, 0.3f)); } oka::ScoreManager::GetInstance()->DrawScore(); oka::CharacterManager::GetInstance()->GetPlayer()->DrawRadarPos(); DrawGameTime(); DrawRadar(); auto itr = oka::CharacterManager::GetInstance()->GetCharacters()->begin(); auto end = oka::CharacterManager::GetInstance()->GetCharacters()->end(); while (itr != end) { (*itr)->DrawRadarPos(); itr++; } //操作方法 glColor3f(0.0f, 0.0f, 0.0f); oka::MyString::Draw("[Lstick]Control", glm::vec2(300.0f, 100.0f), glm::vec2(0.2f, 0.2f)); oka::MyString::Draw("[LB/RB]Roll", glm::vec2(500.0f, 100.0f), glm::vec2(0.2f, 0.2f)); oka::MyString::Draw("[A]Accel", glm::vec2(300.0f, 50.0f), glm::vec2(0.2f, 0.2f)); oka::MyString::Draw("[X]Shot", glm::vec2(400.0f, 50.0f), glm::vec2(0.2f, 0.2f)); oka::MyString::Draw("[Y]HomingShot", glm::vec2(500.0f, 50.0f), glm::vec2(0.2f, 0.2f)); } fps(); } glPopAttrib(); }