Fix 1-bit bitmap rendering and add player turn modal
This commit is contained in:
@@ -484,11 +484,11 @@ void LowLevelRenderer::draw_arc(int center_x, int center_y, int radius, int star
|
||||
|
||||
void LowLevelRenderer::draw_bitmap(const unsigned char* bitmap, int x, int y, int width, int height, bool invert)
|
||||
{
|
||||
int byteWidth = (width + 7) / 8; // Bitmaps are typically padded to the next full byte for each row
|
||||
for (int py = 0; py < height; ++py) {
|
||||
for (int px = 0; px < width; ++px) {
|
||||
int bit_index = py * width + px;
|
||||
int byte_index = bit_index / 8;
|
||||
int bit_offset = 7 - (bit_index % 8); // MSB first
|
||||
int byte_index = py * byteWidth + (px / 8);
|
||||
int bit_offset = 7 - (px % 8); // MSB first
|
||||
bool pixel_on = (bitmap[byte_index] & (1 << bit_offset)) != 0;
|
||||
if (invert) {
|
||||
pixel_on = !pixel_on;
|
||||
|
||||
67
games/monopoly/TurnModalGame.h
Normal file
67
games/monopoly/TurnModalGame.h
Normal file
@@ -0,0 +1,67 @@
|
||||
// TurnModalGame.h
|
||||
#pragma once
|
||||
#include "../../lib/game.h"
|
||||
#include "../../display/low_level_render.h"
|
||||
#include "../../display/low_level_gui.h"
|
||||
#include "input_manager.h"
|
||||
#include "player.h"
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
class TurnModalGame : public Game {
|
||||
Player* next_player;
|
||||
bool dismissed;
|
||||
|
||||
public:
|
||||
TurnModalGame(uint16_t width, uint16_t height, LowLevelRenderer* renderer, LowLevelGUI* gui, InputManager* input_manager, Player* next)
|
||||
: Game(width, height, renderer, gui, input_manager), next_player(next), dismissed(false) {}
|
||||
|
||||
void init() override { dismissed = false; }
|
||||
Type get_type() const override { return Type::MONOPOLY_TURN; }
|
||||
|
||||
bool update(const InputEvent& event) override {
|
||||
if (event.type == INPUT_BUTTON_1) {
|
||||
dismissed = true;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void draw() override {
|
||||
renderer->clear_buffer();
|
||||
|
||||
// Window background
|
||||
int cw = width / 6;
|
||||
int ch = height / 6;
|
||||
int ix = cw, iy = ch;
|
||||
int iw = width - 2 * cw, ih = height - 2 * ch;
|
||||
|
||||
renderer->draw_filled_rectangle(ix, iy, iw, ih, false, 0); // White background
|
||||
renderer->draw_rectangle(ix, iy, iw, ih, true, 2); // Border
|
||||
|
||||
// Header
|
||||
renderer->draw_filled_rectangle(ix + 2, iy + 2, iw - 4, 40, true, 1);
|
||||
renderer->set_text_color(false);
|
||||
renderer->draw_string_scaled(ix + (iw - (int)strlen("NEXT TURN") * 12) / 2, iy + 15, "NEXT TURN", 2);
|
||||
renderer->set_text_color(true);
|
||||
|
||||
// Player Name
|
||||
char buf[64];
|
||||
snprintf(buf, sizeof(buf), "%s", next_player->name);
|
||||
int name_len = (int)strlen(buf);
|
||||
renderer->draw_string_scaled(ix + (iw - name_len * 18) / 2, iy + 60, buf, 3);
|
||||
|
||||
// Message
|
||||
const char* msg = "IT'S YOUR TURN!";
|
||||
renderer->draw_string_scaled(ix + (iw - (int)strlen(msg) * 12) / 2, iy + 100, msg, 2);
|
||||
|
||||
const char* submsg = "Please hold the device";
|
||||
renderer->draw_string_scaled(ix + (iw - (int)strlen(submsg) * 6) / 2, iy + 130, submsg, 1);
|
||||
|
||||
// Prompt
|
||||
const char* prompt = "Press B to start";
|
||||
renderer->draw_string_scaled(ix + (iw - (int)strlen(prompt) * 6) / 2, iy + ih - 30, prompt, 1);
|
||||
}
|
||||
|
||||
bool is_dismissed() const { return dismissed; }
|
||||
};
|
||||
@@ -34,7 +34,8 @@ public:
|
||||
MONOPOLY_PROPERTY,
|
||||
MONOPOLY_BOARD,
|
||||
MONOPOLY_CHANCE,
|
||||
MONOPOLY_COMMUNITY_CHEST
|
||||
MONOPOLY_COMMUNITY_CHEST,
|
||||
MONOPOLY_TURN
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user