⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 games_cargador.c

📁 几个嵌入式手机平台小游戏c源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
                case EDITOR_RET_BACK:/*Notify you the user press skey right(BACK)*/
                        App_change_state( (APP_DATA_STRUCTURE_NAME_T *)&gamesApp_data.app, 
                            (APP_SUBSTATE_STRUCTURE_NAME_T *)&games_substate, 
                            (OP_UINT8) APP_GAMES_STATE_MENU);
                     break;
                case EDITOR_RET_CALL_COME:
                    call_come_in_editor = OP_TRUE;
                    break;
                default:
                    break;
                }
                break;        
        case OPUS_FOCUS_CUST_PAINT :
            if ( (pMess != OP_NULL) && (*((OP_BOOLEAN *)pMess) == OP_TRUE))
            {
                if(call_come_in_editor)
                {
                    APP_Cargador_select();
                    call_come_in_editor = OP_FALSE;
                }
                else if (inGame)
                {
                    if (ds_get_screen_mode() != SCREEN_GENERAL)
                        ds_set_screen_mode( SCREEN_GENERAL);
                    gamePause = OP_FALSE;
                    guy_moved_count = 0;
                    ds_set_softkeys_rm( PMPT_SKEY_RESTART,PMPT_SKEY_EMPTY, PMPT_SKEY_BACK);
                    RePaint();
                    TPO_SetCurrent_RPU(TPO_RUI_GAMES);
               }
                /*else /* when in select level popup, there is a sms or call incoming, back to here */
                /*{
                    Games_change_state((OP_UINT8) APP_GAMES_STATE_MENU);
                }*/
            }
            else 
                ds_refresh();
            break;

        case OPUS_TIMER_KEYPRESS_REPEAT:
            pKey = (KEYEVENT_STRUCT *)pMess;
            if (gamesApp_data.popupwin != OP_NULL)
            {
                ds_pass_event_to_popup(gamesApp_data.popupwin, OPUS_TIMER_KEYPRESS_REPEAT, pKey);
            }
            break;

        case OPUS_FOCUS_KEYPAD :
            pKey = (KEYEVENT_STRUCT *)pMess;

            if(pKey->state == UHKEY_RELEASE) 
                break;
            OPUS_Stop_Timer(OPUS_TIMER_GAME_TIMING);

            onKeyPress(pMess);
            op_debug(DEBUG_MED,"ok!!!key pressed.");
            break;

        case OPUS_TIMER_POPUP_MSG:
            cargador_pop_msg_processing();
            break;
        
        case OPUS_FOCUS_CUST_APP_PAUSE:
            gamePause = OP_TRUE;
             OPUS_Stop_Timer(OPUS_TIMER_GAME_TIMING);
          OPUS_Stop_Timer(OPUS_TIMER_GAME_PEN);
            if (gamesApp_data.popupwin!= OP_NULL)
            {
                close_old_popup();
                /* 
                 * If a call come in  when we just passed a level and a popup is displayed (when inGame == OP_TRUE), 
                 * we should initialize the status for the next level here.
                 */
                //if (inGame)  /*Lixingbo modified,because when level passed, inGame always OP_FALSE,so the next can't reach.*/
                    APP_Cargador_Init(); 
            }
            break;
        
        case OPUS_TIMER_GAME_TIMING:
            OPUS_Stop_Timer(OPUS_TIMER_GAME_TIMING);
             if (inGame)
             {
                switch(state)          
                {  
                    case UP :
                        if(style_state ==1)
                        {
                            DrawSquare(MX,MY,BMP_CARGADOR_PUSHU);
                            style_state =0;
                        }
                        else
                        {
                            DrawSquare(MX,MY,BMP_CARGADOR_BACK_RIGHT);
                            style_state =1;
                        }
                        break;
                    case DOWN :  
                        if(style_state ==1)
                        {
                            DrawSquare(MX,MY,BMP_CARGADOR_PUSHD);
                            style_state =0;
                        }
                        else
                        {
                        DrawSquare(MX,MY,BMP_CARGADOR_FORWARD_RIGHT);
                        style_state =1;
                        }
                        break;
                    case LEFT :
                        if(style_state ==1)
                        {
                            DrawSquare(MX,MY,BMP_CARGADOR_PUSHL);
                            style_state =0;
                        }
                        else
                        {
                            DrawSquare(MX,MY,BMP_CARGADOR_LEFT_STOP);
                            style_state =1;
                        }
                        break;
                    case RIGHT :  
                        if(style_state ==1)
                        {
                            DrawSquare(MX,MY,BMP_CARGADOR_PUSHR);
                            style_state =0;
                        }
                        else
                        {
                            DrawSquare(MX,MY,BMP_CARGADOR_RIGHT_STOP);
                            style_state =1;
                        }
                        break;
                        
                }
                
             }
              ds_refresh();
              guy_moved_count++;
              if (guy_moved_count < MAX_MOVEMENT_COUNT)
              {
                  OPUS_Start_Timer(OPUS_TIMER_GAME_TIMING, 500, 0,  PERIODIC);
              }
             break;
        case OPUS_FOCUS_OPERATION:
           pOperation_param = (TPO_OPERATION_PARAM_STRUCTURE_T *)pMess;
           switch (pOperation_param->op)   
           {
           case OPERATION_ID_SK_CONFIRM:
               {
                       switch(pOperation_param->id)
                       {
                           case COMMAND_SOFTKEY_RIGHT:
                                     Games_change_state((OP_UINT8) APP_GAMES_STATE_MENU);
                              break;
                           case COMMAND_SOFTKEY_LEFT:
                                if(inGame)
                                    APP_Cargador_Init();
                                break;
                           default:
                              break;
                       }
               }
                break;
            default:
                break;
           }
           break;
        case OPUS_TIMER_GAME_PEN:
            /* When games pen timer arrived,let the guy move.*/
            op_debug(DEBUG_MED,"OPUS_TIMER_GAME_PEN\n");
            cargador_route_move();
                
            break;
        case OPUS_FOCUS_PEN :
            /* Record the pen message and run the timer for game pen.*/
                pPen = pMess;
                if(pPen->state == TP_PEN_STATE_PENDN && pPen->y >= LCD_ANNUN_HIGH)
                {
                       penx = pPen->x;
                       peny = pPen->y;
                    OPUS_Stop_Timer(OPUS_TIMER_GAME_PEN);
                    /*OPUS_Start_Timer(OPUS_TIMER_GAME_PEN, 60, 0,  ONE_SHOT);*/
                    cargador_pen_process(penx, peny);
                }
            break;
      
            default :
            *handle = OP_FALSE;
            break;
    }
    op_debug(DEBUG_LOW,"CAR:App_Cargador_handler\n");
}
/*==================================================================================================
    FUNCTION: cargador_route_move

    DESCRIPTION:
        Description of this specific function.

    ARGUMENTS PASSED:

    RETURN VALUE:

    IMPORTANT NOTES:
    
==================================================================================================*/
static OP_BOOLEAN cargador_route_move()
{
    OP_UINT8 OldMX, OldMY, OldState;
    OP_UINT8 OldBox[rowNum][colNum];
    OP_INT8 i,j;
    OP_BOOLEAN hasMoved = OP_FALSE;
    
    op_debug(DEBUG_MED,"CargadorRouteMove()\n");
    /* Record the old message of the cargador map.*/
      OldMX = MX;
      OldMY = MY;
      OldState = state;
      for(i=0;i<current_height;i++)
        {
        for(j=0;j<current_width;j++)
            {
                OldBox[i][j] = Current_Box[i][j];
            }
        }
    pathstep++;
    if(pathstep+2 <= CargadorCurPath)
        {
            hasMoved = MoveTo(CargadorPath[pathstep].seat.x-MX, CargadorPath[pathstep].seat.y-MY);
        }
    if (hasMoved) 
      { 
            Old_MX = OldMX;
            Old_MY = OldMY;
            Old_State = OldState;
            for(i=0;i<current_height;i++)
                {
                    for(j=0;j<current_width;j++)
                    { 
                        Old_Box[i][j] = OldBox[i][j];
                    }
                }
          }
    if(pathstep+2 < CargadorCurPath)
        {
            OPUS_Start_Timer(OPUS_TIMER_GAME_PEN, 60, 0,  ONE_SHOT);
        }
    return OP_TRUE;
}
/*==================================================================================================
    FUNCTION: cargador_pen_process

    DESCRIPTION:
        Description of this specific function.

    ARGUMENTS PASSED:

    RETURN VALUE:

    IMPORTANT NOTES:
    
==================================================================================================*/
static OP_BOOLEAN cargador_pen_process(OP_INT16 x,OP_INT16 y)
{
    OP_INT8 posx,posy;
    PosType start,end;
    OP_UINT8 OldMX, OldMY, OldState;
    OP_UINT8 OldBox[rowNum][colNum];
       OP_BOOLEAN Success=OP_FALSE;
    OP_INT8 i,j;
    OP_BOOLEAN hasMoved = OP_FALSE;

    op_debug(DEBUG_MED,"CargadorPenProcess()\n");
    guy_moved_count = 0;
    pathstep = 0;
    posx = (x -xoffset)/RECTWIDTH;
    posy = (y -yoffset-LCD_ANNUN_HIGH)/RECTHEIGHT;
    start.x = MX;
    start.y = MY;
    end.x = posx;
    end.y = posy;
    /* Record the old message of the cargador map.*/
      OldMX = MX;
      OldMY = MY;
      OldState = state;
      for(i=0;i<current_height;i++)
        {
        for(j=0;j<current_width;j++)
            {
                OldBox[i][j] = Current_Box[i][j];
            }
        }
    if(Current_Box[end.y][end.x] == GREEN_BLOCK ||
        Current_Box[end.y][end.x] == YELLOW_BLOCK)
        {
            if(end.x == start.x && end.y - start.y == 1
                || end.x == start.x && end.y - start.y == -1
                || end.y == start.y && end.x - start.x == 1
                || end.y == start.y && end.x - start.x == -1)
                {
                    hasMoved = MoveTo(end.x-start.x, end.y-start.y);
                }
        }
    if (hasMoved) 
      { 
            Old_MX = OldMX;
            Old_MY = OldMY;
            Old_State = OldState;
            Success=OP_TRUE;
            for(i=0;i<current_height;i++)
                {
                    for(j=0;j<current_width;j++)
                    { 
                        if(Current_Box[i][j]==2||Current_Box[i][j]==3)
                            {
                                Success=OP_FALSE;
                            }
                        Old_Box[i][j] = OldBox[i][j];
                    }
                }
          }
       if (Success)
       {
        ShowLevelPassed();
        return OP_TRUE;
       }
       if(!hasMoved)
       {
        SearchRoute(start,  end);
        if(CargadorCurPath != rowNum*colNum
            && CargadorCurPath != 2)
            {
                OPUS_Start_Timer(OPUS_TIMER_GAME_PEN, 60, 0,  ONE_SHOT);
                op_debug(DEBUG_MED,"OPUS_Start_Timer:OPUS_TIMER_GAME_PEN\n");
            }
        else
            {
                if (gamesApp_data.audio_on == OP_TRUE)
                    {
                            SP_Audio_play_request(sound_list[2], gamesApp_data.volume, OP_FALSE);
                    }
            }
    }
    return OP_TRUE;
}

/*==================================================================================================
    FUNCTION: APP_Cargador_select

    DESCRIPTION:
        Description of this specific function.

    ARGUMENTS PASSED:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -