シューティングゲームの館

今日 昨日


14. 敵の移動パターンを増やす(直線)

先ほどは敵の移動パターンがただ直線に落ちるだけでしたけど、今度は時間を利用してみましょう。

下におりてきて、しばらく滞在して、上に戻っていくパターンを作ります。

先ほどはパターン1を作ったので今度はEnemyPattern2関数にパターン2の処理を書いていきます。

答えから書いてしまうと

void EnemyPattern2(int i){
    if(enemy[i].counter<50)
        enemy[i].y+=4.0f;
    if(enemy[i].counter>100)
        enemy[i].y-=4.0f;
}

このようになります。enemy[i].counterは敵の出現フラグがたった瞬間からカウントアップしていますからこれで個々の

時間がはかれます。enemy[i].counterが

50未満の時は4ずつy座標を増やしていき(下へ降りてくる)

50〜100の時はその場で滞在し

100より多い時は4ずつy座標を減らしていく(上へ戻っていく)


直線は簡単ですね。

では、以下のサンプルを実行してください。このサンプルは次の章と次の次の章のものも一緒にかいてあります。

今回は追加したEnemyPattern2の部分だけ見てください。

スイッチ文がやたら長くなっていますが、それは、代入しているパターン(赤い部分)が異なっているだけで、黒い部分は

無駄に同じ作業をしているだけです。


/* enemy.cpp */
/* 素材 ver 1.10以上必要 */

#include "DxLib.h"
#include "ExternGV.h"
#include <math.h>
#define PI 3.141593

void EnemyPattern1(int i){
        enemy[i].y+=1.5f;
}

void EnemyPattern2(int i){
        if(enemy[i].counter<50)
            enemy[i].y+=4.0f;
        if(enemy[i].counter>100)
                enemy[i].y-=4.0f;
}

void EnemyPattern3(int i){
        enemy[i].x+=sin(PI*enemy[i].counter/40.0f)*5.0f;
        enemy[i].y+=1.5f;
}

void EnemyPattern4(int i){
        if(enemy[i].counter<100)
                enemy[i].y+=2.5f;
        if(enemy[i].counter>=100){
                enemy[i].x+=sin(PI*(enemy[i].counter-100.0f)/160.0f)*2.5f;
                enemy[i].y+=sin(PI*(enemy[i].counter-20.0f )/160.0f)*2.5f;
        }
}

void EnemyControl(){
        for(int i=0;i<100;i++){
                if(enemy[i].flag==1){
                        if(enemy[i].pattern==1)
                                EnemyPattern1(i);
                        if(enemy[i].pattern==2)
                                EnemyPattern2(i);
                        if(enemy[i].pattern==3)
                                EnemyPattern3(i);
                        if(enemy[i].pattern==4)
                                EnemyPattern4(i);
                }
        }
}

void EnemyCalcDisp(){
        int i;
        for(i=0;i<100;i++)
                if(enemy[i].flag==0)
                        break;
        switch(counter){
                case 50:
                        enemy[i].pattern=1; //どういう軌道を描くか
                        enemy[i].flag=1;   //出現フラグを立てる
                        enemy[i].counter=0;//出現して何カウント目か測るカウンター初期化
                        enemy[i].size=0.5f;//敵の大きさ
                        enemy[i].x=100.0;  //xの初期座標
                        enemy[i].y=-10.0;  //yの初期座標
                        break;
                case 200:
                        enemy[i].pattern=2; 
                        enemy[i].flag=1;  
                        enemy[i].counter=0;
                        enemy[i].size=0.5f;
                        enemy[i].x=100.0;  
                        enemy[i].y=-10.0; 
                        break;
                case 350:
                        enemy[i].pattern=3;
                        enemy[i].flag=1;   
                        enemy[i].counter=0;
                        enemy[i].size=0.5f;
                        enemy[i].x=100.0;  
                        enemy[i].y=-10.0;  
                        break;
                case 500:
                        enemy[i].pattern=4; 
                        enemy[i].flag=1;   
                        enemy[i].counter=0;
                        enemy[i].size=0.5f;
                        enemy[i].x=100.0;  
                        enemy[i].y=-10.0;  
                        break;
                default:
                        break;
        }	
	
	int enemy_img[8]={0,1,2,3,4,3,2,1};
	
	for(i=0;i<100;i++){
		if(enemy[i].flag==1){
			enemy[i].counter++;
			DrawRotaGraph( (int)enemy[i].x , (int)enemy[i].y , enemy[i].size , 0.0f , img_enemy1[enemy_img[counter%32/4]] , TRUE ) ;
			if(enemy[i].x<0.0-MONSTER1_X_SIZE/2.0*enemy[i].size || enemy[i].x>420.0+MONSTER1_X_SIZE/2.0*enemy[i].size ||
				enemy[i].y<0.0-MONSTER1_Y_SIZE/2.0*enemy[i].size || enemy[i].y<0.0-MONSTER1_Y_SIZE/2.0*enemy[i].size)
				enemy[i].flag=0;
		}
	}
}


実行画面


戻る                                  次へ
メニューへ戻る


トップページへ

DXライブラリ著作権表示
DX Library Copyright (C) 2001-2006 Takumi Yamada.