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