183 lines
5.4 KiB
C
183 lines
5.4 KiB
C
|
#include "SDL.h"
|
||
|
|
||
|
/* utility functions */
|
||
|
Uint32 pygame_list_to_color(TP,tp_obj clr,SDL_Surface *s) {
|
||
|
int r,g,b;
|
||
|
r = tp_get(tp,clr,tp_number(0)).number.val;
|
||
|
g = tp_get(tp,clr,tp_number(1)).number.val;
|
||
|
b = tp_get(tp,clr,tp_number(2)).number.val;
|
||
|
return SDL_MapRGB(s->format,r,g,b);
|
||
|
}
|
||
|
|
||
|
/* surface */
|
||
|
|
||
|
#define PYGAME_TYPE_SURF 0x1001
|
||
|
|
||
|
void pygame_surf_free(TP,tp_obj d) {
|
||
|
if (d.data.magic != PYGAME_TYPE_SURF) { tp_raise(,"%s","not a surface"); }
|
||
|
SDL_FreeSurface((SDL_Surface*)d.data.val);
|
||
|
}
|
||
|
|
||
|
SDL_Surface *pygame_obj_to_surf(TP,tp_obj self) {
|
||
|
tp_obj d = tp_get(tp,self,tp_string("__surf"));
|
||
|
if (d.data.magic != PYGAME_TYPE_SURF) { tp_raise(0,"%s","not a surface"); }
|
||
|
return (SDL_Surface*)d.data.val;
|
||
|
}
|
||
|
|
||
|
|
||
|
tp_obj pygame_surface_set_at(TP) {
|
||
|
tp_obj self = TP_OBJ();
|
||
|
tp_obj pos = TP_TYPE(TP_LIST);
|
||
|
tp_obj clr = TP_TYPE(TP_LIST);
|
||
|
SDL_Rect r;
|
||
|
r.x = tp_get(tp,pos,tp_number(0)).number.val;
|
||
|
r.y = tp_get(tp,pos,tp_number(1)).number.val;
|
||
|
r.w = 1; r.h = 1;
|
||
|
SDL_Surface *s =pygame_obj_to_surf(tp,self);
|
||
|
Uint32 c = pygame_list_to_color(tp,clr,s);
|
||
|
SDL_FillRect(s, &r, c);
|
||
|
return tp_None;
|
||
|
}
|
||
|
|
||
|
|
||
|
tp_obj pygame_surf_to_obj(TP,SDL_Surface *s) {
|
||
|
tp_obj self = tp_dict(tp);
|
||
|
|
||
|
tp_obj d = tp_data(tp,PYGAME_TYPE_SURF,s);
|
||
|
d.data.info->free = pygame_surf_free;
|
||
|
|
||
|
tp_set(tp,self,tp_string("__surf"),d);
|
||
|
tp_set(tp,self,tp_string("set_at"),tp_method(tp,self,pygame_surface_set_at));
|
||
|
return self;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/* display module */
|
||
|
|
||
|
tp_obj pygame_display_set_mode(TP) {
|
||
|
tp_obj sz = TP_TYPE(TP_LIST);
|
||
|
int w = tp_get(tp,sz,tp_number(0)).number.val;
|
||
|
int h = tp_get(tp,sz,tp_number(1)).number.val;
|
||
|
SDL_Surface *s = SDL_SetVideoMode(w, h, 0, 0);
|
||
|
return pygame_surf_to_obj(tp,s);
|
||
|
}
|
||
|
|
||
|
tp_obj pygame_display_flip(TP) {
|
||
|
SDL_Flip(SDL_GetVideoSurface());
|
||
|
return tp_None;
|
||
|
}
|
||
|
|
||
|
SDL_Rect pygame_list_to_rect(TP,tp_obj o) {
|
||
|
SDL_Rect r;
|
||
|
r.x = tp_get(tp,o,tp_number(0)).number.val;
|
||
|
r.y = tp_get(tp,o,tp_number(1)).number.val;
|
||
|
r.w = tp_get(tp,o,tp_number(2)).number.val;
|
||
|
r.h = tp_get(tp,o,tp_number(3)).number.val;
|
||
|
return r;
|
||
|
}
|
||
|
|
||
|
tp_obj pygame_display_update(TP) {
|
||
|
SDL_Rect r = pygame_list_to_rect(tp,TP_TYPE(TP_LIST));
|
||
|
SDL_UpdateRects(SDL_GetVideoSurface(), 1, &r);
|
||
|
return tp_None;
|
||
|
}
|
||
|
|
||
|
/* event module */
|
||
|
tp_obj pygame_event_get(TP) {
|
||
|
SDL_Event e;
|
||
|
tp_obj r = tp_list(tp);
|
||
|
while (SDL_PollEvent(&e)) {
|
||
|
tp_obj d = tp_dict(tp);
|
||
|
tp_set(tp,d,tp_string("type"),tp_number(e.type));
|
||
|
switch (e.type) {
|
||
|
case SDL_KEYDOWN:
|
||
|
case SDL_KEYUP:
|
||
|
tp_set(tp,d,tp_string("key"),tp_number(e.key.keysym.sym));
|
||
|
tp_set(tp,d,tp_string("mod"),tp_number(e.key.keysym.mod));
|
||
|
break;
|
||
|
case SDL_MOUSEMOTION:
|
||
|
tp_set(tp,d,tp_string("pos"),tp_list_n(tp,2,(tp_obj[]){tp_number(e.motion.x),tp_number(e.motion.y)}));
|
||
|
tp_set(tp,d,tp_string("rel"),tp_list_n(tp,2,(tp_obj[]){tp_number(e.motion.xrel),tp_number(e.motion.yrel)}));
|
||
|
tp_set(tp,d,tp_string("state"),tp_number(e.motion.state));
|
||
|
break;
|
||
|
case SDL_MOUSEBUTTONDOWN:
|
||
|
case SDL_MOUSEBUTTONUP:
|
||
|
tp_set(tp,d,tp_string("pos"),tp_list_n(tp,2,(tp_obj[]){tp_number(e.button.x),tp_number(e.button.y)}));
|
||
|
tp_set(tp,d,tp_string("button"),tp_number(e.button.button));
|
||
|
break;
|
||
|
}
|
||
|
tp_set(tp,r,tp_None,d);
|
||
|
}
|
||
|
return r;
|
||
|
}
|
||
|
|
||
|
/* mouse */
|
||
|
tp_obj pygame_mouse_get_pos(TP) {
|
||
|
int x,y;
|
||
|
SDL_GetMouseState(&x,&y);
|
||
|
tp_obj r = tp_list_n(tp,2,(tp_obj[]){tp_number(x),tp_number(y)});
|
||
|
return r;
|
||
|
}
|
||
|
|
||
|
/* time */
|
||
|
tp_obj pygame_time_get_ticks(TP) {
|
||
|
return tp_number(SDL_GetTicks());
|
||
|
}
|
||
|
|
||
|
|
||
|
/* pygame */
|
||
|
#define PYGAME_LOCALS(a,b) tp_set(tp,m,tp_string(a),tp_number(b));
|
||
|
|
||
|
tp_obj _pygame_init(TP) {
|
||
|
SDL_Init(SDL_INIT_VIDEO);
|
||
|
return tp_None;
|
||
|
}
|
||
|
|
||
|
|
||
|
void pygame_init(TP) {
|
||
|
tp_obj g,m;
|
||
|
g = tp_dict(tp);
|
||
|
tp_set(tp,tp->modules,tp_string("pygame"),g);
|
||
|
tp_set(tp,g,tp_string("init"),tp_fnc(tp,_pygame_init));
|
||
|
|
||
|
/* display */
|
||
|
m = tp_dict(tp); tp_set(tp,g,tp_string("display"),m);
|
||
|
tp_set(tp,m,tp_string("set_mode"),tp_fnc(tp,pygame_display_set_mode));
|
||
|
tp_set(tp,m,tp_string("flip"),tp_fnc(tp,pygame_display_flip));
|
||
|
tp_set(tp,m,tp_string("update"),tp_fnc(tp,pygame_display_update));
|
||
|
|
||
|
/* event */
|
||
|
m = tp_dict(tp); tp_set(tp,g,tp_string("event"),m);
|
||
|
tp_set(tp,m,tp_string("get"),tp_fnc(tp,pygame_event_get));
|
||
|
|
||
|
/* locals */
|
||
|
m = tp_dict(tp); tp_set(tp,g,tp_string("locals"),m);
|
||
|
PYGAME_LOCALS("QUIT",SDL_QUIT);
|
||
|
PYGAME_LOCALS("KEYDOWN",SDL_KEYDOWN);
|
||
|
PYGAME_LOCALS("KEYUP",SDL_KEYUP);
|
||
|
PYGAME_LOCALS("MOUSEBUTTONDOWN",SDL_MOUSEBUTTONDOWN);
|
||
|
PYGAME_LOCALS("MOUSEBUTTONUP",SDL_MOUSEBUTTONUP);
|
||
|
PYGAME_LOCALS("MOUSEMOTION",SDL_MOUSEMOTION);
|
||
|
PYGAME_LOCALS("K_UP",SDLK_UP);
|
||
|
PYGAME_LOCALS("K_DOWN",SDLK_DOWN);
|
||
|
PYGAME_LOCALS("K_LEFT",SDLK_LEFT);
|
||
|
PYGAME_LOCALS("K_RIGHT",SDLK_RIGHT);
|
||
|
PYGAME_LOCALS("K_ESCAPE",SDLK_ESCAPE);
|
||
|
PYGAME_LOCALS("K_SPACE",SDLK_SPACE);
|
||
|
PYGAME_LOCALS("K_RETURN",SDLK_RETURN);
|
||
|
|
||
|
/* mouse */
|
||
|
m = tp_dict(tp); tp_set(tp,g,tp_string("mouse"),m);
|
||
|
tp_set(tp,m,tp_string("get_pos"),tp_fnc(tp,pygame_mouse_get_pos));
|
||
|
|
||
|
/* time */
|
||
|
m = tp_dict(tp); tp_set(tp,g,tp_string("time"),m);
|
||
|
tp_set(tp,m,tp_string("get_ticks"),tp_fnc(tp,pygame_time_get_ticks));
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
/**/
|