mmiballoon.c
来自「是一个手机功能的模拟程序」· C语言 代码 · 共 2,004 行 · 第 1/5 页
C
2,004 行
T_MFW_WIN * win_data = ((T_MFW_HDR *)win)->data;
Balloon_Game *data = (Balloon_Game *)win_data->user;
T_MFW_HND *l_parent;
SHORT l_id;
switch (e)
{
default:
return MFW_EVENT_REJECTED;
}
return MFW_EVENT_CONSUMED;
}
int balloontimerfunc(MfwEvt e, MfwTim *bmtime)
{
T_MFW_HND win = mfw_parent (mfw_header());
T_MFW_WIN * win_data = ((T_MFW_HDR *)win)->data;
Balloon_Game * data = (Balloon_Game *)win_data->user;
BalloonItemHeader *pheader=data->pheader;
BalloonTotal * balloontotal=pheader->balloontotal;
char * pscreenbuffer=(char *)data->pscreenbuffer;
INT8 umode;
TraceMMI("balloontimerfunc");
timStop(data->bltimer);
data->balloonTimeflag=0;
umode=dspl_Enable(0);
if(winIsFocussed(data->win)==0)
{
winfocusout = 1;
//set_backlight_on();//2004-03-25 Sunny remove
}
else
{
winfocusout=0;
#if 0//2004-03-25 Sunny remove
if(!g_lcd_game_flag&&( ffs_gamedata.Balloon_Ffskeyload[1].keyCode%40))
set_backlight_off();
#endif
}
//TraceMMIValue_EAST("balloontimerfunc",);
switch(l_mode)
{
case BALLOONPLAY:
if(winfocusout==0)
{
ypositionadd(pheader,pscreenbuffer);
movecursor(pheader);
showcursor(pscreenbuffer);
if(balloontotal->countall>=33 && pheader->ballooncount==0)
{
gameover(pheader);
// gameinterfaceshow(pheader,pscreenbuffer);
winShow(data->win);
break;
}
timStart(data->bltimer);
data->balloonTimeflag=1;
}
break;
case BALLOONSETTING:
keysetting.keySetstatus=1;
dspl_ClearAll();
Key_Setshow((void *)&keysetting);
break;
case BALLOONINITIAL:
if(winfocusout==0 && data->balloonTimeflag==0)
{
Balloon_Mnushow();
timStart(data->bltimer);
data->balloonTimeflag=1;
}
break;
default:
break;
}
dspl_Enable(umode);
return MFW_EVENT_CONSUMED;
}
/*************************************************************************************
函数名:balloonheadinitial
描述:如果已经有42个气球并且当前屏幕上已经没有气球
了就认为游戏结束
*************************************************************************************/
void gameover(BalloonItemHeader *pheader)
{
l_mode=BALLOONWIN;
totalscore=pheader->score+totalscore;
removeallitem(pheader);
}
/*************************************************************************************
函数名:balloonheadinitial
描述:新的游戏
*************************************************************************************/
void newgame(BalloonItemHeader* pheader)
{
U8 increament;
BalloonGamelevel = keysetting.gamedifficult;
if(BalloonGamelevel>=SpeedMax || BalloonGamelevel==0)
{
BalloonGamelevel=SpeedOne;
keysetting.gamedifficult=SpeedOne;
}
increament=BalloonGamelevel/2+2;
Set_Bs_Btimer(pheader,BalloonGamelevel);
balloonheadinitial(pheader);
cursor.xposition=CURSORWIDTH+52;
/*设定cursor的yposition避免出现在最上面时候,cursor_resume和showcursor
中恢复原有的图形出现yposition的值是负1*/
cursor.yposition=CURSORWIDTH+55+pheader->balloonspeed;//+increament
cursor.balloonnext=NULL;
cursor.balloontype=0;
cursor.speed=0;
cursor.flag=0;
}
/************************************************************************************
函数定义
**************************************************************************************/
/*************************和数据结构相关的************************************/
/*************************************************************************************
函数名:balloonheadinitial
描述:此函数用于初始化链表的头,把光标的地址作为链表的
头,一般用于游戏开始的时候
*************************************************************************************/
void balloonheadinitial(BalloonItemHeader *pheader)
{
BalloonTotal *balloontotal=(BalloonTotal *)ALLOC_MEMORY(sizeof(BalloonTotal));
if(balloontotal){
memset(balloontotal,0,sizeof(BalloonTotal));
memset(pheader->hitcount,0,8*sizeof(char));
pheader->keycode=0;
pheader->fireflag=0;
pheader->ballooncount=0;
pheader->score=0;
pheader->pfirst=&cursor;
pheader->plast=&cursor;
pheader->balloontotal=balloontotal;
}
TRACE_EVENT("balloonheadinitial");
}
/*************************************************************************************
函数名:addballoonitem
描述:添加一个新的元素并为其分配空间,修改链表
*************************************************************************************/
void addballoonitem(BalloonItemHeader *pheader)
{
BalloonItem *newballoon=(BalloonItem*)ALLOC_MEMORY(sizeof(BalloonItem));
BalloonItem *lastballoon;
TRACE_EVENT("addballoonitem ty");
if(pheader->plast)
lastballoon=pheader->plast;
else
lastballoon=pheader->pfirst;
if(newballoon)
{
if(!(pheader->pfirst->balloonnext))
pheader->pfirst->balloonnext=newballoon;
iteminitial(newballoon,pheader);
pheader->ballooncount++;
// pheader->keycode=0; 纠正了一个小bug
lastballoon->balloonnext=newballoon;
pheader->plast=newballoon;
countballoontotal(pheader);
}
}
/*************************************************************************************
函数名:balloonheadinitial
描述:此函数用于初始化新建元素,包括设定气球的类型、气球
的坐标,气球的速度等等
*************************************************************************************/
void iteminitial(BalloonItem *newballoon,BalloonItemHeader *pheader)
{
U16 random,randomtype,balloonsize;
// TRACE_EVENT("iteminitial");
random=randomxpositioncreate(pheader);
randomtype=randomtypecreate(pheader);
newballoon->xposition=random;
newballoon->balloonnext=NULL;
newballoon->balloontype=randomtype;
newballoon->speed=pheader->balloonspeed;
balloonsize=balloonproperty[randomtype].height*2;
newballoon->yposition=CURSORYMAX-balloonsize;
// newballoon->yposition=140;
newballoon->flag=0;
#ifdef BALLOONDEBUG
zgzTraceDataFunc("iteminitial xposition", (U16)random);
zgzTraceDataFunc("iteminitial balloontype", (U16)randomtype);
#endif
}
/*************************************************************************************
函数名:balloonheadinitial
描述:此函数用于删除被标志的元素
*************************************************************************************/
void removeelement(BalloonItemHeader *pheader)
{
BalloonItem *oldballoon,* tempballoon;
BalloonTotal *balloontotal;
short xpos,ypos,balloonsize;
balloontotal=pheader->balloontotal;
TRACE_EVENT ("removeelement()");
oldballoon=pheader->pfirst;
#ifdef BALLOONDEBUG
zgzTraceDataFunc("rmballoonnumber1", (U16)balloontotal->countall);
#endif
//删除被标志的气球
while(oldballoon)
//原来是把oldballoon->balloonnext作为判定的条件但是下面删除的
//却是oldballoon所以就不能删除最后一个被击中的气球
{
//取得第一个气球,或者下一个气球
tempballoon=oldballoon->balloonnext;
if( tempballoon && ( tempballoon->flag==1 ||tempballoon->flag==2))
//气球被击中或者气球移出界外
{
// zgzTraceDataFunc("removeelementbc", (U16)pheader->ballooncount);
//如果下一个气球为空就设成NULL主要是怕出错
if(tempballoon->balloonnext)
oldballoon->balloonnext=tempballoon->balloonnext;
else
oldballoon->balloonnext=NULL;
pheader->ballooncount--;
#ifdef BALLOONDEBUG
zgzTraceDataFunc("removeelementflag", (U16)tempballoon->flag);
#endif
xpos=tempballoon->xposition;
ypos=tempballoon->yposition;
balloonsize=2*balloonproperty[tempballoon->balloontype].height;
//如果出现ypos是小于0的情况
dspl_Clear(xpos,LAGER(0, ypos),xpos+balloonsize,ypos+balloonsize);
if(tempballoon->flag==1)
//如果出现ypos是小于0的情况
lcdischange=get_freshsize(xpos,LAGER(0, ypos),balloonsize+SMALLER(0, ypos),balloonsize);//设置lcd已经刷新了
#ifdef BALLOONDEBUG
zgzTraceDataFunc("removeelementlcdischange", (U16)lcdischange);
#endif
FREE_MEMORY ((void *)tempballoon, sizeof (BalloonItem));
}
else
//将下一个气球的地址付给oldballoon
if(tempballoon)
oldballoon=tempballoon;
else
oldballoon=NULL;
/*下面的这段代码处理主要是为了处理这样的一种情况
如果最后一个气球被击中那么就需要将前一个气球
设定为最后一个气球*/
if(!(oldballoon->balloonnext))
pheader->plast=oldballoon;
if(oldballoon==pheader->plast)
{
oldballoon->balloonnext=NULL;
}
}
#ifdef BALLOONDEBUG
zgzTraceDataFunc("rmballoonnumber2", (U16)balloontotal->countall);
#endif
}
/*************************************************************************************
函数名:balloonheadinitial
描述:删除所有的元素
*************************************************************************************/
void removeallitem(BalloonItemHeader *pheader)
{
BalloonItem *oldballoon,* tempballoon;
BalloonTotal *balloontotal;
oldballoon=pheader->pfirst;
oldballoon=oldballoon->balloonnext;
while(oldballoon)
{
tempballoon=oldballoon->balloonnext;
FREE_MEMORY ((void *)oldballoon, sizeof (BalloonItem));
oldballoon=tempballoon;
}
balloontotal=pheader->balloontotal;
FREE_MEMORY ((void *)balloontotal, sizeof (BalloonTotal));
oldballoon=pheader->pfirst;
pheader->plast=NULL;
oldballoon->balloonnext=NULL;
pheader->ballooncount=NULL;
}
/*************************************************************************************
函数名:cursor_resume
描述:当每次整个图形上移increament的时候这时光标也就会上移
这样必须恢复原来图形,然后得到光标将要显示位置的
内容
**************************************************************************************/
void cursor_resume(BalloonItemHeader *pheader, char *pscreenbuffer)
{
U16 prexposition,preyposition;
U8 increament;
increament=BalloonGamelevel/2+2;
prexposition=cursor.xposition-CURSORWIDTH;
if(pheader->fireflag!=1)
preyposition=cursor.yposition-CURSORWIDTH-pheader->balloonspeed;//-increament
else
preyposition=cursor.yposition-CURSORWIDTH;
if(lcdischange==0)
{
dspl_BitBlt(prexposition,preyposition,CURSORSIZE,CURSORSIZE,0,(void *)pscreenbuffer, 0);
}
else
{
clear_remain(pscreenbuffer,prexposition,preyposition);
lcdischange=0;
}
preyposition=cursor.yposition-CURSORWIDTH;
dspl_getscreen(prexposition,preyposition,CURSORSIZE,CURSORSIZE, pscreenbuffer);
//memset(pscreenbuffer,0xff,(CURSORSIZE*CURSORSIZE*2)*sizeof(char)); //for test
}
void dspl_all(BalloonItemHeader *pheader, char* pscreenbuffer)
{
BalloonItem *tempballoon;
U32 pixcolor,oldcolor;
game_Line cursorline1,cursorline2;
tempballoon=pheader->pfirst;
while(tempballoon)
{
tempballoon=tempballoon->balloonnext;
if(tempballoon)
balloondisplay(tempballoon);
}
dspl_getscreen(cursor.xposition-CURSORWIDTH,cursor.yposition-CURSORWIDTH,CURSORSIZE,CURSORSIZE, pscreenbuffer);
pixcolor=*(U16 *)(pscreenbuffer+CURSORSIZE*CURSORSIZE);
cursorline1.x1=cursor.xposition-CURSORWIDTH;
cursorline1.x2=cursor.xposition+CURSORWIDTH;
cursorline1.y1=cursorline1.y2=cursor.yposition;
cursorline1.color=0x0;//(~pixcolor)&0x00ffffff;
cursorline2.y1=cursor.yposition-CURSORWIDTH;
cursorline2.y2=cursor.yposition+CURSORWIDTH;
cursorline2.x1=cursorline2.x2=cursor.xposition;
cursorline2.color=0x0;//(~pixcolor)&0xffff;
DrawLine(cursorline1);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?