Resolve macros and cleanup
This commit is contained in:
+264
-96
@@ -3,11 +3,39 @@
|
||||
|
||||
#include "app/app.h"
|
||||
|
||||
#warning "Define ==, eql?, hash for each class"
|
||||
#warning "Define and bind elements_at in Scene (same as click method already defined but without callback)"
|
||||
|
||||
namespace definitions {
|
||||
DEF_RB(
|
||||
Font,
|
||||
({ font_pool.release(id); }),
|
||||
({
|
||||
inline mrb_value wrap(mrb_state *mrb, RClass *cls, mrb_data_type *type, int id) {
|
||||
RBasic *obj_b = mrb_obj_alloc(mrb, MRB_TT_DATA, cls);
|
||||
mrb_value obj = mrb_obj_value(obj_b);
|
||||
|
||||
Wrapper *w = new Wrapper();
|
||||
w->id = id;
|
||||
|
||||
mrb_data_init(obj, w, type);
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
static void Font_free(mrb_state *mrb, void *ptr) {
|
||||
UNUSED(mrb);
|
||||
int id = ((Wrapper *)ptr)->id;
|
||||
font_pool.release(id);
|
||||
delete (Wrapper *)ptr;
|
||||
}
|
||||
|
||||
static const struct mrb_data_type Font_type = {"Font", Font_free};
|
||||
|
||||
static mrb_value Font_init(mrb_state *mrb, mrb_value self) {
|
||||
UNUSED(mrb);
|
||||
Wrapper *old = (Wrapper *)DATA_PTR(self);
|
||||
if (old)
|
||||
mrb_free(mrb, old);
|
||||
mrb_data_init(self, nullptr, &Font_type);
|
||||
Wrapper *s = new Wrapper();
|
||||
|
||||
char *path;
|
||||
mrb_int size;
|
||||
mrb_value kwargs;
|
||||
@@ -23,14 +51,36 @@ DEF_RB(
|
||||
HASH_BOOL(kwargs, italic, italic);
|
||||
HASH_BOOL(kwargs, underline, underline);
|
||||
}
|
||||
s->id = window.load_font(path, size, bold, italic, underline, pixel_art);
|
||||
})
|
||||
)
|
||||
|
||||
DEF_RB(
|
||||
Image,
|
||||
({ image_pool.release(id); }),
|
||||
({
|
||||
s->id = window.load_font(path, size, bold, italic, underline, pixel_art);
|
||||
|
||||
mrb_data_init(self, s, &Font_type);
|
||||
return self;
|
||||
}
|
||||
|
||||
inline int get_id_Font(mrb_state *mrb, mrb_value self) {
|
||||
Wrapper *wrapper;
|
||||
Data_Get_Struct(mrb, self, &Font_type, wrapper);
|
||||
return wrapper->id;
|
||||
}
|
||||
|
||||
static void Image_free(mrb_state *mrb, void *ptr) {
|
||||
UNUSED(mrb);
|
||||
int id = ((Wrapper *)ptr)->id;
|
||||
image_pool.release(id);
|
||||
delete (Wrapper *)ptr;
|
||||
}
|
||||
|
||||
static const struct mrb_data_type Image_type = {"Image", Image_free};
|
||||
|
||||
static mrb_value Image_init(mrb_state *mrb, mrb_value self) {
|
||||
UNUSED(mrb);
|
||||
Wrapper *old = (Wrapper *)DATA_PTR(self);
|
||||
if (old)
|
||||
mrb_free(mrb, old);
|
||||
mrb_data_init(self, nullptr, &Image_type);
|
||||
Wrapper *s = new Wrapper();
|
||||
|
||||
char *path;
|
||||
mrb_value kwargs;
|
||||
mrb_get_args(mrb, "z|H", &path, &kwargs);
|
||||
@@ -43,15 +93,36 @@ DEF_RB(
|
||||
}
|
||||
|
||||
s->id = window.load_image(path, alpha, pixel_art);
|
||||
})
|
||||
)
|
||||
|
||||
DEF_RB(
|
||||
Animation,
|
||||
({
|
||||
mrb_data_init(self, s, &Image_type);
|
||||
return self;
|
||||
}
|
||||
|
||||
inline int get_id_Image(mrb_state *mrb, mrb_value self) {
|
||||
Wrapper *wrapper;
|
||||
Data_Get_Struct(mrb, self, &Image_type, wrapper);
|
||||
return wrapper->id;
|
||||
}
|
||||
|
||||
static void Animation_free(mrb_state *mrb, void *ptr) {
|
||||
UNUSED(mrb);
|
||||
int id = ((Wrapper *)ptr)->id;
|
||||
animation_pool.release(id);
|
||||
}),
|
||||
({
|
||||
delete (Wrapper *)ptr;
|
||||
}
|
||||
|
||||
static const struct mrb_data_type Animation_type = {
|
||||
"Animation", Animation_free
|
||||
};
|
||||
|
||||
static mrb_value Animation_init(mrb_state *mrb, mrb_value self) {
|
||||
UNUSED(mrb);
|
||||
Wrapper *old = (Wrapper *)DATA_PTR(self);
|
||||
if (old)
|
||||
mrb_free(mrb, old);
|
||||
mrb_data_init(self, nullptr, &Animation_type);
|
||||
Wrapper *s = new Wrapper();
|
||||
|
||||
const mrb_value *frames_val;
|
||||
mrb_int frames_len;
|
||||
mrb_value kwargs;
|
||||
@@ -65,7 +136,11 @@ DEF_RB(
|
||||
for (mrb_int i = 0; i < frames_len; i++) {
|
||||
mrb_value frame_val = frames_val[i];
|
||||
if (!mrb_obj_is_kind_of(mrb, frame_val, mrb_class_get(mrb, "Image"))) {
|
||||
mrb_raise(mrb, mrb_class_get(mrb, "Exception"), "Expected an array of Image objects");
|
||||
mrb_raise(
|
||||
mrb,
|
||||
mrb_class_get(mrb, "Exception"),
|
||||
"Expected an array of Image objects"
|
||||
);
|
||||
return mrb_nil_value();
|
||||
}
|
||||
int frame_id = get_id_Image(mrb, frame_val);
|
||||
@@ -76,15 +151,36 @@ DEF_RB(
|
||||
Animation *animation = new Animation{frame_ids, fps, true};
|
||||
s->id = animation_pool.acquire(animation);
|
||||
animation_pool.use(s->id);
|
||||
})
|
||||
)
|
||||
|
||||
DEF_RB(
|
||||
ElementText,
|
||||
({
|
||||
mrb_data_init(self, s, &Animation_type);
|
||||
return self;
|
||||
}
|
||||
|
||||
inline int get_id_Animation(mrb_state *mrb, mrb_value self) {
|
||||
Wrapper *wrapper;
|
||||
Data_Get_Struct(mrb, self, &Animation_type, wrapper);
|
||||
return wrapper->id;
|
||||
}
|
||||
|
||||
static void ElementText_free(mrb_state *mrb, void *ptr) {
|
||||
UNUSED(mrb);
|
||||
int id = ((Wrapper *)ptr)->id;
|
||||
app::element_pool.release(id);
|
||||
}),
|
||||
({
|
||||
delete (Wrapper *)ptr;
|
||||
}
|
||||
|
||||
static const struct mrb_data_type ElementText_type = {
|
||||
"ElementText", ElementText_free
|
||||
};
|
||||
|
||||
static mrb_value ElementText_init(mrb_state *mrb, mrb_value self) {
|
||||
UNUSED(mrb);
|
||||
Wrapper *old = (Wrapper *)DATA_PTR(self);
|
||||
if (old)
|
||||
mrb_free(mrb, old);
|
||||
mrb_data_init(self, nullptr, &ElementText_type);
|
||||
Wrapper *s = new Wrapper();
|
||||
|
||||
mrb_value font_val;
|
||||
mrb_sym key;
|
||||
mrb_value kwargs;
|
||||
@@ -122,8 +218,16 @@ DEF_RB(
|
||||
|
||||
s->id = app::element_pool.acquire(element);
|
||||
app::element_pool.use(s->id);
|
||||
})
|
||||
)
|
||||
|
||||
mrb_data_init(self, s, &ElementText_type);
|
||||
return self;
|
||||
}
|
||||
|
||||
inline int get_id_ElementText(mrb_state *mrb, mrb_value self) {
|
||||
Wrapper *wrapper;
|
||||
Data_Get_Struct(mrb, self, &ElementText_type, wrapper);
|
||||
return wrapper->id;
|
||||
}
|
||||
|
||||
static mrb_value element_text_on_click(mrb_state *mrb, mrb_value self) {
|
||||
mrb_value block;
|
||||
@@ -134,12 +238,25 @@ static mrb_value element_text_on_click(mrb_state *mrb, mrb_value self) {
|
||||
return self;
|
||||
}
|
||||
|
||||
DEF_RB(
|
||||
ElementRect,
|
||||
({
|
||||
static void ElementRect_free(mrb_state *mrb, void *ptr) {
|
||||
UNUSED(mrb);
|
||||
int id = ((Wrapper *)ptr)->id;
|
||||
app::element_pool.release(id);
|
||||
}),
|
||||
({
|
||||
delete (Wrapper *)ptr;
|
||||
}
|
||||
|
||||
static const struct mrb_data_type ElementRect_type = {
|
||||
"ElementRect", ElementRect_free
|
||||
};
|
||||
|
||||
static mrb_value ElementRect_init(mrb_state *mrb, mrb_value self) {
|
||||
UNUSED(mrb);
|
||||
Wrapper *old = (Wrapper *)DATA_PTR(self);
|
||||
if (old)
|
||||
mrb_free(mrb, old);
|
||||
mrb_data_init(self, nullptr, &ElementRect_type);
|
||||
Wrapper *s = new Wrapper();
|
||||
|
||||
mrb_value shape_val;
|
||||
mrb_int color;
|
||||
mrb_value kwargs;
|
||||
@@ -172,8 +289,16 @@ DEF_RB(
|
||||
|
||||
s->id = app::element_pool.acquire(element);
|
||||
app::element_pool.use(s->id);
|
||||
})
|
||||
)
|
||||
|
||||
mrb_data_init(self, s, &ElementRect_type);
|
||||
return self;
|
||||
}
|
||||
|
||||
inline int get_id_ElementRect(mrb_state *mrb, mrb_value self) {
|
||||
Wrapper *wrapper;
|
||||
Data_Get_Struct(mrb, self, &ElementRect_type, wrapper);
|
||||
return wrapper->id;
|
||||
}
|
||||
|
||||
static mrb_value element_rect_on_click(mrb_state *mrb, mrb_value self) {
|
||||
mrb_value block;
|
||||
@@ -201,25 +326,44 @@ static mrb_value element_rect_color_set(mrb_state *mrb, mrb_value self) {
|
||||
static mrb_value element_rect_color_get(mrb_state *mrb, mrb_value self) {
|
||||
int id = get_id_ElementRect(mrb, self);
|
||||
app::ERect *element = (app::ERect *)app::element_pool[id];
|
||||
uint32_t color = ((uint32_t)element->color.r << 24)
|
||||
| ((uint32_t)element->color.g << 16)
|
||||
| ((uint32_t)element->color.b << 8)
|
||||
| (uint32_t)element->color.a;
|
||||
uint32_t color =
|
||||
((uint32_t)element->color.r << 24) | ((uint32_t)element->color.g << 16)
|
||||
| ((uint32_t)element->color.b << 8) | (uint32_t)element->color.a;
|
||||
return mrb_fixnum_value(color);
|
||||
}
|
||||
|
||||
DEF_RB(
|
||||
ElementImage,
|
||||
({
|
||||
static void ElementImage_free(mrb_state *mrb, void *ptr) {
|
||||
UNUSED(mrb);
|
||||
int id = ((Wrapper *)ptr)->id;
|
||||
app::element_pool.release(id);
|
||||
}),
|
||||
({
|
||||
delete (Wrapper *)ptr;
|
||||
}
|
||||
|
||||
static const struct mrb_data_type ElementImage_type = {
|
||||
"ElementImage", ElementImage_free
|
||||
};
|
||||
|
||||
static mrb_value ElementImage_init(mrb_state *mrb, mrb_value self) {
|
||||
UNUSED(mrb);
|
||||
Wrapper *old = (Wrapper *)DATA_PTR(self);
|
||||
if (old)
|
||||
mrb_free(mrb, old);
|
||||
mrb_data_init(self, nullptr, &ElementImage_type);
|
||||
Wrapper *s = new Wrapper();
|
||||
|
||||
mrb_value animation_val;
|
||||
mrb_value kwargs;
|
||||
mrb_get_args(mrb, "o|H", &animation_val, &kwargs);
|
||||
|
||||
if (!mrb_obj_is_kind_of(mrb, animation_val, mrb_class_get(mrb, "Animation"))) {
|
||||
mrb_raise(mrb, mrb_class_get(mrb, "Exception"), "Expected an Animation object");
|
||||
if (!mrb_obj_is_kind_of(
|
||||
mrb,
|
||||
animation_val,
|
||||
mrb_class_get(mrb, "Animation")
|
||||
)) {
|
||||
mrb_raise(
|
||||
mrb,
|
||||
mrb_class_get(mrb, "Exception"),
|
||||
"Expected an Animation object"
|
||||
);
|
||||
return mrb_nil_value();
|
||||
}
|
||||
|
||||
@@ -245,8 +389,16 @@ DEF_RB(
|
||||
|
||||
s->id = app::element_pool.acquire(element);
|
||||
app::element_pool.use(s->id);
|
||||
})
|
||||
)
|
||||
|
||||
mrb_data_init(self, s, &ElementImage_type);
|
||||
return self;
|
||||
}
|
||||
|
||||
inline int get_id_ElementImage(mrb_state *mrb, mrb_value self) {
|
||||
Wrapper *wrapper;
|
||||
Data_Get_Struct(mrb, self, &ElementImage_type, wrapper);
|
||||
return wrapper->id;
|
||||
}
|
||||
|
||||
static mrb_value element_image_on_click(mrb_state *mrb, mrb_value self) {
|
||||
mrb_value block;
|
||||
@@ -257,17 +409,36 @@ static mrb_value element_image_on_click(mrb_state *mrb, mrb_value self) {
|
||||
return self;
|
||||
}
|
||||
|
||||
DEF_RB(
|
||||
Scene,
|
||||
({
|
||||
static void Scene_free(mrb_state *mrb, void *ptr) {
|
||||
UNUSED(mrb);
|
||||
int id = ((Wrapper *)ptr)->id;
|
||||
app::scene_pool.release(id);
|
||||
}),
|
||||
({
|
||||
delete (Wrapper *)ptr;
|
||||
}
|
||||
|
||||
static const struct mrb_data_type Scene_type = {"Scene", Scene_free};
|
||||
|
||||
static mrb_value Scene_init(mrb_state *mrb, mrb_value self) {
|
||||
UNUSED(mrb);
|
||||
Wrapper *old = (Wrapper *)DATA_PTR(self);
|
||||
if (old)
|
||||
mrb_free(mrb, old);
|
||||
mrb_data_init(self, nullptr, &Scene_type);
|
||||
Wrapper *s = new Wrapper();
|
||||
|
||||
app::Scene *loading_scene = new app::Scene{};
|
||||
s->id = app::scene_pool.acquire(loading_scene);
|
||||
app::scene_pool.use(s->id);
|
||||
})
|
||||
)
|
||||
|
||||
mrb_data_init(self, s, &Scene_type);
|
||||
return self;
|
||||
}
|
||||
|
||||
inline int get_id_Scene(mrb_state *mrb, mrb_value self) {
|
||||
Wrapper *wrapper;
|
||||
Data_Get_Struct(mrb, self, &Scene_type, wrapper);
|
||||
return wrapper->id;
|
||||
}
|
||||
|
||||
static mrb_value scene_add_element(mrb_state *mrb, mrb_value self) {
|
||||
mrb_value element_val;
|
||||
@@ -278,24 +449,34 @@ static mrb_value scene_add_element(mrb_state *mrb, mrb_value self) {
|
||||
&& !mrb_obj_is_kind_of(mrb, element_val, mrb_class_get(mrb, "ElementRect"))
|
||||
&& !mrb_obj_is_kind_of(mrb, element_val, mrb_class_get(mrb, "ElementImage"))
|
||||
) {
|
||||
mrb_raise(mrb, mrb_class_get(mrb, "Exception"), "Expected an ElementText, ElementRect, or ElementImage object");
|
||||
mrb_raise(
|
||||
mrb,
|
||||
mrb_class_get(mrb, "Exception"),
|
||||
"Expected an ElementText, ElementRect, or ElementImage object"
|
||||
);
|
||||
return mrb_nil_value();
|
||||
}
|
||||
|
||||
int id = get_id_Scene(mrb, self);
|
||||
app::Scene *scene = app::scene_pool[id];
|
||||
|
||||
// int element_id = get_id_Element(mrb, element_val);
|
||||
|
||||
int element_id;
|
||||
if (mrb_obj_is_kind_of(mrb, element_val, mrb_class_get(mrb, "ElementText"))) {
|
||||
element_id = get_id_ElementText(mrb, element_val);
|
||||
} else if (mrb_obj_is_kind_of(mrb, element_val, mrb_class_get(mrb, "ElementRect"))) {
|
||||
} else if (
|
||||
mrb_obj_is_kind_of(mrb, element_val, mrb_class_get(mrb, "ElementRect"))
|
||||
) {
|
||||
element_id = get_id_ElementRect(mrb, element_val);
|
||||
} else if (mrb_obj_is_kind_of(mrb, element_val, mrb_class_get(mrb, "ElementImage"))) {
|
||||
} else if (
|
||||
mrb_obj_is_kind_of(mrb, element_val, mrb_class_get(mrb, "ElementImage"))
|
||||
) {
|
||||
element_id = get_id_ElementImage(mrb, element_val);
|
||||
} else {
|
||||
mrb_raise(mrb, mrb_class_get(mrb, "Exception"), "Expected an ElementText, ElementRect, or ElementImage object");
|
||||
mrb_raise(
|
||||
mrb,
|
||||
mrb_class_get(mrb, "Exception"),
|
||||
"Expected an ElementText, ElementRect, or ElementImage object"
|
||||
);
|
||||
return mrb_nil_value();
|
||||
}
|
||||
|
||||
@@ -313,7 +494,11 @@ static mrb_value scene_delete_element(mrb_state *mrb, mrb_value self) {
|
||||
&& !mrb_obj_is_kind_of(mrb, element_val, mrb_class_get(mrb, "ElementRect"))
|
||||
&& !mrb_obj_is_kind_of(mrb, element_val, mrb_class_get(mrb, "ElementImage"))
|
||||
) {
|
||||
mrb_raise(mrb, mrb_class_get(mrb, "Exception"), "Expected an ElementText, ElementRect, or ElementImage object");
|
||||
mrb_raise(
|
||||
mrb,
|
||||
mrb_class_get(mrb, "Exception"),
|
||||
"Expected an ElementText, ElementRect, or ElementImage object"
|
||||
);
|
||||
return mrb_nil_value();
|
||||
}
|
||||
|
||||
@@ -323,12 +508,20 @@ static mrb_value scene_delete_element(mrb_state *mrb, mrb_value self) {
|
||||
int element_id;
|
||||
if (mrb_obj_is_kind_of(mrb, element_val, mrb_class_get(mrb, "ElementText"))) {
|
||||
element_id = get_id_ElementText(mrb, element_val);
|
||||
} else if (mrb_obj_is_kind_of(mrb, element_val, mrb_class_get(mrb, "ElementRect"))) {
|
||||
} else if (
|
||||
mrb_obj_is_kind_of(mrb, element_val, mrb_class_get(mrb, "ElementRect"))
|
||||
) {
|
||||
element_id = get_id_ElementRect(mrb, element_val);
|
||||
} else if (mrb_obj_is_kind_of(mrb, element_val, mrb_class_get(mrb, "ElementImage"))) {
|
||||
} else if (
|
||||
mrb_obj_is_kind_of(mrb, element_val, mrb_class_get(mrb, "ElementImage"))
|
||||
) {
|
||||
element_id = get_id_ElementImage(mrb, element_val);
|
||||
} else {
|
||||
mrb_raise(mrb, mrb_class_get(mrb, "Exception"), "Expected an ElementText, ElementRect, or ElementImage object");
|
||||
mrb_raise(
|
||||
mrb,
|
||||
mrb_class_get(mrb, "Exception"),
|
||||
"Expected an ElementText, ElementRect, or ElementImage object"
|
||||
);
|
||||
return mrb_nil_value();
|
||||
}
|
||||
|
||||
@@ -430,40 +623,15 @@ inline void setup() {
|
||||
DEF_CLASS(Animation, MRB_ARGS_REQ(1) | MRB_ARGS_OPT(1));
|
||||
|
||||
DEF_CLASS(ElementText, MRB_ARGS_REQ(2) | MRB_ARGS_OPT(1));
|
||||
ADD_METHOD(
|
||||
ElementText,
|
||||
"on_click",
|
||||
element_text_on_click,
|
||||
MRB_ARGS_BLOCK()
|
||||
);
|
||||
ADD_METHOD(ElementText, "on_click", element_text_on_click, MRB_ARGS_BLOCK());
|
||||
|
||||
DEF_CLASS(ElementRect, MRB_ARGS_REQ(2) | MRB_ARGS_OPT(1));
|
||||
ADD_METHOD(
|
||||
ElementRect,
|
||||
"on_click",
|
||||
element_rect_on_click,
|
||||
MRB_ARGS_BLOCK()
|
||||
);
|
||||
ADD_METHOD(
|
||||
ElementRect,
|
||||
"color=",
|
||||
element_rect_color_set,
|
||||
MRB_ARGS_REQ(1)
|
||||
);
|
||||
ADD_METHOD(
|
||||
ElementRect,
|
||||
"color",
|
||||
element_rect_color_get,
|
||||
MRB_ARGS_NONE()
|
||||
);
|
||||
ADD_METHOD(ElementRect, "on_click", element_rect_on_click, MRB_ARGS_BLOCK());
|
||||
ADD_METHOD(ElementRect, "color=", element_rect_color_set, MRB_ARGS_REQ(1));
|
||||
ADD_METHOD(ElementRect, "color", element_rect_color_get, MRB_ARGS_NONE());
|
||||
|
||||
DEF_CLASS(ElementImage, MRB_ARGS_REQ(1) | MRB_ARGS_OPT(1));
|
||||
ADD_METHOD(
|
||||
ElementImage,
|
||||
"on_click",
|
||||
element_image_on_click,
|
||||
MRB_ARGS_BLOCK()
|
||||
);
|
||||
ADD_METHOD(ElementImage, "on_click", element_image_on_click, MRB_ARGS_BLOCK());
|
||||
|
||||
DEF_CLASS(Scene, MRB_ARGS_NONE());
|
||||
ADD_METHOD(Scene, "<<", scene_add_element, MRB_ARGS_REQ(1));
|
||||
|
||||
@@ -31,34 +31,6 @@ struct Wrapper {
|
||||
int id;
|
||||
};
|
||||
|
||||
#define DEF_RB(NAME, FN_FREE, FN_INIT) \
|
||||
static void NAME##_free(mrb_state *mrb, void *ptr) { \
|
||||
UNUSED(mrb); \
|
||||
int id = ((Wrapper *)ptr)->id; \
|
||||
FN_FREE; \
|
||||
delete (Wrapper *)ptr; \
|
||||
} \
|
||||
static const struct mrb_data_type NAME##_type = { \
|
||||
#NAME, \
|
||||
NAME##_free \
|
||||
}; \
|
||||
static mrb_value NAME##_init(mrb_state *mrb, mrb_value self) { \
|
||||
UNUSED(mrb); \
|
||||
Wrapper *old = (Wrapper *)DATA_PTR(self); \
|
||||
if (old) \
|
||||
mrb_free(mrb, old); \
|
||||
mrb_data_init(self, nullptr, &NAME##_type); \
|
||||
Wrapper *s = new Wrapper(); \
|
||||
FN_INIT; \
|
||||
mrb_data_init(self, s, &NAME##_type); \
|
||||
return self; \
|
||||
} \
|
||||
inline int get_id_##NAME(mrb_state *mrb, mrb_value self) { \
|
||||
Wrapper *wrapper; \
|
||||
Data_Get_Struct(mrb, self, &NAME##_type, wrapper); \
|
||||
return wrapper->id; \
|
||||
}
|
||||
|
||||
#define ADD_METHOD(NAME, METHOD, FUNC, ARGS) \
|
||||
mrb_define_method(Ruby::mrb, NAME##_class, METHOD, FUNC, ARGS);
|
||||
|
||||
|
||||
@@ -25,10 +25,63 @@ rect.on_click do
|
||||
0xFF0000FF
|
||||
end
|
||||
|
||||
=begin
|
||||
|
||||
input handling:
|
||||
|
||||
on_click - exists to simplify on elements, not the standard way.
|
||||
|
||||
App.map_key(:space, :jump) # maps the space key to a :jump action (multiple keys can be mapped to the same action)
|
||||
# all events here are in english ones, (so need to find which english key corresponds to the key in the current language of the keyboard)
|
||||
key can be one of [:a..:z, :0..:9, :space, :enter, :shift, :ctrl, :alt, :tab, :backspace, :escape, :up, :down, :left, :right, :middle]
|
||||
|
||||
this can be checked anywhere using:
|
||||
|
||||
App.down?(:jump) # returns true if the jump action is currently being pressed
|
||||
App.pressed?(:jump) # returns true if the jump action was just pressed this frame
|
||||
App.released?(:jump) # returns true if the jump action was just released this frame
|
||||
|
||||
for wheel, you can use:
|
||||
|
||||
App.wheel # returns a hash with :x and :y values representing the wheel movement since the last frame (can be used for zooming, scrolling, etc.)
|
||||
|
||||
mouse position can be accessed with:
|
||||
|
||||
App.mouse_position # returns a hash with :x and :y values representing the current mouse position in the window
|
||||
|
||||
For localized input, you can use:
|
||||
|
||||
App.start_text_input!
|
||||
|
||||
App.text_input # returns the text typed this frame as a string (useful for text input fields, chat, etc.)
|
||||
# can be multiple characters if the user types fast, so you should append it to a string variable to get the full input
|
||||
|
||||
App.stop_text_input!
|
||||
|
||||
####
|
||||
|
||||
also in a scene you can use (with click_though semantics):
|
||||
|
||||
main_scene.elements_at(x, y)
|
||||
|
||||
=end
|
||||
|
||||
|
||||
|
||||
main_scene.on_update do |delta_time|
|
||||
# puts "Delta time: #{delta_time}ms"
|
||||
# commented out to avoid spamming the console, but you can uncomment to see the delta time being printed every frame
|
||||
# runs at 60fps, so you should see around 16-17ms being printed
|
||||
|
||||
# simple logic to handle hover
|
||||
pos = App.mouse_position
|
||||
next if pos.nil? # mouse position can be nil if the window is not focused, so we skip the hover logic in that case
|
||||
elements = main_scene.elements_at(*pos.values)
|
||||
if elements.include?(rect)
|
||||
rect.color = 0x0000FFFF
|
||||
else # also handles nil case, if the mouse is not over any element, we reset the color
|
||||
rect.color = 0xFF0000FF
|
||||
end
|
||||
end
|
||||
|
||||
main_scene << text
|
||||
|
||||
Reference in New Issue
Block a user