1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
#include <isogfx/app.h>
#include <isogfx/isogfx.h>
#include <assert.h>
#include <stdbool.h>
#include <stdio.h>
static const int TILE_WIDTH = 64;
static const int TILE_HEIGHT = TILE_WIDTH / 2;
static const int WORLD_WIDTH = 20;
static const int WORLD_HEIGHT = 20;
static const TileDesc tile_set[] = {
{.type = TileFromColour,
.width = TILE_WIDTH,
.height = TILE_HEIGHT,
.colour = (Pixel){.r = 0x38, .g = 0x3b, .b = 0x46, .a = 0xff}},
{.type = TileFromColour,
.width = TILE_WIDTH,
.height = TILE_HEIGHT,
.colour = (Pixel){.r = 0xA5, .g = 0xb3, .b = 0xc0, .a = 0xff}},
{.type = TileFromColour,
.width = TILE_WIDTH,
.height = TILE_HEIGHT,
.colour = (Pixel){.r = 0xdc, .g = 0x76, .b = 0x84, .a = 0xff}},
};
typedef enum Colour {
Black,
White,
Red,
} Colour;
typedef struct IsoGfxAppState {
Tile red;
int xpick;
int ypick;
} IsoGfxAppState;
static void make_checkerboard(IsoGfx* iso, Tile black, Tile white) {
assert(iso);
for (int y = 0; y < isogfx_world_height(iso); ++y) {
for (int x = 0; x < isogfx_world_width(iso); ++x) {
const int odd_col = x & 1;
const int odd_row = y & 1;
const Tile value = (odd_row ^ odd_col) == 0 ? black : white;
isogfx_set_tile(iso, x, y, value);
}
}
}
static bool init(
IsoGfxAppState* state, IsoGfx* iso, int argc, const char** argv) {
assert(state);
assert(iso);
(void)argc;
(void)argv;
if (!isogfx_make_world(
iso, &(WorldDesc){
.tile_width = TILE_WIDTH,
.tile_height = TILE_HEIGHT,
.world_width = WORLD_WIDTH,
.world_height = WORLD_HEIGHT})) {
return false;
}
const Tile black = isogfx_make_tile(iso, &tile_set[Black]);
const Tile white = isogfx_make_tile(iso, &tile_set[White]);
state->red = isogfx_make_tile(iso, &tile_set[Red]);
make_checkerboard(iso, black, white);
return true;
}
static void shutdown(IsoGfxAppState* state, IsoGfx* iso) {
assert(state);
assert(iso);
}
static void update(IsoGfxAppState* state, IsoGfx* iso, double t, double dt) {
assert(state);
assert(iso);
(void)t;
(void)dt;
double mouse_x, mouse_y;
gfx_app_get_mouse_position(&mouse_x, &mouse_y);
isogfx_pick_tile(iso, mouse_x, mouse_y, &state->xpick, &state->ypick);
printf("Picked tile: (%d, %d)\n", state->xpick, state->ypick);
}
static void render(IsoGfxAppState* state, IsoGfx* iso) {
assert(state);
assert(iso);
isogfx_render(iso);
if ((state->xpick != -1) && (state->ypick != -1)) {
isogfx_draw_tile(iso, state->xpick, state->ypick, state->red);
}
}
int main(int argc, const char** argv) {
IsoGfxAppState state = {0};
iso_run(
argc, argv,
&(IsoGfxApp){
.state = &state,
.init = init,
.shutdown = shutdown,
.update = update,
.render = render,
});
return 0;
}
|