games_starwar.c

来自「几个嵌入式手机平台小游戏c源代码」· C语言 代码 · 共 2,173 行 · 第 1/5 页

C
2,173
字号
                    }

                }
            }
        }
    }


}


static void testCrash(void)
{
    OP_INT16 i;
    for(i = 0; i < maxEnemies; i++)
        {
            if(enemies[i].id >= 0 && (shipY+shipHeight > enemies[i].y) && 
                (shipY+2 < enemies[i].y + enemiesHeight[enemies[i].id]) &&  /* here use (shipY + 2) to make the crash look more nearly real */
                (shipX+shipWidth > enemies[i].x) && 
                (shipX < enemies[i].x + enemiesWidth[enemies[i].id]))
            {
                score = score>50 ?score-50:0;

                enemies[i].x += (enemiesWidth[enemies[i].id]-bomWidth)/2;
                enemies[i].y += (enemiesHeight[enemies[i].id]-bomHeight)/2;
                enemies[i].id = -1;
                enemies[i].frame = bframes;
                enemyCount--;
                HitShip();  
                if (scur<=0)   /*if game over, break here. Or else there will be an error( more than one popup window will appear)*/
                    break;
            }
        }
}

static void HitShip(void)
{
    scur--;
    if (scur<=0) 
    {
        isGameOver=OP_TRUE;
    }
    else
   {
        shipVibrationCount=1;
        hmi_vibrator_on(); 
   }
}

static void DelEnemy(OP_INT16 n)
{
    enemies[n].id = -1;
    enemies[n].x = -1;
    enemies[n].frame = -1;
    if (enemyCount>0)
        enemyCount--;
}

static void DelPlayerFire(OP_UINT8 n)
{
    playerFires[n].active = OP_FALSE;
    playerFires[n].x=-1;
    playerFires[n].frame=-1;
#ifndef WIN32
#ifdef PACIFIC_VERSION
    ds_fill_rect(playerFires[n].x , 
#else
    Games_direct_fill_rect(playerFires[n].x , 
#endif
                                        playerFires[n].y,  
                                        playerFires[n].x+bulWidth, 
                                        playerFires[n].x+bulHeight,
                                        STARWAR_BG_COLOR);
#endif
}

static void DelEnemyFire(OP_UINT8 n)
{
    enemyFires[n].active = OP_FALSE;
    enemyFires[n].x=-1;
    enemyFires[n].frame=-1;
#ifndef WIN32
#ifdef PACIFIC_VERSION
    ds_fill_rect(enemyFires[n].x , 
#else
    Games_direct_fill_rect(enemyFires[n].x , 
#endif
                                        enemyFires[n].y,  
                                        enemyFires[n].x+bulWidth, 
                                        enemyFires[n].x+bulHeight,
                                        STARWAR_BG_COLOR);
#endif
}


static void levelPassed(void)
{
    OP_UINT8 n;
    
    atLevelEnd = OP_TRUE;
    current_level ++;
    dy=-1;
    dx=0;
    keepFiring=OP_FALSE;
    
    /* when level passed, delete all the enemy bullets */
    for (n=0; n<maxBullet; n++) 
    {
        enemyFires[n].active = OP_FALSE;
        enemyFires[n].frame=-1;
    }
    
    if (current_level >= 5)
    {
        isGameOver=OP_TRUE;
    }
}


static void GameOver(void)
{
    char ss[10];
    OP_UINT8 ustr[MAX_STRING_LENGTH];
    OP_UINT8 tmpstr[MAX_STRING_LENGTH];

    inGame=OP_FALSE;
    OPUS_Stop_Timer(OPUS_TIMER_GAME_TIMING);
    hmi_vibrator_off(); 

    op_memset((void*)ustr, 0, MAX_STRING_LENGTH); 
    op_memset((void*)tmpstr, 0, MAX_STRING_LENGTH);

    if (score > 0 && is_new_highscore(APP_GAMES_STARWAR, score))
    {
        util_get_text_from_res_w_max_len(PMPT_TEXT_CONGRATULATION,ustr,MAX_STRING_LENGTH);
        //AtoU(tmpstr, (OP_UINT8 *)"A new highscore:");
        util_get_text_from_res_w_max_len(PMPT_TEXT_NEW_HIGHSCORE,tmpstr,MAX_STRING_LENGTH);
    }
    else
    {
        util_get_text_from_res_w_max_len(PMPT_TEXT_GAME_OVER,ustr,MAX_STRING_LENGTH);
        util_get_text_from_res_w_max_len(PMPT_TEXT_YOUR_SCORE,tmpstr,MAX_STRING_LENGTH);
    }
    Ustrcat(ustr,tmpstr);
    
    op_sprintf(ss,"%d",score);
    AtoU(tmpstr,(OP_UINT8 *)ss);
    Ustrcat(ustr,tmpstr);

    gamesApp_data.popupwin=ds_popup_message(OP_NULL, ustr, DS_POPUP_DEFAULT_MSG_TIME);
}


static void drawDigit(OP_INT16 wInteger,OP_INT16 x, OP_INT16 y)
{
    OP_UINT8 buffer[8]; 
    OP_UINT8 strINT[16];
    
    op_sprintf((char *)buffer, "%d", wInteger);
    AtoU(strINT, buffer);
    draw_text(AREA_BITMAP, x, y, LCD_MAX_X-1, strINT, FONT_SIZE_SMALL|FONT_OVERLAP, COLOR_BLUE_VIOLET, COLOR_TRANS);
}

#ifndef  PACIFIC_VERSION

static void Games_refresh(void)
{
#ifdef WIN32
    ds_refresh(); 
#else
    HD66766_high_speed_write_region (ds.rcUpdate.left, 
                                     ds.rcUpdate.top, 
                                     ds.rcUpdate.right, 
                                     ds.rcUpdate.bottom,  
                                     bitmap_screen,
                                     LCD_MAX_X,
                                     ds.rcUpdate.top,
                                     ds.rcUpdate.left); 

    clear_update_region();    
#endif
}

static void Games_direct_draw_icon_rm 
(
    OP_INT16           x,
    OP_INT16           y,
    RM_RESOURCE_ID_T    icon_res_id
)
{
    RM_ICON_T          *icon;
    OP_INT16    i, j;
    DS_COLOR    *image;

    OP_INT16    left, right, top, bottom;
    OP_UINT16 * screen_ptr;
    
#ifndef WIN32
    int dummy_write_start, dummy_write_end ;
#endif

    icon = (RM_ICON_T *)util_get_icon_from_res(icon_res_id);
    
    if (!icon)  return;
    
    left = MAX(x, 0);
    right=MIN(x+icon->biWidth-1, LCD_MAX_X-1);
    top= MAX(y, 0);
    bottom=MIN(y+icon->biHeight-1, LCD_MAX_Y -1);
    if(right<=0 || bottom <= 0)
        return; 

   image = (DS_COLOR *)icon->data;
   
#ifndef WIN32
    dummy_write_start = left % 4; 
    dummy_write_end =  3 - right % 4 ;

    HD66766_h_ram_addr_pos (right+4, left+4);
    HD66766_v_ram_addr_pos (bottom, top);
    HD66766_ram_address_set (top, left+4-dummy_write_start);

    HD66766_index (DP_ENTRY_MODE);       /* R05h : Entry mode set */
    HD66766_data (0x0230);            /* HWM=1,000,I/D=11,AM=0,LG2-0=000 */

     HD66766_index(DP_WRITE_READ_GRAM);
     
#endif
    
    for (i = top; i <= bottom; i++) 
    {
        screen_ptr = (OP_UINT16 *)image+(i-y)*icon->biWidth+(left-x);
#ifndef WIN32
         for ( j=0 ; j < dummy_write_start ; j++ )
         {
            HD66766_data(*screen_ptr);
         }
#endif
         
        for (j = left; j <= right; j++) 
        {
            if (*screen_ptr != icon->trans) 
            {
                bitmap_screen[i][j] = *screen_ptr;  /* write the region in bitmap_screen buffer synchronously */
#ifndef WIN32
                HD66766_data(*screen_ptr);
#endif
            }
#ifndef WIN32
            else
            {
                HD66766_data(bitmap_screen[i][j]);
            }
#endif
            screen_ptr ++;
        }
#ifndef WIN32
         for ( j=0 ; j < dummy_write_end ; j++ )
         {
            HD66766_data(*screen_ptr);
         }
#endif
    }

#ifdef WIN32
    UPDATESET(AREA_BITMAP);

    /* update updated region*/
    add_update_region(AREA_BITMAP, left, top, right, bottom);  
#endif


}

static void Games_direct_fill_rect 
(
    OP_INT16    left,
    OP_INT16    top,
    OP_INT16    right,
    OP_INT16    bottom,
    DS_COLOR    color
)
{
    OP_INT16    i;
    OP_INT16    row1, row2, col1, col2;
#ifndef WIN32
    OP_INT16    j;
    int dummy_write_start, dummy_write_end ;
#endif

    col1 = MAX(left, 0);
    col2=MIN(right, LCD_MAX_X-1);
    row1= MAX(top, 0);
    row2=MIN(bottom, LCD_MAX_Y -1);
    if (col1 > col2 ||row1 > row2) 
        return; 
        
    for (i = row1; i <= row2; i++) /* write the region in bitmap_screen buffer synchronously */
    {
        wmemset((OP_UINT16 *)&bitmap_screen[i][col1], color, col2-col1+1);
    }

#ifndef WIN32
    dummy_write_start = col1 % 4; 
    dummy_write_end =  3 - col2 % 4 ;

    HD66766_h_ram_addr_pos (col2+4, col1+4);
    HD66766_v_ram_addr_pos (row2, row1);
    HD66766_ram_address_set (row1, col1+4-dummy_write_start);

    HD66766_index (DP_ENTRY_MODE);       /* R05h : Entry mode set */
    HD66766_data (0x0230);            /* HWM=1,000,I/D=11,AM=0,LG2-0=000 */

     HD66766_index(DP_WRITE_READ_GRAM);
     
    
    for (i = row1; i <= row2; i++) 
    {
         for ( j=0 ; j < dummy_write_start ; j++ )
         {
            HD66766_data(bitmap_screen[i][j]);
         }
         
        for (j = col1; j <= col2; j++) 
        {
            HD66766_data(bitmap_screen[i][j]);
        }
         for ( j=0 ; j< dummy_write_end ; j++ )
         {
            HD66766_data(bitmap_screen[i][j]);
         }
    }

#endif

}

#ifndef WIN32
static void clear_all_objects(void)
{
    OP_INT8 i;
    // clear stars
    for (i = 0; i < numStars; i++) 
    {
        Games_direct_fill_rect(starsX[i], starsY[i], starsX[i], starsY[i], STARWAR_BG_COLOR);
    }

    for(i = 0; i < maxEnemies; i++)
    {
        if(enemies[i].id >= 0 && enemies[i].y >= (-1) * enemiesHeight[enemies[i].id] )
        {
            Games_direct_fill_rect(enemies[i].x , 
                                                enemies[i].y,  
                                                enemies[i].x+enemiesWidth[enemies[i].id], 
                                                enemies[i].y+enemiesHeight[enemies[i].id],
                                                STARWAR_BG_COLOR);
        }
        else  if(enemies[i].id < 0 && enemies[i].frame>=0)
        {
            // clear boom 
            Games_direct_fill_rect(enemies[i].x , 
                                                enemies[i].y,  
                                                enemies[i].x+bomWidth, 
                                                enemies[i].y+bomHeight,
                                                STARWAR_BG_COLOR);
            if ((enemies[i].frame==0))
            {
                 enemies[i].frame--;
            }
        }
    }

    for(i = 0; i < maxBullet; i++)
    {
        if(playerFires[i].active)
        {
            Games_direct_fill_rect(playerFires[i].x , 
                                                playerFires[i].y,  
                                                playerFires[i].x+bulWidth, 
                                                playerFires[i].y+bulHeight,
                                                STARWAR_BG_COLOR);
        }
        else  if(playerFires[i].frame>=0)
        {
            // clear boom 
            Games_direct_fill_rect(playerFires[i].x , 
                                                playerFires[i].y,  
                                                playerFires[i].x+bomWidth, 
                                                playerFires[i].y+bomHeight,
                                                STARWAR_BG_COLOR);
            if ((playerFires[i].frame==0))
            {
                 playerFires[i].frame--;
            }
        }
        
        if(enemyFires[i].active)
        {
            Games_direct_fill_rect(enemyFires[i].x , 
                                                enemyFires[i].y,  
                                                enemyFires[i].x+bulWidth, 
                                                enemyFires[i].y+bulHeight,
                                                STARWAR_BG_COLOR);
        }
        else  if(enemyFires[i].frame>=0)
        {
            // clear boom 
            Games_direct_fill_rect(enemyFires[i].x , 
                                                enemyFires[i].y,  
                                                enemyFires[i].x+bomWidth, 
                                                enemyFires[i].y+bomHeight,
                                                STARWAR_BG_COLOR);
            if ((enemyFires[i].frame==0))
            {
                 enemyFires[i].frame--;
            }
        }
    }

    for(i=0; i< maxMissile; i++)
    {
        if(missiles[i].enemy_id >= 0)
        {
            Games_direct_fill_rect(missiles[i].x, 
                                        missiles[i].y,
                                        missiles[i].x+missileWidth, 
                                        missiles[i].y+missileHeight, 
                                        STARWAR_BG_COLOR);
        }
        else if (missiles[i].frame>=0)
        {
            Games_direct_fill_rect(missiles[i].x, 
                                        mis

⌨️ 快捷键说明

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