games_starwar.c
来自「几个嵌入式手机平台小游戏c源代码」· C语言 代码 · 共 2,173 行 · 第 1/5 页
C
2,173 行
enemies[i].x = x;
enemies[i].y = y - j * 20;
enemies[i].ySpeed = 3;
enemies[i].xSpeed = 0;
enemies[i].id = enemyMode;
enemies[i].lives = 1;
if (enemies[i].x+enemiesWidth[enemies[i].id]>xSize)
enemies[i].x= xSize - enemiesWidth[enemies[i].id];
enemies[i].frame = -1;
enemies[i].fire = rand();
j++;
}
i++;
}
enemyCount+=j;
total_enemies += j;
enemyMode=-1;
}
break;
case 1:
if (cantEnemies-enemyCount>= 4)
{
i=0;
j=0;
flag = 2 * (distance % 2) -1; /* flag equals to 1 or -1 */
x= (flag > 0) ? 16 : 112;
y = -60;
while(i<cantEnemies && j<4)
{
if(enemies[i].id < 0 && enemies[i].frame <= 0) /* if frame >=0, showing the boom image */
{
enemies[i].x = x + flag * j * 20;
enemies[i].y = y + j * 20;
enemies[i].ySpeed = 2;
enemies[i].xSpeed = 5 * flag;
enemies[i].id = enemyMode;
enemies[i].lives = 1;
enemies[i].frame = -1;
enemies[i].fire = rand();
j++;
}
i++;
}
enemyCount+=j;
total_enemies += j;
enemyMode=-1;
}
break;
case 2:
if (cantEnemies-enemyCount>= 4)
{
i=0;
j=0;
x= 10;
y = 0;
while(i<cantEnemies && j<4)
{
if(enemies[i].id < 0 && enemies[i].frame <= 0) /* if frame >=0, showing the boom image */
{
enemies[i].x = x;
enemies[i].y = y - j * 20;
enemies[i].ySpeed = 1;
enemies[i].xSpeed = 5;
enemies[i].id = enemyMode;
enemies[i].lives = 1;
enemies[i].frame = -1;
enemies[i].fire = rand();
j++;
}
i++;
}
enemyCount+=j;
total_enemies += j;
enemyMode=-1;
}
break;
case 3:
if (cantEnemies-enemyCount>= 6)
{
i=0;
j=0;
x= 26 + rand() % 70;
y = 0;
while(i<cantEnemies && j<6)
{
flag = 2 * (j % 2) -1; /* flag equals to 1 or -1 */
if(enemies[i].id < 0 && enemies[i].frame <= 0) /* if frame >=0, showing the boom image */
{
enemies[i].x = x + flag * (j/2 + 1) * 16;
enemies[i].y = y - (j /2) * 20;
enemies[i].ySpeed = 2;
enemies[i].xSpeed = -1 * flag * 5;
enemies[i].id = enemyMode;
enemies[i].lives = 1;
enemies[i].frame = -1;
enemies[i].fire = rand();
j++;
}
i++;
}
enemyCount+=j;
total_enemies += j;
enemyMode=-1;
}
break;
case 4: /* the same for 4 and 5 */
case 5:
default:
if (cantEnemies-enemyCount>= 4)
{
i=0;
j=0;
x= 40 + rand() % 40;
y = 0;
while(i<cantEnemies && j<4)
{
if(enemies[i].id < 0 && enemies[i].frame <= 0) /* if frame >=0, showing the boom image */
{
enemies[i].x = x;
enemies[i].y = y - j * 2;
enemies[i].ySpeed = 0;
enemies[i].xSpeed = x;
enemies[i].id = 4;
enemies[i].lives = 1;
enemies[i].frame = -1;
enemies[i].fire = rand();
j++;
}
i++;
}
enemyCount+=j;
total_enemies += j;
enemyMode=-1;
}
break;
}
}
static void newBoss(void)
{
switch (current_level)
{
case 0:
case 1:
case 2:
boss.lives = 20;
break;
case 3:
case 4:
boss.lives = 25;
break;
}
boss.x =(xSize - bossWidth[current_level])/2;
boss.y = 3;
boss.id = current_level;
boss.fire=0;
//atLevelEnd = OP_TRUE;
}
static void moveEnemies(void)
{
OP_INT16 i;
for(i = 0; i < maxEnemies; i++)
{
if(enemies[i].id >= 0)
{
switch(enemies[i].id)
{
case 0:
case 1:
case 2:
case 3:
enemies[i].x += enemies[i].xSpeed;
if (enemies[i].x < 0)
{
enemies[i].x = (-1) * enemies[i].x;
enemies[i].xSpeed = (-1) * enemies[i].xSpeed;
}
if (enemies[i].x + enemiesWidth[enemies[i].id]> xSize)
{
enemies[i].x = xSize - enemiesWidth[enemies[i].id];
enemies[i].xSpeed = (-1) * enemies[i].xSpeed;
}
enemies[i].y += enemies[i].ySpeed;
break;
case 4:
if (enemies[i].y < 0)
enemies[i].y++;
else
{
enemies[i].ySpeed += 15; /* use ySpeed to record the angle of this enemy */
if (enemies[i].ySpeed < 180) /* the center of the circle is (enemies[i].xSpeed, 20), the radius is 20 */
{
enemies[i].x = enemies[i].xSpeed + (OP_INT16)(20 * op_sin((OP_INT16)enemies[i].ySpeed));
enemies[i].y = (OP_INT16)(20 - 20 * op_cos((OP_INT16)enemies[i].ySpeed));
}
else if (enemies[i].ySpeed < 360) /* the center of the circle is (enemies[i].xSpeed, 80), the radius is 40 */
{
enemies[i].x = enemies[i].xSpeed + (OP_INT16)(40 * op_sin((OP_INT16)enemies[i].ySpeed));
enemies[i].y = (OP_INT16)(80 + 40 * op_cos((OP_INT16)enemies[i].ySpeed));
}
else if (enemies[i].ySpeed < 540) /* the center of the circle is (enemies[i].xSpeed, 80), the radius is 40 */
{
enemies[i].x = enemies[i].xSpeed + (OP_INT16)(40 * op_sin((OP_INT16)(enemies[i].ySpeed - 360)));
enemies[i].y = (OP_INT16)(80 + 40 * op_cos((OP_INT16)(enemies[i].ySpeed - 360)));
}
else if (enemies[i].ySpeed < 720) /* the center of the circle is (enemies[i].xSpeed, 20), the radius is 20*/
{
enemies[i].x = enemies[i].xSpeed + (OP_INT16)(20 * op_sin((OP_INT16)(enemies[i].ySpeed- 360)));
enemies[i].y = (OP_INT16)(20 - 20 * op_cos((OP_INT16)(enemies[i].ySpeed - 360)));
}
else
{
enemies[i].ySpeed = 0;
enemies[i].x = enemies[i].xSpeed;
enemies[i].y = 0;
}
}
break;
}
enemies[i].fire++;
enemies[i].fire %= 10;
if(enemies[i].y > ySize - scoreheight || enemies[i].x < 0 || enemies[i].x > xSize )
{
DelEnemy(i);
}
}
}
if (boss.lives > 0)
{
if (boss.x + bossWidth[boss.id]/2 > shipX + shipWidth/2)
boss.x--;
else if (boss.x + bossWidth[boss.id]/2 < shipX + shipWidth/2)
boss.x++;
}
}
//If a star in the background reaches the bottome then it will go back to the top
static void moveStars (void)
{
OP_INT16 i;
for (i = 0; i < numStars; i++)
{
if (starsY[i] + 1 > ySize - (starSpeed * 2 ))
{
starsY[i] = 0;
starsX[i] = (OP_INT16) (rand() % xSize);
starsC[i] = NewColor();
}
else
{
starsY[i] += starSpeed;
}
}
}
static void Collisions(void)
{
OP_UINT8 i, j;
for(j = 0; j < maxBullet; j++)
{
if (playerFires[j].active)
{
if (boss.lives > 0 &&
(playerFires[j].y+bulHeight/2 >= boss.y) &&
(playerFires[j].y < boss.y + bossHeight[boss.id]) &&
(playerFires[j].x+bulWidth/2>= boss.x) &&
(playerFires[j].x+bulWidth/2 < boss.x+ bossWidth[boss.id]))
{
boss.lives--;
score += 30;
playerFires[j].active = OP_FALSE;
playerFires[j].frame = bframes;
if (boss.lives <= 0)
{
levelPassed();
break;
}
continue;
}
for(i = 0; i < maxEnemies; i++)
{
if(enemies[i].id >= 0)
{
if((playerFires[j].y+bulHeight/2 >= enemies[i].y-enemies[i].ySpeed) &&
(playerFires[j].y < enemies[i].y + enemiesHeight[enemies[i].id])&&
(playerFires[j].x+bulWidth/2>= enemies[i].x) &&
(playerFires[j].x+bulWidth/2 < enemies[i].x + enemiesWidth[enemies[i].id]))
{
enemies[i].lives--;
switch(enemies[i].id)
{
case 0:
case 1:
score += 10;
break;
case 2:
score += 20;
break;
case 3:
score += 30;
break;
default:
break;
}
if (enemies[i].lives <= 0)
{
enemies[i].id = -1;
enemyCount--;
}
playerFires[j].x = enemies[i].x + (enemiesWidth[enemies[i].id]-bomWidth)/2;
playerFires[j].y = enemies[i].y + (enemiesHeight[enemies[i].id]-bomHeight)/2;
playerFires[j].active = OP_FALSE;
playerFires[j].frame = bframes;
}
}
}
/* judge whether there are some bullets hitting each other */
for(i = 0; i < maxBullet; i++)
{
if(enemyFires[i].active && (enemyFires[i].y+bulHeight >= playerFires[j].y) &&
(enemyFires[i].y < playerFires[j].y + bulHeight)&&
(enemyFires[i].x+bulWidth>= playerFires[j].x) &&
(enemyFires[i].x < playerFires[j].x + bulWidth))
{
enemyFires[j].active = OP_FALSE;
enemyFires[j].frame = bframes;
DelPlayerFire(j);
}
}
}
}
/* judge whether the ship is hit by enemy fire */
for(j = 0; j < maxBullet; j++)
{
if(enemyFires[j].active && (enemyFires[j].y+bulHeight >= shipY) &&
(enemyFires[j].y < shipY + shipHeight)&&
(enemyFires[j].x+bulWidth>= shipX) &&
(enemyFires[j].x < shipX + shipWidth))
{
score = score>20 ?score-20:0;
HitShip();
enemyFires[j].active = OP_FALSE;
enemyFires[j].frame = bframes;
}
}
/* judge whether the missile hit any enemy */
for(j = 0; j < maxMissile; j++)
{
if(missiles[j].enemy_id==maxEnemies) /* when its target is the boss */
{
if (boss.lives > 0 &&
(missiles[j].y >= boss.y) &&
(missiles[j].y < boss.y + bossHeight[boss.id]) &&
(missiles[j].x+missileWidth/2>= boss.x) &&
(missiles[j].x+missileWidth/2 < boss.x+ bossWidth[boss.id]))
{
boss.lives -= 2;
score += 30;
missiles[j].enemy_id= -1;
missiles[j].frame = bframes;
if (boss.lives <= 0)
{
levelPassed();
break;
}
}
continue;
}
if(missiles[j].enemy_id >= 0)
{
for(i = 0; i < maxEnemies; i++)
{
if(enemies[i].id >= 0)
{
if((missiles[j].y +missileHeight>= enemies[i].y) &&
(missiles[j].y< enemies[i].y + enemiesHeight[enemies[i].id])&&
(missiles[j].x +missileWidth >= enemies[i].x) &&
(missiles[j].x < enemies[i].x + enemiesWidth[enemies[i].id]))
{
enemies[i].lives -=2;
switch(enemies[i].id)
{
case 0:
case 1:
score += 10;
break;
case 2:
score += 20;
break;
case 3:
score += 30;
break;
default:
break;
}
if (enemies[i].lives <= 0)
{
enemies[i].id = -1;
enemyCount--;
}
missiles[j].x = enemies[i].x + (enemiesWidth[enemies[i].id]-bomWidth)/2;
missiles[j].y = enemies[i].y + (enemiesHeight[enemies[i].id]-bomHeight)/2;
missiles[j].enemy_id= -1;
missiles[j].frame = bframes;
break;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?