Exemplo n.º 1
0
/*
 * 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 ();
}
Exemplo n.º 2
0
// 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);
	}
}
Exemplo n.º 3
0
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();
}