red_bird 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +13 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +23 -0
- data/LICENSE.txt +21 -0
- data/README.md +47 -0
- data/Rakefile +10 -0
- data/bin/setup +8 -0
- data/ext/red_bird/bird.c +15 -0
- data/ext/red_bird/bird.h +10 -0
- data/ext/red_bird/color.c +95 -0
- data/ext/red_bird/color.h +27 -0
- data/ext/red_bird/dynamic_sprite.c +163 -0
- data/ext/red_bird/dynamic_sprite.h +30 -0
- data/ext/red_bird/engine.c +354 -0
- data/ext/red_bird/engine.h +40 -0
- data/ext/red_bird/extconf.rb +9 -0
- data/ext/red_bird/font.c +94 -0
- data/ext/red_bird/font.h +26 -0
- data/ext/red_bird/input_device.c +100 -0
- data/ext/red_bird/input_device.h +15 -0
- data/ext/red_bird/keycode.c +42 -0
- data/ext/red_bird/keycode.h +12 -0
- data/ext/red_bird/loader.c +154 -0
- data/ext/red_bird/loader.h +54 -0
- data/ext/red_bird/main.c +38 -0
- data/ext/red_bird/main.h +12 -0
- data/ext/red_bird/palette.c +132 -0
- data/ext/red_bird/palette.h +23 -0
- data/ext/red_bird/rect.c +257 -0
- data/ext/red_bird/rect.h +20 -0
- data/ext/red_bird/render.c +130 -0
- data/ext/red_bird/render.h +25 -0
- data/ext/red_bird/sprite.c +130 -0
- data/ext/red_bird/sprite.h +27 -0
- data/ext/red_bird/text.c +212 -0
- data/ext/red_bird/text.h +31 -0
- data/ext/red_bird/texture.c +157 -0
- data/ext/red_bird/texture.h +33 -0
- data/ext/red_bird/texture_imp.cpp +49 -0
- data/ext/red_bird/texture_imp.hpp +29 -0
- data/ext/red_bird/timer.c +134 -0
- data/ext/red_bird/timer.h +25 -0
- data/lib/red_bird.rb +15 -0
- data/lib/red_bird/animation.rb +133 -0
- data/lib/red_bird/camera.rb +61 -0
- data/lib/red_bird/controller.rb +44 -0
- data/lib/red_bird/dynamic_sprite.rb +38 -0
- data/lib/red_bird/engine.rb +81 -0
- data/lib/red_bird/entity.rb +74 -0
- data/lib/red_bird/entity_collision.rb +31 -0
- data/lib/red_bird/input_device.rb +86 -0
- data/lib/red_bird/palette.rb +23 -0
- data/lib/red_bird/relative_entity.rb +95 -0
- data/lib/red_bird/sprite.rb +40 -0
- data/lib/red_bird/stage.rb +60 -0
- data/lib/red_bird/tile_map.rb +118 -0
- data/lib/red_bird/tile_set.rb +56 -0
- data/lib/red_bird/uibox.rb +143 -0
- data/lib/red_bird/version.rb +3 -0
- data/lib/red_bird/vertical_menu.rb +110 -0
- data/red_bird.gemspec +37 -0
- metadata +149 -0
data/ext/red_bird/font.h
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
#ifndef RED_BIRD_FONT_H
|
3
|
+
#define RED_BIRD_FONT_H 1
|
4
|
+
|
5
|
+
#include "main.h"
|
6
|
+
|
7
|
+
extern VALUE bird_cFont;
|
8
|
+
|
9
|
+
struct bird_font_data
|
10
|
+
{
|
11
|
+
TTF_Font *data;
|
12
|
+
};
|
13
|
+
|
14
|
+
VALUE
|
15
|
+
bird_alloc_font(VALUE klass);
|
16
|
+
|
17
|
+
VALUE
|
18
|
+
bird_cFont_initialize(VALUE self, VALUE file_path, VALUE size);
|
19
|
+
|
20
|
+
struct bird_font_data*
|
21
|
+
bird_cFont_get_data(VALUE self);
|
22
|
+
|
23
|
+
void
|
24
|
+
Init_red_bird_font(void);
|
25
|
+
|
26
|
+
#endif /* RED_BIRD_FONT_H */
|
@@ -0,0 +1,100 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
#include "input_device.h"
|
3
|
+
|
4
|
+
#include "engine.h"
|
5
|
+
|
6
|
+
VALUE bird_cInputDevice;
|
7
|
+
|
8
|
+
static VALUE sym_key_down;
|
9
|
+
static VALUE sym_key_up;
|
10
|
+
static VALUE sym_mouse_motion;
|
11
|
+
static VALUE sym_mouse_button_down;
|
12
|
+
static VALUE sym_mouse_button_up;
|
13
|
+
static VALUE sym_quit_game;
|
14
|
+
static VALUE sym_x;
|
15
|
+
static VALUE sym_y;
|
16
|
+
|
17
|
+
VALUE
|
18
|
+
bird_cInputDevice_get_events(VALUE self)
|
19
|
+
{
|
20
|
+
SDL_Event event;
|
21
|
+
int mouse_x;
|
22
|
+
int mouse_y;
|
23
|
+
|
24
|
+
VALUE type;
|
25
|
+
VALUE data;
|
26
|
+
VALUE x;
|
27
|
+
VALUE y;
|
28
|
+
|
29
|
+
rb_need_block();
|
30
|
+
|
31
|
+
// Get input
|
32
|
+
while(SDL_PollEvent(&event) != 0)
|
33
|
+
{
|
34
|
+
switch(event.type)
|
35
|
+
{
|
36
|
+
case SDL_KEYDOWN:
|
37
|
+
type = sym_key_down;
|
38
|
+
data = INT2NUM(event.key.keysym.sym);
|
39
|
+
break;
|
40
|
+
case SDL_KEYUP:
|
41
|
+
type = sym_key_up;
|
42
|
+
data = INT2NUM(event.key.keysym.sym);
|
43
|
+
break;
|
44
|
+
case SDL_MOUSEMOTION:
|
45
|
+
type = sym_mouse_motion;
|
46
|
+
SDL_GetMouseState(&mouse_x, &mouse_y);
|
47
|
+
x = INT2NUM(mouse_x);
|
48
|
+
y = INT2NUM(mouse_y);
|
49
|
+
data = rb_hash_new();
|
50
|
+
rb_hash_aset(data, sym_x, x);
|
51
|
+
rb_hash_aset(data, sym_y, y);
|
52
|
+
break;
|
53
|
+
case SDL_MOUSEBUTTONDOWN:
|
54
|
+
type = sym_mouse_button_down;
|
55
|
+
SDL_GetMouseState(&mouse_x, &mouse_y);
|
56
|
+
x = INT2NUM(mouse_x);
|
57
|
+
y = INT2NUM(mouse_y);
|
58
|
+
data = rb_hash_new();
|
59
|
+
rb_hash_aset(data, sym_x, x);
|
60
|
+
rb_hash_aset(data, sym_y, y);
|
61
|
+
break;
|
62
|
+
case SDL_MOUSEBUTTONUP:
|
63
|
+
type = sym_mouse_button_up;
|
64
|
+
SDL_GetMouseState(&mouse_x, &mouse_y);
|
65
|
+
x = INT2NUM(mouse_x);
|
66
|
+
y = INT2NUM(mouse_y);
|
67
|
+
data = rb_hash_new();
|
68
|
+
rb_hash_aset(data, sym_x, x);
|
69
|
+
rb_hash_aset(data, sym_y, y);
|
70
|
+
break;
|
71
|
+
case SDL_QUIT:
|
72
|
+
type = sym_quit_game;
|
73
|
+
data = Qnil;
|
74
|
+
break;
|
75
|
+
default:
|
76
|
+
continue;
|
77
|
+
}
|
78
|
+
|
79
|
+
rb_yield_values(2, type, data);
|
80
|
+
}
|
81
|
+
|
82
|
+
return self;
|
83
|
+
}
|
84
|
+
|
85
|
+
void
|
86
|
+
Init_red_bird_input_device(void)
|
87
|
+
{
|
88
|
+
sym_key_down = ID2SYM(rb_intern("key_down"));
|
89
|
+
sym_key_up = ID2SYM(rb_intern("key_up"));
|
90
|
+
sym_mouse_motion = ID2SYM(rb_intern("mouse_motion"));
|
91
|
+
sym_mouse_button_down = ID2SYM(rb_intern("mouse_button_down"));
|
92
|
+
sym_mouse_button_up = ID2SYM(rb_intern("mouse_button_up"));
|
93
|
+
sym_quit_game = ID2SYM(rb_intern("quit_game"));
|
94
|
+
sym_x = ID2SYM(rb_intern("x"));
|
95
|
+
sym_y = ID2SYM(rb_intern("y"));
|
96
|
+
|
97
|
+
bird_cInputDevice = rb_define_class_under(bird_m, "InputDevice", rb_cObject);
|
98
|
+
rb_define_protected_method(bird_cInputDevice, "get_events",
|
99
|
+
bird_cInputDevice_get_events, 0);
|
100
|
+
}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
#ifndef RED_BIRD_INPUT_DEVICE_H
|
3
|
+
#define RED_BIRD_INPUT_DEVICE_H 1
|
4
|
+
|
5
|
+
#include "main.h"
|
6
|
+
|
7
|
+
extern VALUE bird_cInputDevice;
|
8
|
+
|
9
|
+
VALUE
|
10
|
+
bird_cInputDevice_get_events(VALUE self);
|
11
|
+
|
12
|
+
void
|
13
|
+
Init_red_bird_input_device(void);
|
14
|
+
|
15
|
+
#endif /* RED_BIRD_INPUT_DEVICE_H */
|
@@ -0,0 +1,42 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
#include "keycode.h"
|
3
|
+
|
4
|
+
VALUE bird_mKeycode;
|
5
|
+
|
6
|
+
void
|
7
|
+
Init_red_bird_keycode(void)
|
8
|
+
{
|
9
|
+
bird_mKeycode = rb_define_module_under(bird_m, "Keycode");
|
10
|
+
|
11
|
+
rb_define_const(bird_mKeycode, "A", INT2NUM(SDLK_a));
|
12
|
+
rb_define_const(bird_mKeycode, "B", INT2NUM(SDLK_b));
|
13
|
+
rb_define_const(bird_mKeycode, "C", INT2NUM(SDLK_c));
|
14
|
+
rb_define_const(bird_mKeycode, "D", INT2NUM(SDLK_d));
|
15
|
+
rb_define_const(bird_mKeycode, "E", INT2NUM(SDLK_e));
|
16
|
+
rb_define_const(bird_mKeycode, "F", INT2NUM(SDLK_f));
|
17
|
+
rb_define_const(bird_mKeycode, "G", INT2NUM(SDLK_g));
|
18
|
+
rb_define_const(bird_mKeycode, "H", INT2NUM(SDLK_h));
|
19
|
+
rb_define_const(bird_mKeycode, "I", INT2NUM(SDLK_i));
|
20
|
+
rb_define_const(bird_mKeycode, "J", INT2NUM(SDLK_j));
|
21
|
+
rb_define_const(bird_mKeycode, "K", INT2NUM(SDLK_k));
|
22
|
+
rb_define_const(bird_mKeycode, "L", INT2NUM(SDLK_l));
|
23
|
+
rb_define_const(bird_mKeycode, "M", INT2NUM(SDLK_m));
|
24
|
+
rb_define_const(bird_mKeycode, "N", INT2NUM(SDLK_n));
|
25
|
+
rb_define_const(bird_mKeycode, "O", INT2NUM(SDLK_o));
|
26
|
+
rb_define_const(bird_mKeycode, "P", INT2NUM(SDLK_p));
|
27
|
+
rb_define_const(bird_mKeycode, "Q", INT2NUM(SDLK_q));
|
28
|
+
rb_define_const(bird_mKeycode, "R", INT2NUM(SDLK_r));
|
29
|
+
rb_define_const(bird_mKeycode, "S", INT2NUM(SDLK_s));
|
30
|
+
rb_define_const(bird_mKeycode, "T", INT2NUM(SDLK_t));
|
31
|
+
rb_define_const(bird_mKeycode, "U", INT2NUM(SDLK_u));
|
32
|
+
rb_define_const(bird_mKeycode, "V", INT2NUM(SDLK_v));
|
33
|
+
rb_define_const(bird_mKeycode, "W", INT2NUM(SDLK_w));
|
34
|
+
rb_define_const(bird_mKeycode, "X", INT2NUM(SDLK_x));
|
35
|
+
rb_define_const(bird_mKeycode, "Y", INT2NUM(SDLK_y));
|
36
|
+
rb_define_const(bird_mKeycode, "Z", INT2NUM(SDLK_z));
|
37
|
+
|
38
|
+
rb_define_const(bird_mKeycode, "KEY_UP", INT2NUM(SDLK_UP));
|
39
|
+
rb_define_const(bird_mKeycode, "KEY_DOWN", INT2NUM(SDLK_DOWN));
|
40
|
+
rb_define_const(bird_mKeycode, "KEY_LEFT", INT2NUM(SDLK_LEFT));
|
41
|
+
rb_define_const(bird_mKeycode, "KEY_RIGHT", INT2NUM(SDLK_RIGHT));
|
42
|
+
}
|
@@ -0,0 +1,154 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
#include <stdlib.h>
|
3
|
+
|
4
|
+
#include "loader.h"
|
5
|
+
|
6
|
+
static SDL_bool
|
7
|
+
LoaderStack_step_load(LoaderStack *self, int32_t step)
|
8
|
+
{
|
9
|
+
SDL_bool error = SDL_FALSE;
|
10
|
+
|
11
|
+
// Already loaded, nothing to do.
|
12
|
+
if(self->last_loaded >= step) return SDL_TRUE;
|
13
|
+
|
14
|
+
for(;self->last_loaded < step; self->last_loaded++)
|
15
|
+
{
|
16
|
+
error = !self->loaders[self->last_loaded].load(self->obj, self);
|
17
|
+
if(error) break;
|
18
|
+
}
|
19
|
+
|
20
|
+
// Self number will be one after the last loeaded after the loading loop is
|
21
|
+
// over.
|
22
|
+
self->last_loaded--;
|
23
|
+
|
24
|
+
if(error)
|
25
|
+
{
|
26
|
+
// Backward interaction to unload what was loaded.
|
27
|
+
for(;self->last_loaded >= 0; self->last_loaded--)
|
28
|
+
self->loaders[self->last_loaded].unload(self->obj, self);
|
29
|
+
self->last_loaded++;
|
30
|
+
}
|
31
|
+
|
32
|
+
return !error;
|
33
|
+
}
|
34
|
+
|
35
|
+
static void
|
36
|
+
LoaderStack_step_unload(LoaderStack *self, int32_t step)
|
37
|
+
{
|
38
|
+
// Already unloaded, nothing to do.
|
39
|
+
if(self->last_loaded <= step) return;
|
40
|
+
|
41
|
+
for(; self->last_loaded >= 0; self->last_loaded--)
|
42
|
+
self->loaders[self->last_loaded].unload(self->obj, self);
|
43
|
+
|
44
|
+
// Self number will be one before the last loeaded after the unloading loop
|
45
|
+
// is over.
|
46
|
+
self->last_loaded++;
|
47
|
+
|
48
|
+
self->is_loaded = SDL_FALSE;
|
49
|
+
}
|
50
|
+
|
51
|
+
void
|
52
|
+
LoaderStack_constructor(LoaderStack *self, void *obj)
|
53
|
+
{
|
54
|
+
self->is_loaded = SDL_FALSE;
|
55
|
+
self->last_loaded = 0;
|
56
|
+
|
57
|
+
self->loader_capacity = 10; // Totally arbitrary value.
|
58
|
+
self->loader_size = 0;
|
59
|
+
|
60
|
+
self->obj = obj;
|
61
|
+
|
62
|
+
self->error_message = 0;
|
63
|
+
|
64
|
+
self->loaders = malloc(sizeof(Loader) * self->loader_capacity);
|
65
|
+
}
|
66
|
+
|
67
|
+
void
|
68
|
+
LoaderStack_destructor(LoaderStack *self)
|
69
|
+
{
|
70
|
+
if(self->error_message != 0)
|
71
|
+
free(self->error_message);
|
72
|
+
|
73
|
+
if(self->is_loaded) LoaderStack_unload(self);
|
74
|
+
free(self->loaders);
|
75
|
+
}
|
76
|
+
|
77
|
+
void
|
78
|
+
LoaderStack_add(LoaderStack *self,
|
79
|
+
SDL_bool (*load)(void *obj, LoaderStack *ls),
|
80
|
+
void (*unload)(void *obj, LoaderStack *ls))
|
81
|
+
{
|
82
|
+
Loader *l;
|
83
|
+
uint32_t next_loader = self->loader_size;
|
84
|
+
|
85
|
+
// Expand if is full.
|
86
|
+
if(self->loader_size == self->loader_capacity)
|
87
|
+
{
|
88
|
+
self->loader_capacity += 5; // Totally arbitrary value.
|
89
|
+
self->loaders = realloc(self->loaders,
|
90
|
+
sizeof(Loader) * self->loader_capacity);
|
91
|
+
}
|
92
|
+
|
93
|
+
l = &(self->loaders[next_loader]);
|
94
|
+
l->load = load;
|
95
|
+
l->unload = unload;
|
96
|
+
|
97
|
+
self->loader_size++;
|
98
|
+
}
|
99
|
+
|
100
|
+
void
|
101
|
+
LoaderStack_set_error(LoaderStack *self, const char* base_error,
|
102
|
+
const char* current_error)
|
103
|
+
{
|
104
|
+
if(self->error_message != 0)
|
105
|
+
free(self->error_message);
|
106
|
+
|
107
|
+
if(current_error != NULL)
|
108
|
+
{
|
109
|
+
self->error_message =
|
110
|
+
malloc(strlen(base_error) + strlen(current_error) + 1);
|
111
|
+
|
112
|
+
strcpy(self->error_message, base_error);
|
113
|
+
strcat(self->error_message, current_error);
|
114
|
+
}
|
115
|
+
else
|
116
|
+
{
|
117
|
+
self->error_message = malloc(strlen(base_error));
|
118
|
+
|
119
|
+
strcpy(self->error_message, base_error);
|
120
|
+
}
|
121
|
+
}
|
122
|
+
|
123
|
+
SDL_bool
|
124
|
+
LoaderStack_load(LoaderStack *self)
|
125
|
+
{
|
126
|
+
if(self->is_loaded) return SDL_TRUE;
|
127
|
+
|
128
|
+
if(LoaderStack_step_load(self, self->loader_size))
|
129
|
+
{
|
130
|
+
self->is_loaded = SDL_TRUE;
|
131
|
+
return SDL_TRUE;
|
132
|
+
}
|
133
|
+
else
|
134
|
+
{
|
135
|
+
return SDL_FALSE;
|
136
|
+
}
|
137
|
+
}
|
138
|
+
|
139
|
+
SDL_bool
|
140
|
+
LoaderStack_reload(LoaderStack *self, int32_t step)
|
141
|
+
{
|
142
|
+
if(!self->is_loaded) return SDL_FALSE;
|
143
|
+
|
144
|
+
LoaderStack_step_unload(self, self->loader_size);
|
145
|
+
return LoaderStack_step_load(self, step);
|
146
|
+
}
|
147
|
+
|
148
|
+
void
|
149
|
+
LoaderStack_unload(LoaderStack *self)
|
150
|
+
{
|
151
|
+
if(!self->is_loaded) return;
|
152
|
+
|
153
|
+
LoaderStack_step_unload(self, 0);
|
154
|
+
}
|
@@ -0,0 +1,54 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
#ifndef RED_BIRD_LOADER_H
|
3
|
+
#define RED_BIRD_LOADER_H 1
|
4
|
+
|
5
|
+
#include "main.h"
|
6
|
+
|
7
|
+
struct LoaderStack_s;
|
8
|
+
|
9
|
+
typedef struct
|
10
|
+
{
|
11
|
+
SDL_bool (*load)(void *obj, struct LoaderStack_s *ls);
|
12
|
+
void (*unload)(void *obj, struct LoaderStack_s *ls);
|
13
|
+
} Loader;
|
14
|
+
|
15
|
+
struct LoaderStack_s
|
16
|
+
{
|
17
|
+
void *obj;
|
18
|
+
SDL_bool is_loaded;
|
19
|
+
int32_t last_loaded;
|
20
|
+
|
21
|
+
uint32_t loader_capacity;
|
22
|
+
uint32_t loader_size;
|
23
|
+
Loader *loaders;
|
24
|
+
|
25
|
+
char* error_message;
|
26
|
+
};
|
27
|
+
|
28
|
+
typedef struct LoaderStack_s LoaderStack;
|
29
|
+
|
30
|
+
void
|
31
|
+
LoaderStack_constructor(LoaderStack *self, void *obj);
|
32
|
+
|
33
|
+
void
|
34
|
+
LoaderStack_destructor(LoaderStack *self);
|
35
|
+
|
36
|
+
void
|
37
|
+
LoaderStack_add(LoaderStack *self,
|
38
|
+
SDL_bool (*load)(void *obj, LoaderStack *ls),
|
39
|
+
void (*unload)(void *obj, LoaderStack *ls));
|
40
|
+
|
41
|
+
void
|
42
|
+
LoaderStack_set_error(LoaderStack *self, const char* base_error,
|
43
|
+
const char* current_error);
|
44
|
+
|
45
|
+
SDL_bool
|
46
|
+
LoaderStack_load(LoaderStack *self);
|
47
|
+
|
48
|
+
SDL_bool
|
49
|
+
LoaderStack_reload(LoaderStack *self, int32_t step);
|
50
|
+
|
51
|
+
void
|
52
|
+
LoaderStack_unload(LoaderStack *self);
|
53
|
+
|
54
|
+
#endif /* RED_BIRD_LOADER_H */
|
data/ext/red_bird/main.c
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
2
|
+
#include "main.h"
|
3
|
+
|
4
|
+
#include "bird.h"
|
5
|
+
#include "color.h"
|
6
|
+
#include "dynamic_sprite.h"
|
7
|
+
#include "engine.h"
|
8
|
+
#include "font.h"
|
9
|
+
#include "keycode.h"
|
10
|
+
#include "input_device.h"
|
11
|
+
#include "palette.h"
|
12
|
+
#include "rect.h"
|
13
|
+
#include "render.h"
|
14
|
+
#include "sprite.h"
|
15
|
+
#include "texture.h"
|
16
|
+
#include "text.h"
|
17
|
+
#include "timer.h"
|
18
|
+
|
19
|
+
VALUE bird_m;
|
20
|
+
|
21
|
+
void
|
22
|
+
Init_red_bird(void)
|
23
|
+
{
|
24
|
+
Init_red_bird_module();
|
25
|
+
Init_red_bird_engine();
|
26
|
+
Init_red_bird_color();
|
27
|
+
Init_red_bird_dynamic_sprite();
|
28
|
+
Init_red_bird_font();
|
29
|
+
Init_red_bird_keycode();
|
30
|
+
Init_red_bird_input_device();
|
31
|
+
Init_red_bird_palette();
|
32
|
+
Init_red_bird_rect();
|
33
|
+
Init_red_bird_render();
|
34
|
+
Init_red_bird_sprite();
|
35
|
+
Init_red_bird_text();
|
36
|
+
Init_red_bird_texture();
|
37
|
+
Init_red_bird_timer();
|
38
|
+
}
|