C++ DXライブラリ ゲーム開発 プログラミング講座

シューティングゲームを作る part5.敵を生成する

 


 

まとめ

  • 敵の生成を行った

はじめに

前回の記事はこちら.
オブジェクトを並行で動かす仕組み,配列,自機ショットの生成を行った.

敵を生成する

今回は敵の生成を行う.

これまでの内容が把握できている場合,
特にムズカシイことはないはずだ.

まずは敵の数を定数で定義する.

#define EnemyNum 10

敵の座標を管理する配列を用意する.

float enemyPosX[ EnemyNum ] = {};
float enemyPosY[ EnemyNum ] = {};

自機のショットと同様の,生成関数を用意する

座標,ID を引数で受け取る.

void StartEnemy( float x, float y, int id )
{
enemyPosX[id] = x;
enemyPosY[id] = y;
}

さらに,更新関数を用意する

void UpdateEnemy()
{
for( int i = 0; i < EnemyNum; i++ )
{
DrawEnemy(enemyPosX[i], enemyPosY[i]);
enemyPosY[i] += 1;
}
}

そして,それらの関数を呼んでやればおしまいだ.

ランダムな値を使う

今回は,敵の位置をランダムに決めてしまおうと思う.
そこで使用する DXライブラリの関数が,
GetRand() 関数だ.

引数に,ランダムで生成する数の最大値を渡してやる.

今回は,敵の X 座標に使いたいので,以下のような形だ.

 for( int i = 0; i < EnemyNum; i++ )
{
// x 座標に ランダムな値 + 32ドット,y 座標は 40ドットずつ上にずらして生成
StartEnemy( GetRand(500) + 32, -40*i, i );
}

完成コード

ついでに色の変数化を行っている.

#include "DxLib.h"
#define ShotNum 100
#define EnemyNum 10
float playerPosX = 320.0f;
float playerPosY = 340.0f;
float shotPosX[ ShotNum ];
float shotPosY[ ShotNum ];
float enemyPosX[ EnemyNum ] = {};
float enemyPosY[EnemyNum] = {};
int counter = 0;
int shotId = 0;
// 色を定義
int white  = 0xffffffff;
int red        = 0xffff0000;
int green  = 0xff00ff00;
int blue   = 0xff0088ff;
void DrawEnemy( float x, float y )
{
DrawBox(x-16, y-16, x+16, y+16, red, 0);
DrawPixel( x, y, red );
}
void DrawPlayer( float x, float y )
{
// 本体の表示
DrawBox(x-16, y-16, x+16, y+16, blue, 0);
}
void DrawShot( float x, float y )
{
DrawBox(x-2, y-16, x+2, y+16, blue, 0);
}
void UpdateEnemy()
{
for( int i = 0; i < EnemyNum; i++ )
{
DrawEnemy(enemyPosX[i], enemyPosY[i]);
enemyPosY[i] += 1;
}
}
void StartEnemy( float x, float y, int id )
{
enemyPosX[id] = x;
enemyPosY[id] = y;
}
void UpdateShot()
{
float speed = 40;
for( int i = 0; i < ShotNum; i++ )
{
shotPosY[ i ] -= speed;
DrawShot( shotPosX[ i ], shotPosY[ i ] );
}
}
void StartShot( float x, float y, int id )
{
shotPosX[id] = x;
shotPosY[id] = y;
}
void UpdatePlayer()
{
if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 )
{
playerPosX += 5;
}
if( CheckHitKey( KEY_INPUT_LEFT ) == 1 )
{
playerPosX -= 5;
}
if( CheckHitKey( KEY_INPUT_UP ) == 1 )
{
playerPosY -= 5;
}
if( CheckHitKey( KEY_INPUT_DOWN ) == 1 )
{
playerPosY += 5;
}
if( CheckHitKey( KEY_INPUT_Z ) == 1 )
{
StartShot( playerPosX, playerPosY, shotId );
shotId++;
// 100 発を超えたら 1 発目に戻す
if( shotId >= 100 )
{
shotId = 0;
}
}
DrawPlayer( playerPosX, playerPosY );
}
// プログラムは WinMain から始まります
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
//int main()
{
ChangeWindowMode( true );
if( DxLib_Init() == -1 )     // DXライブラリ初期化処理
{
return -1 ;          // エラーが起きたら直ちに終了
}
// 敵を 10 体生成する
for( int i = 0; i < EnemyNum; i++ )
{
StartEnemy( GetRand(500) + 32, -40*i, i );
}
// ゲームループ
while( ProcessMessage() == 0 )
{
ClearDrawScreen(); // 画面を消す
UpdatePlayer();
UpdateShot();
UpdateEnemy();
counter++;
ScreenFlip(); //裏画面を表画面に反映
}
WaitKey();
DxLib_End() ;               // DXライブラリ使用の終了処理
return 0 ;               // ソフトの終了 
}

問題なく動くことを確認しよう.

おわりに

次回は,衝突判定と敵の撃破を行う予定.

次回

  • この記事を書いた人

GOTH

鹿児島県出身,吉祥寺在住の27歳.職業はゲーム会社でプログラマー.趣味はバイク,車,キャンプ,ガジェット,読書,そしてゲーム開発. サイトのテーマはプログラミングとガジェットでライフハック.たまに趣味に関する雑感や記録を残していく備忘録.ツイッターもやってます.
自己紹介
お問い合わせ

-C++, DXライブラリ, ゲーム開発, プログラミング講座