277 lines
5.8 KiB
C
277 lines
5.8 KiB
C
#include "main_inc.h"
|
|
#include "mywin_snake.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//保存窗口句柄用于app删除
|
|
static WIN_SnakeStruct *g_win_snake=0;
|
|
|
|
|
|
WIN_SnakeStruct *WIN_CreatSnake (WIN_WindowStruct *base,
|
|
void (*msgLoop)(struct _WIN_WindowStruct *win,WIN_MsgStruct *msg),
|
|
int x,int y,int x_size,int y_size)
|
|
{
|
|
//重设消息循环
|
|
if (msgLoop==0)
|
|
{
|
|
msgLoop=(void (*)(struct _WIN_WindowStruct *win,WIN_MsgStruct *msg))SNAKE_defaultMsgLoop;
|
|
}
|
|
|
|
WIN_SnakeStruct *ret=mymalloc (sizeof ( WIN_SnakeStruct));
|
|
//调用父类的构造函数
|
|
if (ret)
|
|
{
|
|
mymemset (ret,0,sizeof ( WIN_SnakeStruct));
|
|
// if (0==WIN_CreatWindowExt((WIN_WindowStruct *)ret,base,msgLoop,x,y,x_size,y_size))
|
|
if (0==WIN_CreatTouchEx((WIN_TouchWinStruct *)ret,base,msgLoop,x,y,x_size,y_size))
|
|
{
|
|
//创建失败
|
|
myfree (ret);
|
|
ret=0;
|
|
}
|
|
else
|
|
{
|
|
((WIN_WindowStruct *)ret)->winType="WIN_SnakeStruct";
|
|
((WIN_WindowStruct *)ret)->intercept=1;
|
|
((WIN_WindowStruct *)ret)->deleteWindow=(void (*)(struct _WIN_WindowStruct *win))SNAKE_DeleteSnake;
|
|
|
|
ret->delay_ms=400;
|
|
ret->timerId=WIN_CreatTimer ((WIN_WindowStruct *)ret,ret->delay_ms);
|
|
ret->snake=snake_creat();
|
|
|
|
global_run_start();
|
|
}
|
|
}
|
|
|
|
g_win_snake=ret;
|
|
return ret;
|
|
}
|
|
|
|
|
|
|
|
//删除秒表
|
|
void SNAKE_DeleteSnake (WIN_SnakeStruct *s )
|
|
{
|
|
CALL_BACK_ENTER();
|
|
|
|
snake_delete(s->snake);
|
|
|
|
//调用父类的销毁函数
|
|
WIN_DeleteWindow ( (WIN_WindowStruct *)s);
|
|
g_win_snake=0;
|
|
global_run_exit();
|
|
CALL_BACK_EXIT();
|
|
}
|
|
|
|
|
|
int __app_exit(void *ptr)
|
|
{
|
|
CALL_BACK_ENTER();
|
|
if(g_win_snake) SNAKE_DeleteSnake(g_win_snake);
|
|
CALL_BACK_EXIT();
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
//消息框的绘制函数
|
|
void SNAKE_DefaultPaint (WIN_SnakeStruct *s)
|
|
{
|
|
int x=0;
|
|
int y=0;
|
|
int x_size=((WIN_WindowStruct *)s)->x_size;
|
|
int y_size=((WIN_WindowStruct *)s)->y_size;
|
|
u32 color=((WIN_WindowStruct *)s)->color;
|
|
u32 bkcolor=((WIN_WindowStruct *)s)->bkcolor;
|
|
char txt_buff[20]={0};
|
|
|
|
WIN_PaintBackGround ((WIN_WindowStruct *)s);
|
|
u32 font_type=WIN_SetFontType(24);
|
|
|
|
WIN_SetLcdColor(color);
|
|
WIN_SetLcdBkColor(bkcolor);
|
|
|
|
if(s->snake)
|
|
{
|
|
int s_x=30;
|
|
int s_y=25;
|
|
WIN_SetLcdColor(bkcolor);
|
|
WIN_FillRectByColor(s_x-1,s_y-1,200+2,200+2);
|
|
WIN_SetLcdColor(color);
|
|
WIN_DrawRect(s_x-1,s_y-1,200+2,200+2);
|
|
cell_struct *cell=0;
|
|
for(int y=0;y<MAP_Y_SIZE;y++)
|
|
{
|
|
for(int x=0;x<MAP_X_SIZE;x++)
|
|
{
|
|
cell=&s->snake->map[y*MAP_X_SIZE+x];
|
|
if(cell->type==CELL_TYPE_WALL)
|
|
{
|
|
//墙,空心方块
|
|
WIN_DrawRect(s_x+x*8,s_y+y*8,8,8);
|
|
}
|
|
else if(cell->type==CELL_TYPE_HEAD)
|
|
{
|
|
//头,小一点的方块
|
|
WIN_DrawRect(s_x+x*8+2,s_y+y*8+2,8-4,8-4);
|
|
}
|
|
else if(cell->type==CELL_TYPE_BODY)
|
|
{
|
|
//身体,全黑方块
|
|
WIN_FillRectByColor(s_x+x*8,s_y+y*8,8,8);
|
|
}
|
|
else if(cell->type==CELL_TYPE_FOOD)
|
|
{
|
|
//食物,十字架
|
|
WIN_DrawHLine(s_x+x*8,s_y+y*8+2,s_x+x*8+8-1);
|
|
WIN_DrawHLine(s_x+x*8,s_y+y*8+5,s_x+x*8+8-1);
|
|
WIN_DrawVLine(s_x+x*8+2,s_y+y*8,s_y+y*8+8-1);
|
|
WIN_DrawVLine(s_x+x*8+5,s_y+y*8,s_y+y*8+8-1);
|
|
}
|
|
}
|
|
}
|
|
|
|
sprintf(txt_buff,"分数:%d",s->snake->mark);
|
|
WIN_DrawTxtAt(txt_buff,276,30);
|
|
if(s->suspend)
|
|
WIN_DrawTxtAt("暂停中",276,60);
|
|
}
|
|
|
|
|
|
WIN_SetFontType(font_type);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//消息框的消息处理函数
|
|
void SNAKE_defaultMsgLoop (WIN_SnakeStruct *s,WIN_MsgStruct *msg)
|
|
{
|
|
CALL_BACK_ENTER();
|
|
WIN_KeyStruct *k=0;
|
|
WIN_MoveStruct *m=0;
|
|
switch (msg->msg)
|
|
{
|
|
case WIN_MSG_PAINT:
|
|
SNAKE_DefaultPaint(s);
|
|
break;
|
|
case WIN_MSG_INIT:
|
|
{
|
|
s->but_up=WIN_CreatButton((WIN_WindowStruct *)s,0,350,110,30,30);
|
|
BUTTON_SetKeyString(s->but_up,"上");
|
|
s->but_down=WIN_CreatButton((WIN_WindowStruct *)s,0,350,200,30,30);
|
|
BUTTON_SetKeyString(s->but_down,"下");
|
|
s->but_left=WIN_CreatButton((WIN_WindowStruct *)s,0,300,160,30,30);
|
|
BUTTON_SetKeyString(s->but_left,"左");
|
|
s->but_right=WIN_CreatButton((WIN_WindowStruct *)s,0,400,160,30,30);
|
|
BUTTON_SetKeyString(s->but_right,"右");
|
|
}
|
|
break;
|
|
case WIN_MSG_TIMER:
|
|
if (msg->data.v==s->timerId)
|
|
{
|
|
if(s->suspend==0)
|
|
{
|
|
if(snake_run(s->snake)==0)
|
|
{
|
|
WIN_DeleteTimer(s->timerId);
|
|
char *txt=mymalloc(128);
|
|
sprintf(txt,"游戏结束\n当前分数:%d",s->snake->mark);
|
|
MSGBOX_Tips((WIN_WindowStruct *)s,"提示",txt,"确定");
|
|
myfree(txt);
|
|
s->delay_ms=400;
|
|
snake_init(s->snake);
|
|
s->timerId=WIN_CreatTimer ((WIN_WindowStruct *)s,s->delay_ms);
|
|
}
|
|
if(s->delay_ms>100)
|
|
{
|
|
s->delay_ms=400-s->snake->mark*3;
|
|
WIN_SetTimerCycle(s->timerId,s->delay_ms);
|
|
}
|
|
WIN_SetInvalidWhenTop ((WIN_WindowStruct *)s);
|
|
}
|
|
}
|
|
break;
|
|
case WIN_MSG_KEY:
|
|
k=msg->data.p;
|
|
break;//case WIN_MSG_KEY:
|
|
case WIN_MSG_MOVE:
|
|
m=msg->data.p;
|
|
switch (m->moveType)
|
|
{
|
|
case MOVE_DATA_SHORT:
|
|
s->suspend=!s->suspend; //暂停
|
|
WIN_SetInvalidWhenTop ((WIN_WindowStruct *)s);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
case WIN_MSG_CHID:
|
|
switch (msg->data.v)
|
|
{
|
|
case CHID_DELETE:
|
|
break;
|
|
case CHID_USER:
|
|
{
|
|
if (msg->data2.v==BUTTON_PRESSED)
|
|
{
|
|
if (msg->srcWin==s->but_up)
|
|
{
|
|
snake_set_dir(s->snake,DIR_UP);
|
|
}
|
|
else if (msg->srcWin==s->but_down)
|
|
{
|
|
snake_set_dir(s->snake,DIR_DOWN);
|
|
}
|
|
else if (msg->srcWin==s->but_left)
|
|
{
|
|
snake_set_dir(s->snake,DIR_LEFT);
|
|
}
|
|
else if (msg->srcWin==s->but_right)
|
|
{
|
|
snake_set_dir(s->snake,DIR_RIGHT);
|
|
}
|
|
WIN_SetInvalid ((WIN_WindowStruct *)s);
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
default:
|
|
WIN_DefaultMsgLoop((WIN_WindowStruct *)s,msg);
|
|
break;
|
|
}
|
|
CALL_BACK_EXIT();
|
|
}
|
|
|
|
|
|
WIN_SnakeStruct *SNAKE_StartGame (WIN_WindowStruct *base)
|
|
{
|
|
WIN_SnakeStruct *ret=0;
|
|
if (base)
|
|
{
|
|
ret=WIN_CreatSnake (base,0,0,0,base->x_size,base->y_size);
|
|
}
|
|
else
|
|
{
|
|
ret=WIN_CreatSnake (0,0,0,0,WIN_GetBaseWindow()->x_size,WIN_GetBaseWindow()->y_size);
|
|
}
|
|
WIN_SetBackPic ((WIN_WindowStruct *)ret);
|
|
WIN_ShowWindow((WIN_WindowStruct*)ret);
|
|
return ret;
|
|
}
|
|
|
|
|