📄 mmisnake.c
字号:
drawDiamond(data->Diamonddata[data->headX][data->headY].nextX,data->Diamonddata[data->headX][data->headY].nextY);
if(uRet == Snake_Diamond_Food1)
data->foodadd = 1;
return uRet;
}
/******************************************************
$Description:gernate food
$Argument:
@isDraw: 0 don't draw food
1 draw food
@return:0 fail
1 success
*********************************************************/
U8 gernateFood(U8 isDraw)
{
int i = 0;
int size = GameSnake_Width*GameSnake_Height;
Snake_DiamondData *pDiamondData = (Snake_DiamondData*)snakedata.Diamonddata;
int nFood = rand()%(size);
i = nFood;
while((pDiamondData+i)->state != 0)
{
if(i == size -1)
i = 0;
else
i ++;
if(i == nFood)
return 0;
}
(pDiamondData+i)->state = Snake_Diamond_Food1 + rand() % GET_ICONATTR_NUM(ICON_SNAKE_FOOD);
//dspl food
if(isDraw)
{
U8 foodX = i/GameSnake_Height;
U8 foodY = i%GameSnake_Height;
drawDiamond(foodX,foodY);
}
return 1;
}
/*2004/04/27,talcon add*/
void clearDiamond(U8 posX,U8 posY)
{
dspl_BitBlt_ext(GameSnake_ZonePosX+posX*GameSnake_Diamond,
GameSnake_ZonePosY+posY*GameSnake_Diamond,
posX%GameSnake_BkgDiamond*GameSnake_Diamond,
posY%GameSnake_BkgDiamond*GameSnake_Diamond,
GameSnake_Diamond,
GameSnake_Diamond,
GameSnake_Diamond*GameSnake_BkgDiamond,
GameSnake_Diamond*GameSnake_BkgDiamond,
0,
(void *)GET_ICONATTR(ICON_SNAKE_BKG,0)->icons,//(void *)snake_BkgDiamond,
0);
}
void drawDiamond(U8 posX,U8 posY)
{
Snake_DiamondData *data = (Snake_DiamondData*)&snakedata.Diamonddata[posX][posY];
void *icon = 0;
void *iconmask = 0;
if(posX>=GameSnake_Width || posY>=GameSnake_Height)
{
return;
}
switch(data->state)
{
case Snake_Diamond_None://none
dspl_BitBlt_ext(GameSnake_ZonePosX+posX*GameSnake_Diamond,
GameSnake_ZonePosY+posY*GameSnake_Diamond,
posX%GameSnake_BkgDiamond*GameSnake_Diamond,
posY%GameSnake_BkgDiamond*GameSnake_Diamond,
GameSnake_Diamond,
GameSnake_Diamond,
GameSnake_Diamond*GameSnake_BkgDiamond,
GameSnake_Diamond*GameSnake_BkgDiamond,
0,
(void *)GET_ICONATTR(ICON_SNAKE_BKG,0)->icons,//(void *)snake_BkgDiamond,
0);
break;
case Snake_Diamond_Food1:
case Snake_Diamond_Food2:
case Snake_Diamond_Food3:
case Snake_Diamond_Food4:
case Snake_Diamond_Food5:
case Snake_Diamond_Food6:
icon = (void*) (GET_ICONATTR(ICON_SNAKE_FOOD,0)->icons + (data->state - Snake_Diamond_Food1)*GameSnake_Diamond*GameSnake_Diamond*2);
iconmask = (void*) (GET_ICONATTR(ICON_SNAKE_FOODMASK,0)->icons + (data->state - Snake_Diamond_Food1)*GameSnake_Diamond*GameSnake_Diamond*2);
break;
case Snake_Diamond_Wall:
icon = (void*) GET_ICONATTR(ICON_SNAKE_WALL,0)->icons;
break;
case Snake_Diamond_Snake:
if(data->previousX == 0xff || data->previousY == 0xff)//is head
{
//up
if(posX == data->nextX && posY == data->nextY - 1)
{
icon = (void*)GET_ICONATTR(ICON_SNAKE_BODY,0)->icons;
iconmask = (void*)GET_ICONATTR(ICON_SNAKE_BODYMASK,0)->icons;
}
else if(posX == data->nextX && posY == data->nextY + 1)//down
{
icon = (void*)GET_ICONATTR(ICON_SNAKE_BODY,1)->icons;
iconmask = (void*)GET_ICONATTR(ICON_SNAKE_BODYMASK,1)->icons;
}
else if(posX == data->nextX - 1 && posY == data->nextY )//right
{
icon = (void*)GET_ICONATTR(ICON_SNAKE_BODY,2)->icons;
iconmask = (void*)GET_ICONATTR(ICON_SNAKE_BODYMASK,2)->icons;
}
else if(posX == data->nextX + 1 && posY == data->nextY )//left
{
icon = (void*)GET_ICONATTR(ICON_SNAKE_BODY,3)->icons;
iconmask = (void*)GET_ICONATTR(ICON_SNAKE_BODYMASK,3)->icons;
}
}
else if(data->nextX == 0xff || data->nextY == 0xff)//tail
{
if(posX == data->previousX && posY == data->previousY -1)//up
{
icon = (void*)GET_ICONATTR(ICON_SNAKE_BODY,6)->icons;
iconmask = (void*)GET_ICONATTR(ICON_SNAKE_BODYMASK,6)->icons;
}
else if(posX == data->previousX && posY == data->previousY +1)//down
{
icon = (void*)GET_ICONATTR(ICON_SNAKE_BODY,5)->icons;
iconmask = (void*)GET_ICONATTR(ICON_SNAKE_BODYMASK,5)->icons;
}
else if(posX == data->previousX - 1 && posY == data->previousY )//left
{
icon = (void*)GET_ICONATTR(ICON_SNAKE_BODY,8)->icons;
iconmask = (void*)GET_ICONATTR(ICON_SNAKE_BODYMASK,8)->icons;
}
else if(posX == data->previousX + 1 && posY== data->previousY )//right
{
icon = (void*)GET_ICONATTR(ICON_SNAKE_BODY,7)->icons;
iconmask = (void*)GET_ICONATTR(ICON_SNAKE_BODYMASK,7)->icons;
}
}
else
{
icon = (void*)GET_ICONATTR(ICON_SNAKE_BODY,4)->icons;
iconmask = (void*)GET_ICONATTR(ICON_SNAKE_BODYMASK,4)->icons;
}
break;
default:
break;
}
if(icon)
{
posX = GameSnake_ZonePosX+posX*GameSnake_Diamond;
posY = GameSnake_ZonePosY+posY*GameSnake_Diamond;
if(iconmask)
{
dspl_BitBlt(posX,posY,
GameSnake_Diamond,GameSnake_Diamond,
0, (void *)icon, DSPL_BMPXOR);
dspl_BitBlt(posX,posY,
GameSnake_Diamond,GameSnake_Diamond,
0, (void *)iconmask, DSPL_BMPAND);
dspl_BitBlt(posX,posY,
GameSnake_Diamond,GameSnake_Diamond,
0, (void *)icon, DSPL_BMPXOR);
}
else
{
dspl_BitBlt(posX,posY,
GameSnake_Diamond,GameSnake_Diamond,
0, (void *)icon, 0);
}
}
}
void redrawAll()
{
int i;
int j;
U32 oldColor;
dspl_ClearAll();
dspl_DrawRect(GameSnake_ZonePosX - 1,GameSnake_ZonePosY,
GameSnake_ZonePosX - 1 + GameSnake_Width*GameSnake_Diamond+1,
GameSnake_ZonePosY + GameSnake_Height*GameSnake_Diamond - 1);
//draw bkg
for(i = 0; i< GameSnake_Height; i += GameSnake_BkgDiamond)
{
for(j = 0; j< GameSnake_Width;j += GameSnake_BkgDiamond )
{
DRAW_ICON_ATTRIBUTE(ICON_SNAKE_BKG, GameSnake_ZonePosX + j * GameSnake_Diamond, GameSnake_ZonePosY + i * GameSnake_Diamond, 0, ICON_LOCATION);
/*dspl_BitBlt(GameSnake_ZonePosX + j * GameSnake_Diamond,
GameSnake_ZonePosY + i * GameSnake_Diamond,
GameSnake_BkgDiamond*GameSnake_Diamond,
GameSnake_BkgDiamond*GameSnake_Diamond,
0,
(void *)GetIconAttr(ICON_SNAKE_BKG,0)->icons,//(void *)snake_BkgDiamond,
0); */
}
}
for(i = 0;i<GameSnake_Width; i++)
{
for(j = 0; j<GameSnake_Height ;j++)
{
if(snakedata.Diamonddata[i][j].state != Snake_Diamond_None)
{
drawDiamond(i,j);
}
}
}
//oldColor = dspl_SetBkgColor(0xBDBF9B);
//dspl_fill_rectangle(0, GameSnake_Height * GameSnake_Diamond -1 , SCREEN_WIDTH , SCREEN_HIGH);
//dspl_SetBkgColor(oldColor);
//draw speed
//2004/07/01 yhf modify
drawGameNumber(85, GameSnake_Diamond *GameSnake_Height, snakedata.speed);
//draw score
drawGameNumber(20, GameSnake_Diamond *GameSnake_Height, snakedata.score);
}
void SnakeData_Init()
{
readSnakeMap();
gernateFood(0);
snakedata.speed = 0;
snakedata.score = 0;
snakedata.uMove = MoveUp;
flash_Gameread();
}
/********************win function****************************/
static int GameSnake_win_cb (MfwEvt e, MfwWin *w)
{
U8 uMode;
#if (MAIN_LCD_SIZE==3)
Snake_Data* data = (Snake_Data *)w->user;//shiheng porting
#endif
switch ( e )
{
case MfwWinVisible:
uMode = dspl_Enable(0);
switch(snakedata.uGameState)
{
#if (MAIN_LCD_SIZE==3)
case Snake_Init:
Snake_MnuShow();
//snake_MnuItemIcnShow(&snakedata);
//timStart(snakedata.timer);
break;
#endif
case Snake_Ready:
SnakeData_Init();
//timStart(snakedata.timer);
redrawAll();
break;
#if(MAIN_LCD_SIZE==3)
case Snake_Help:
dspl_ClearAll();
// snake_help();/*2004/5/26, wy modify*///shiheng porting
game_display_help(data->edt);
break;
#endif
case Snake_Running:
redrawAll();
break;
case Snake_Exit:
//dspl_ClearAll();
//Draw_Dialog((char *)MmiRsrcGetText(TxtExitGame));
draw_icon_require();
#if(MAIN_LCD_SIZE==3)//jhxu720
ALIGNED_PROMPT(CENTER_RIGHT, DIALOG_HALF_FIRSTSECOND, DSPL_TXTATTR_TRANSPARENT, TxtExitGame);
#else
ALIGNED_PROMPT(CENTER, DIALOG_FIRST_LINE, DSPL_TXTATTR_TRANSPARENT, TxtExitGame);
#endif
dsplsoftkey(TxtGameGoon, TxtGameExit);
break;
case Snake_Rank://score
if(Snake_Init == snakedata.uGameStateOld)
Game_Scoreshow(&ffs_gamedata.Snake_ffsScore,-1,0,0);
else
Game_Scoreshow(&ffs_gamedata.Snake_ffsScore,snakedata.score,0,1);
break;
case Snake_KeyInfo:
dspl_ClearAll();
Key_Setshow(2);
break;
case Snake_Select:
dspl_ClearAll();
Game_StageSelect(SNAKE_STAGE,snakedata.stage+1,(char *)snakedata.gameselect);
break;
default:
break;
}
dspl_Enable(uMode);
break;
case MfwWinFocussed: /* input focus / selected */
case MfwWinDelete: /* window will be deleted */
default:
return MFW_EVENT_REJECTED;
}
return MFW_EVENT_CONSUMED;
}
void GameSnakeDestroy (T_MFW_HND own_window)
{
flash_Gamewrite();
win_delete (snakedata.win);
}
static int GameSnake_kbd_cb (MfwEvt e, MfwKbd *k)
{
int len = 0;
U8 uflags = 0;
#if (MAIN_LCD_SIZE==3)
T_MFW_HND win = mfw_parent (mfw_header());//shiheng porting
char *text;//shiheng porting
#endif
Snake_Data *data = (Snake_Data*)&snakedata;
if(!(e & KEY_MAKE))
return MFW_EVENT_CONSUMED;
//Game Running
if(data->uGameState == Snake_Running)
{
switch ( k->code )
{
case KCD_MNUUP:
if(data->uMove!=MoveDown)
{
uflags = 1;
data->uMove = MoveUp;
}
break;
case KCD_MNUDOWN:
if(data->uMove!=MoveUp)
{
uflags = 1;
data->uMove = MoveDown;
}
break;
case KCD_MNULEFT:
if(data->uMove!=MoveRight)
{
uflags = 1;
data->uMove = MoveLeft;
}
break;
case KCD_MNURIGHT:
if(data->uMove!=MoveLeft)
{
uflags = 1;
data->uMove = MoveRight;
}
break;
case KCD_CALL://Pause
setSnakeGameState( Snake_Pause);
timStop(data->timer);
break;
case KCD_RIGHT:
case KCD_HUP:
setSnakeGameState(Snake_Exit);
winShow(data->win);
break;
case KCD_LEFT:
case KCD_OK:
break;
default:
break;
}
if(uflags)
domoveSnake();
// return MFW_EVENT_CONSUMED;
}
//Game Init
else if(data->uGameState == Snake_Init)
{
switch ( k->code )
{
case KCD_1:
case KCD_2:
case KCD_3:
case KCD_4:
if(data->R_CurSlect+1 != k->code)
{
data->R_CurSlect = k->code - 1;
uflags = 1;
}
break;
case KCD_MNUUP:
if(data->R_CurSlect)
{
data->R_CurSlect --;
}
else
{
data->R_CurSlect = 3;
}
uflags = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -