aboutsummaryrefslogtreecommitdiff
path: root/src/games/tetris/Tetris.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/games/tetris/Tetris.cpp')
-rw-r--r--src/games/tetris/Tetris.cpp109
1 files changed, 59 insertions, 50 deletions
diff --git a/src/games/tetris/Tetris.cpp b/src/games/tetris/Tetris.cpp
index aeb0c99..2413dd1 100644
--- a/src/games/tetris/Tetris.cpp
+++ b/src/games/tetris/Tetris.cpp
@@ -23,8 +23,9 @@ int32_to_u32string(int32_t value)
Tetris::Tetris()
: m_font{s_dejavu_sans_mono_filepath, 22}
, m_active_tetromino{m_board.m_bitmap}
+ , m_highscore {ReadHighscore()}
{
- m_frame_strings.reserve(s_frame_strings_capcity);
+ m_frame_strings.reserve(s_frame_strings_capacity);
}
void
@@ -84,7 +85,6 @@ Tetris::Update(std::vector<SDL_Event>& events)
}
}
- assert(m_frame_strings.capacity() == s_frame_strings_capcity);
if (m_game_status == game_exit) {
return false;
@@ -93,6 +93,9 @@ Tetris::Update(std::vector<SDL_Event>& events)
Draw();
+ assert((float)m_frame_strings.size() <= 0.8f * s_frame_strings_capacity);
+
+
return true;
}
@@ -145,9 +148,13 @@ Tetris::HandleTetrominoPlacement()
m_active_tetromino.Reset(m_next_tetromino_id);
m_next_tetromino_id = Tetromino::GenerateRandomId();
+
if (m_active_tetromino.IsCollisionWithBoard()) {
- HandleGameOver();
- return;
+ m_game_status = game_over;
+ if (m_score > m_highscore) {
+ m_highscore = m_score;
+ WriteHighscore();
+ }
}
@@ -199,38 +206,31 @@ Tetris::GetSoftdropCount(float dt)
return softdrop_count;
}
-void
-Tetris::HandleGameOver()
+int32_t
+Tetris::ReadHighscore()
{
- m_game_status = game_over;
- const char* filepath = "tetris_highscore.txt";
int32_t highscore = 0;
-
-
- std::ifstream highscore_file_in { filepath };
+ std::ifstream highscore_file_in {s_tetris_highscore_path};
if (highscore_file_in) {
highscore_file_in >> highscore;
highscore_file_in.close();
}
else {
- SDL_LogInfo(0, "Tetris: cannot open tetris_highscore.txt for reading");
+ SDL_LogInfo(0, "Tetris: cannot open %s for reading", s_tetris_highscore_path);
}
+ return highscore;
+}
- if (highscore > 0 && highscore > m_highscore) {
- m_highscore = highscore;
+void
+Tetris::WriteHighscore()
+{
+ std::ofstream highscore_file_out {s_tetris_highscore_path};
+ if (highscore_file_out) {
+ highscore_file_out << m_highscore << std::endl;
+ highscore_file_out.close();
}
-
-
- if (m_score > m_highscore) {
- m_highscore = m_score;
- std::ofstream highscore_file_out { filepath };
- if (highscore_file_out) {
- highscore_file_out << m_highscore << std::endl;
- highscore_file_out.close();
- }
- else {
- SDL_LogInfo(0, "Tetris: cannot open tetris_highscore.txt for writing");
- }
+ else {
+ SDL_LogInfo(0, "Tetris: cannot open %s for writing", s_tetris_highscore_path);
}
}
@@ -293,11 +293,11 @@ Tetris::DrawLineCounter()
void
Tetris::DrawStatistics()
{
- V2F32 pos = {0.4f, 0.5f};
+ V3F32 pos = {0.4f, 0.5f, s_text_z};
static std::u32string title_text = U"Statistics";
- V3F32 title_pos = {pos.x + 0.02f, pos.y + 1.64f, s_text_z};
+ V3F32 title_pos = {pos.x + 0.02f, pos.y + 1.64f, pos.z};
g_renderer.PushText(title_text, m_font, title_pos, s_text_color);
@@ -358,42 +358,51 @@ Tetris::DrawStatistics()
void
Tetris::DrawScore()
{
- V2F32 view_pos = {3.0f, 2.2f};
- ImVec2 screen_pos = g_renderer.ViewPosToScreenPosImGui(view_pos);
+ V3F32 pos = {3.0f, 2.6f, s_text_z};
- ImGui::SetNextWindowPos(screen_pos);
- ImGui::Begin("TetrisScore", nullptr, s_imgui_window_flags_default);
- ImGui::Text("Score");
- ImGui::Text("%d", m_score);
- ImGui::End();
+
+ std::u32string& top_label = m_frame_strings.emplace_back(U"Top");
+ std::u32string& top_value = m_frame_strings.emplace_back(int32_to_u32string(m_highscore));
+
+ std::u32string& score_label = m_frame_strings.emplace_back(U"Score");
+ std::u32string& score_value = m_frame_strings.emplace_back(int32_to_u32string(m_score));
+
+
+ g_renderer.PushText(top_label, m_font, pos, s_text_color);
+ pos.y -= 0.1f;
+ g_renderer.PushText(top_value, m_font, pos, s_text_color);
+ pos.y -= 0.2f;
+
+ g_renderer.PushText(score_label, m_font, pos, s_text_color);
+ pos.y -= 0.1f;
+ g_renderer.PushText(score_value, m_font, pos, s_text_color);
}
void
Tetris::DrawNextTetromino()
{
- V2F32 text_view_pos = {3.0f, 1.8f};
- ImVec2 text_screen_pos = g_renderer.ViewPosToScreenPosImGui(text_view_pos);
+ V3F32 pos = {3.0f, 1.4f, s_text_z};
- ImGui::SetNextWindowPos(text_screen_pos);
- ImGui::Begin("TetrisNextTetromino", nullptr, s_imgui_window_flags_default);
- ImGui::Text("Next");
- ImGui::End();
+ V3F32 label_pos = {pos.x, pos.y + 0.4f, pos.z};
+ std::u32string& label_text = m_frame_strings.emplace_back(U"Next:");
+ g_renderer.PushText(label_text, m_font, label_pos, s_text_color);
- V2F32 tetromino_view_pos = {3.0, 1.4f};
- Tetromino::Draw(m_next_tetromino_id, 0, tetromino_view_pos, 0.5f);
+
+ V2F32 tetromino_pos = {pos.x, pos.y};
+ Tetromino::Draw(m_next_tetromino_id, 0, tetromino_pos, 0.5f);
}
void
Tetris::DrawLevel()
{
- V2F32 view_pos = {3.0f, 1.2f};
- ImVec2 screen_pos = g_renderer.ViewPosToScreenPosImGui(view_pos);
+ V3F32 pos = {3.0f, 1.1f};
- ImGui::SetNextWindowPos(screen_pos);
- ImGui::Begin("TetrisLevel", nullptr, s_imgui_window_flags_default);
- ImGui::Text("Level");
- ImGui::Text("%d", m_level);
- ImGui::End();
+ std::u32string& label = m_frame_strings.emplace_back(U"Level");
+ g_renderer.PushText(label, m_font, pos, s_text_color);
+ pos.y -= 0.1f;
+
+ std::u32string& level = m_frame_strings.emplace_back(int32_to_u32string(m_level));
+ g_renderer.PushText(level, m_font, pos, s_text_color);
}