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
|
use fmt;
use os;
use sdl2::{event_type, window_flags, renderer_flags};
use sdl2;
use sdl2::image;
use strings;
type state = struct {
hare: *sdl2::texture,
cat: *sdl2::texture,
hare_x: int,
hare_y: int,
cat_x: int,
cat_y: int,
};
export fn main() void = {
sdl2::init(sdl2::init_flags::VIDEO);
defer sdl2::quit();
let flags = image::init(image::init_flags::PNG | image::init_flags::JPG);
defer image::quit();
const title = strings::to_c("Hare SDL2 demo");
defer free(title);
const win = match (sdl2::create_window(title,
sdl2::WINDOWPOS_UNDEFINED, sdl2::WINDOWPOS_UNDEFINED,
640, 480, window_flags::NONE)) {
case let win: *sdl2::window =>
yield win;
case null =>
fmt::fatal("sdl2::create_window failed");
};
defer sdl2::destroy_window(win);
const render = match (sdl2::create_renderer(win, -1, renderer_flags::NONE)) {
case let rend: *sdl2::renderer =>
yield rend;
case null =>
fmt::fatal("sdl2::create_renderer failed");
};
defer sdl2::destroy_renderer(render);
let state = state {
hare = {
const path = strings::to_c("mascot.jpg");
defer free(path);
yield match (image::load_texture(render, path)) {
case let tex: *sdl2::texture =>
yield tex;
case null =>
fmt::fatal("sdl2::image::load_texture failed for mascot.jpg");
};
},
cat = {
const path = strings::to_c("cat.png");
defer free(path);
yield match (image::load_texture(render, path)) {
case let tex: *sdl2::texture =>
yield tex;
case null =>
fmt::fatal("sdl2::image::load_texture failed for cat.png");
};
},
hare_x = 100,
hare_y = 100,
...
};
defer sdl2::destroy_texture(state.hare);
defer sdl2::destroy_texture(state.cat);
draw_frame(&state, render);
let ev = sdl2::event { ... };
for (sdl2::wait_event(&ev) == 1) {
switch (ev.event_type) {
case event_type::QUIT =>
break;
case => void;
};
};
os::exit(0); // https://todo.sr.ht/~sircmpwn/hare/525
};
fn draw_frame(state: *state, render: *sdl2::renderer) void = {
sdl2::set_render_draw_color(render, 50, 50, 50, 255);
sdl2::render_clear(render);
draw_tex(render, state.cat, state.cat_x, state.cat_y);
draw_tex(render, state.hare, state.hare_x, state.hare_y);
sdl2::render_present(render);
};
fn draw_tex(
render: *sdl2::renderer,
tex: *sdl2::texture,
x: int,
y: int,
) void = {
let width = 0, height = 0;
sdl2::query_texture(tex, null, null, &width, &height);
sdl2::render_copy(render, tex, null, &sdl2::rect {
x = x,
y = y,
w = width,
h = height,
});
};
|