0,0 → 1,182 |
#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)); |
|
|
} |
|
/**/ |