Files
player/Project_App_Snake/App_Src/win/mywin_snake.c
2025-07-05 19:47:28 +08:00

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;
}