[C++] 258 SDL : 暫定順位を表示 Tetris

[M1 Mac, Monterey 12.6.3, clang 13.0.0, SDL 2.26.2, ChatGPT Plus, NO IDE]

テトリスをプレイ中に暫定順位(画面左下のCurrent Rank)を表示するようにしました。

これでベストテン入りにどれくらい近づいているかが分かるようになります。

ゲームアプリでは時間軸というファクターが加わり繰り返し演算し続けるため、これに巻き込まれないように計算しないと変数が知らぬ間に加算されたりします。

C++版の完成度が上がってきたので、そろそろiOS版の製作に着手します。

紫テトロミノの回転が間に合っていたら単独2位だった
int m_score;
int numAllScores;
int rank;
vector<int> scores;
vector<int> allScores;
vector<string> dates;
vector<string> times;

struct Entry {
    int score;
    string date;
	string playTime;
};

void makeRanking(){
	// 暫定順位算出
	allScores.push_back(m_score);
	sort(allScores.begin(), allScores.end(), std::greater<int>());
	numAllScores = allScores.size();

	for (int i = 0; i < allScores.size(); ++i) {
		if (allScores[i] == m_score) {
			rank = i + 1;
			printf("現在順位: %d / %d\n", rank, numAllScores);
			break;
		}
		++rank;
	}

	allScores.pop_back();
}

int TetroTypeGenerator()
{	
	int tetroType;

	if (GeneratorCount == 0){
		arr = {0, 1, 2, 3, 4, 5, 6};
	}

	while(1){
		tetroType = rand() % kNumTetrominoTypes;

		if (arr.size() == 0){
			arr = {0, 1, 2, 3, 4, 5, 6};
			cout << "テトロミノ配列が空になったのでリセットしました" << endl;
		} else if (arr.size() == 1){
			tetroType = arr.front();
			arr = {};

			cout << "tetroType残り1: " << to_string(tetroType) << endl;
			makeRanking();

			GeneratorCount++;
			return tetroType;
		}

		for (auto it = arr.begin(); it != arr.end(); ) {
			if (*it == tetroType) {
				it = arr.erase(it);

				cout << "tetroType: " << to_string(tetroType) << endl;
				makeRanking();

				GeneratorCount++;
				return tetroType;

			} else {
				it++;
			}
		}
	}
}

int GetScoreAndDate() {
	vector<Entry> entries = ReadCSV(csvFile);
	allScores = {};

    // スコアで降順ソート
    sort(entries.begin(), entries.end(),
              [](const Entry& a, const Entry& b) { return a.score > b.score; });

	// 全スコアのvector作成
	for (const auto& entry : entries) {
		allScores.push_back(entry.score);
		// cout << entry.score << " : " << entry.date << " : " << entry.playTime << std::endl;
	}

    // 上位10件を取得して、スコアと日付をvectorに格納
    for (int i = 0; i < std::min(10, static_cast<int>(entries.size())); ++i) {
        scores.push_back(entries[i].score);
        string date = entries[i].date;
		replace(date.begin(), date.end(), '-', '/');
		dates.push_back(date.substr(5, 5));
    }

    return 0;
}

void Game::DrawPlaying( Renderer& renderer )
{
<中略>

snprintf( text, sizeof(text), "Current Rank: %s / %s", to_string(rank).c_str(), to_string(numAllScores).c_str());
renderer.DrawText( text, 20, 530, mFont, 0xffffffff);

<以下略>
}

[C++] 257 SDL : フォントサイズを変えてレンダリング Tetris

[M1 Mac, Monterey 12.6.3, clang 13.0.0, SDL 2.26.2, ChatGPT Plus, NO IDE]

テトリスSDL版のベストスコア6〜10位についてフォントサイズを小さくして表示できるようDrawText関数にフォントの引数を追加しました。

TTF_Font*	mFont;
TTF_Font*	mFont2;

Renderer::Renderer内
int defaultFontSize = 32;
int smallFontSize = 24;
mFont = TTF_OpenFont( "clacon2.ttf", defaultFontSize );
mFont2 = TTF_OpenFont( "clacon2.ttf", smallFontSize );

void Renderer::DrawText( const char* text, int x, int y, TTF_Font* font, uint32_t rgba /*= 0xffffffff */ )
{
	SDL_assert( text );
	SDL_Color color = MakeSDL_Colour( rgba );
	SDL_Surface* pSurface = TTF_RenderUTF8_Solid(font, text, color);
	
	SDL_Texture* pTexture = SDL_CreateTextureFromSurface( m_pSdlRenderer, pSurface );
	int width, height;
	SDL_QueryTexture(pTexture, NULL, NULL, &width, &height);
	SDL_Rect dstRect = { x, y, width, height };
	SDL_RenderCopy( m_pSdlRenderer, pTexture, nullptr, &dstRect );
	SDL_DestroyTexture( pTexture );
	SDL_FreeSurface( pSurface );
}