mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 04:57:45 +00:00
2048: Tweak cell metrics
This makes the game look closer to the original. It also fixes a weird thing where cells were displayed in a wrong order (as if mirrored or something), and to accommodate for that keyboard actions were also mixed up. Now it's all working as intended.
This commit is contained in:
parent
2460980d2c
commit
70356429ae
2 changed files with 36 additions and 15 deletions
|
@ -213,6 +213,17 @@ static bool is_stalled(const TwentyFortyEightGame::State& state)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TwentyFortyEightGame::resize_event(GUI::ResizeEvent&)
|
||||||
|
{
|
||||||
|
int score_height = font().glyph_height() + 2;
|
||||||
|
|
||||||
|
constexpr float padding_ratio = 7;
|
||||||
|
m_padding = min(
|
||||||
|
width() / (m_columns * (padding_ratio + 1) + 1),
|
||||||
|
(height() - score_height) / (m_rows * (padding_ratio + 1) + 1));
|
||||||
|
m_cell_size = m_padding * padding_ratio;
|
||||||
|
}
|
||||||
|
|
||||||
void TwentyFortyEightGame::keydown_event(GUI::KeyEvent& event)
|
void TwentyFortyEightGame::keydown_event(GUI::KeyEvent& event)
|
||||||
{
|
{
|
||||||
auto& previous_state = m_states.last();
|
auto& previous_state = m_states.last();
|
||||||
|
@ -221,19 +232,19 @@ void TwentyFortyEightGame::keydown_event(GUI::KeyEvent& event)
|
||||||
switch (event.key()) {
|
switch (event.key()) {
|
||||||
case KeyCode::Key_A:
|
case KeyCode::Key_A:
|
||||||
case KeyCode::Key_Left:
|
case KeyCode::Key_Left:
|
||||||
new_state.board = transpose(slide_left(transpose(previous_state.board), successful_merge_score));
|
new_state.board = slide_left(previous_state.board, successful_merge_score);
|
||||||
break;
|
break;
|
||||||
case KeyCode::Key_D:
|
case KeyCode::Key_D:
|
||||||
case KeyCode::Key_Right:
|
case KeyCode::Key_Right:
|
||||||
new_state.board = transpose(reverse(slide_left(reverse(transpose(previous_state.board)), successful_merge_score)));
|
new_state.board = reverse(slide_left(reverse(previous_state.board), successful_merge_score));
|
||||||
break;
|
break;
|
||||||
case KeyCode::Key_W:
|
case KeyCode::Key_W:
|
||||||
case KeyCode::Key_Up:
|
case KeyCode::Key_Up:
|
||||||
new_state.board = slide_left(previous_state.board, successful_merge_score);
|
new_state.board = transpose(slide_left(transpose(previous_state.board), successful_merge_score));
|
||||||
break;
|
break;
|
||||||
case KeyCode::Key_S:
|
case KeyCode::Key_S:
|
||||||
case KeyCode::Key_Down:
|
case KeyCode::Key_Down:
|
||||||
new_state.board = reverse(slide_left(reverse(previous_state.board), successful_merge_score));
|
new_state.board = transpose(reverse(slide_left(reverse(transpose(previous_state.board)), successful_merge_score)));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
|
@ -310,25 +321,30 @@ void TwentyFortyEightGame::paint_event(GUI::PaintEvent&)
|
||||||
|
|
||||||
painter.draw_text(score_rect(), m_states.last().score_text, font(), Gfx::TextAlignment::TopLeft, palette().color(ColorRole::BaseText));
|
painter.draw_text(score_rect(), m_states.last().score_text, font(), Gfx::TextAlignment::TopLeft, palette().color(ColorRole::BaseText));
|
||||||
|
|
||||||
painter.translate(0, font().glyph_height() + 2);
|
int score_height = font().glyph_height() + 2;
|
||||||
|
|
||||||
constexpr size_t column_padding = 2, row_padding = 2;
|
Gfx::IntRect field_rect {
|
||||||
size_t column_offset = column_padding, row_offset = row_padding;
|
0,
|
||||||
float column_size = (height() - font().glyph_height() - 2 - column_padding) / m_columns, row_size = (width() - 2 * row_padding) / m_rows;
|
0,
|
||||||
|
static_cast<int>(m_padding + (m_cell_size + m_padding) * m_columns),
|
||||||
|
static_cast<int>(m_padding + (m_cell_size + m_padding) * m_rows)
|
||||||
|
};
|
||||||
|
field_rect.center_within({ 0, score_height, width(), height() - score_height });
|
||||||
|
painter.fill_rect(field_rect, Color::White);
|
||||||
|
|
||||||
for (auto column = 0; column < m_columns; ++column) {
|
for (auto column = 0; column < m_columns; ++column) {
|
||||||
for (auto row = 0; row < m_rows; ++row) {
|
for (auto row = 0; row < m_rows; ++row) {
|
||||||
auto rect = Gfx::IntRect(column_offset, row_offset, column_size - column_padding, row_size - row_padding);
|
auto rect = Gfx::IntRect {
|
||||||
painter.draw_rect(rect, Color::White);
|
field_rect.x() + m_padding + (m_cell_size + m_padding) * column,
|
||||||
|
field_rect.y() + m_padding + (m_cell_size + m_padding) * row,
|
||||||
|
m_cell_size,
|
||||||
|
m_cell_size,
|
||||||
|
};
|
||||||
auto entry = m_states.last().board[row][column];
|
auto entry = m_states.last().board[row][column];
|
||||||
painter.fill_rect(rect.shrunken(1, 1), color_for_entry(entry));
|
painter.fill_rect(rect, color_for_entry(entry));
|
||||||
if (entry > 0)
|
if (entry > 0)
|
||||||
painter.draw_text(rect, String::number(entry), font(), Gfx::TextAlignment::Center, palette().color(ColorRole::BaseText));
|
painter.draw_text(rect, String::number(entry), font(), Gfx::TextAlignment::Center, palette().color(ColorRole::BaseText));
|
||||||
|
|
||||||
column_offset += column_size;
|
|
||||||
}
|
}
|
||||||
column_offset = column_padding;
|
|
||||||
row_offset += row_size;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -46,6 +46,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TwentyFortyEightGame();
|
TwentyFortyEightGame();
|
||||||
|
virtual void resize_event(GUI::ResizeEvent&) override;
|
||||||
virtual void paint_event(GUI::PaintEvent&) override;
|
virtual void paint_event(GUI::PaintEvent&) override;
|
||||||
virtual void keydown_event(GUI::KeyEvent&) override;
|
virtual void keydown_event(GUI::KeyEvent&) override;
|
||||||
|
|
||||||
|
@ -60,5 +61,9 @@ private:
|
||||||
u32 m_starting_tile { 2 };
|
u32 m_starting_tile { 2 };
|
||||||
size_t m_current_turn { 0 };
|
size_t m_current_turn { 0 };
|
||||||
|
|
||||||
|
|
||||||
|
float m_padding { 0 };
|
||||||
|
float m_cell_size { 0 };
|
||||||
|
|
||||||
Vector<State, 16> m_states;
|
Vector<State, 16> m_states;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue