[C++]『ゲームプログラミングC++』Chapter02 Game::LoadData

引き続きGame.cppの読解です。

// 宇宙船、背景2枚の描画設定
void Game::LoadData(){ // Game::Initialize()内で実行
	// 宇宙船の設定
	mShip = new Ship(this);
	mShip->SetPosition(Vector2(100.0f, 384.0f)); // 位置は左側中央とする SetPositionはActorのメンバ関数
	mShip->SetScale(1.5f); // SetScaleはActorのメンバ関数

	// Actor tempをWindowの中心に設定 bgのowner
	Actor* temp = new Actor(this);
	temp->SetPosition(Vector2(512.0f, 384.0f));

	// BGSpriteComponent bgの設定(ownerはtemp,優先度100) 最背面の宇宙
	BGSpriteComponent* bg = new BGSpriteComponent(temp); // SpriteComponent, Componentを継承
	bg->SetScreenSize(Vector2(1024.0f, 768.0f)); // BGSpriteComponent独自のメンバ関数
	std::vector<SDL_Texture*> bgtexs = { // SDLテクスチャのvector配列を作成
		GetTexture("../Assets/Farback01.png"), // GetTextureはGameのメンバ関数
		GetTexture("../Assets/Farback02.png")
	};
	bg->SetBGTextures(bgtexs); // bgにSDLテクスチャをセット
	bg->SetScrollSpeed(-100.0f); // bgのスクロール速度を-100とする
	
	bg = new BGSpriteComponent(temp, 50); // 優先度50のbgを新たに作成 手前の星
	bg->SetScreenSize(Vector2(1024.0f, 768.0f));
	bgtexs = {
		GetTexture("../Assets/Stars.png"),
		GetTexture("../Assets/Stars.png")
	};
	bg->SetBGTextures(bgtexs);
	bg->SetScrollSpeed(-200.0f); // スクロール速度は倍の-200に設定
}

[C++]『ゲームプログラミングC++』Chapter02 Game::UpdateGame

学習経過のメモ書きです。進度チェック用なので私以外には意味のない記事でしょう。

サンプルコードをつぶさにチェックし意味を把握するという地味な作業です。日本語のコメントに書き換えまたは追加しています。

私にとっては新しい分野かつ英語ユーザーが書いたコード&コメントなのでこういった作業をしないとなかなか頭に定着しません。

まあのんびり取り組みます。

void Game::UpdateGame(){
	// 1コマ16ms経過するまでの処理(特になし)
	while (!SDL_TICKS_PASSED(SDL_GetTicks(), mTicksCount + 16)){
	}

	// 1ループ時間を算出
	float deltaTime = (SDL_GetTicks() - mTicksCount) / 1000.0f;
	if (deltaTime > 0.05f){
		deltaTime = 0.05f;
	}

	// SDL初期化からの経過時間
	mTicksCount = SDL_GetTicks();

	// ActorとComponentsのUpdate
	mUpdatingActors = true;
	for (auto actor : mActors){
		actor->Update(deltaTime); 
	}
	mUpdatingActors = false;

	// 保留ActorのmActorsへの追加
	for (auto pending : mPendingActors){
		mActors.emplace_back(pending);
	}
	mPendingActors.clear();

	// EDead状態ActorのdaadActorsへの追加
	std::vector<Actor*> deadActors;
	for (auto actor : mActors){
		if (actor->GetState() == Actor::EDead){
			deadActors.emplace_back(actor);
		}
	}

	// deadActorsのメモリ解放
	for (auto actor : deadActors){
		delete actor;
	}
}