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