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 + -
显示快捷键?