弾と敵と自分の「行動、初期化、表示」の関数化をしたのですが、プロトタイプ宣言、関数の呼び出し、関数本体の定義等、しっかり関数化できているか見てほしいです。関数化する前と同じ動作はできています。場所などおかしいところがあれば教えてほしいです。
#include "MyGameMain.h"
//ゲーム情報
DG::Image::SP imgPlayer, imgShot, imgEnemy;
XI::GamePad::SP in1;
enum class State { Normal, Hit, Non };
struct Chara {
State state; int x, y; int moveCnt; ML::Box2D hitBase;
};
Chara player;
Chara enemys[30];//敵最大30
Chara shots[10]; //ショット最大10発
void Shot_Appear(int x_, int y_);
void Player_Initialize(Chara& c_, int x_, int y_);
void Player_UpDate(Chara& c_);
void Player_Draw(Chara& c_);
void Enemy_Initialize(Chara& c_, int x_, int y_);
void Enemy_Draw(Chara& c_);
void Enemy_UpDate(Chara& c_);
void Shot_Initialize(Chara& c_,int x_,int y_);
void Shot_Draw(Chara& c_);
void Shot_UpDate(Chara& c_);
//-----------------------------------------------------------------------------
//初期化処理
//機能概要:プログラム起動時に1回実行される(素材などの準備を行う)
//-----------------------------------------------------------------------------
void MyGameMain_Initialize()
{
imgPlayer = DG::Image::Create("./data/image/player.png");
imgShot = DG::Image::Create("./data/image/Shot.png");
imgEnemy = DG::Image::Create("./data/image/Enemy1.png");
//キーボードの入力を受け取るオブジェクトを作成する //アナログスティック XI::AnalogAxisKB ls = { DIK_LEFT, DIK_RIGHT, DIK_UP, DIK_DOWN }; XI::AnalogAxisKB rs = { DIK_NUMPAD4, DIK_NUMPAD6, DIK_NUMPAD8, DIK_NUMPAD2 }; //トリガー XI::AnalogTriggerKB tg = { DIK_E, DIK_R }; //十字キーとキーボード XI::KeyDatas_KB key = { { DIK_Z, XI::VGP::B1 },{ DIK_X, XI::VGP::B2 }, { DIK_C, XI::VGP::B3 },{ DIK_V, XI::VGP::B4 }, { DIK_A, XI::VGP::SE },{ DIK_S, XI::VGP::ST }, { DIK_Q, XI::VGP::L1 },{ DIK_W, XI::VGP::R1}, { DIK_D, XI::VGP::L3 },{ DIK_NUMPAD5, XI::VGP::R3 }, }; in1 = XI::GamePad::CreateKB(ls, rs, tg, key); Player_Initialize(player, 50, 270 / 2); //弾の初期化 for (int s = 0; s < 10; ++s) { shots[s].state = State::Non; } //敵の初期化 for (int e = 0; e < 30; ++e) { int x = (e % 6) * 40; int y = (e / 6) * 40; Enemy_Initialize(enemys[e], 160 + x, 40 + y); }
}
//-----------------------------------------------------------------------------
//解放処理
//機能概要:プログラム終了時に1回実行される(素材などの解放を行う)
//-----------------------------------------------------------------------------
void MyGameMain_Finalize()
{
imgPlayer.reset();
imgShot.reset();
in1.reset();
imgEnemy.reset();
}
//-----------------------------------------------------------------------------
//更新処理
//機能概要:ゲームの1フレームに当たる処理
//-----------------------------------------------------------------------------
void MyGameMain_UpDate()
{
Player_UpDate(player);
//プレイヤ弾の行動
for (int s = 0; s < 10; ++s) {
Shot_UpDate(shots[s]);
}
//敵の行動
for (int e = 0; e < 30; ++e) {
Enemy_UpDate(enemys[e]);
}
}
//---------------------------------------------------------------------------
//描画処理
//機能概要:ゲームの1フレームに当たる表示処理 2D
//-----------------------------------------------------------------------------
void MyGameMain_Render2D()
{
Player_Draw(player);
//プレイヤ弾の表示
for (int s = 0; s < 10; ++s) { Shot_Draw(shots[s]); } for (int e = 0; e < 30; ++e) { Enemy_Draw(enemys[e]); }
}
//--------------------------------
//弾の出現処理
void Shot_Appear(int x_, int y_)
{
for (int s = 0; s < 10; ++s) {
if (shots[s].state == State::Non) {//空き領域を見つけたら
//弾を生成する
shots[s].state = State::Normal;
shots[s].x = x_;
shots[s].y = y_;
shots[s].hitBase = ML::Box2D(-4, -4, 8, 8);
break;
}
}
}
//-------------------------------------
//プレイヤの初期化
void Player_Initialize(Chara& c_, int x_, int y_)
{
c_.state = State::Normal;
c_.x =x_;
c_.y = y_;
c_.hitBase = ML::Box2D(-32, -12, 64, 25);
}
//---------------------------------------
//プレイヤの行動
void Player_UpDate(Chara& c_)
{
auto inp = in1->GetState();
//プレイヤー行動
if (c_.state == State::Normal) {
if (inp.LStick.BL.on) { c_.x -= 3; }
if (inp.LStick.BR.on) { c_.x += 3; }
if (inp.LStick.BU.on) { c_.y -= 3; }
if (inp.LStick.BD.on) { c_.y += 3; }
if (inp.B1.down) {
Shot_Appear(c_.x + 20, c_.y - 10);
Shot_Appear(c_.x + 20, c_.y + 10);
}
}
}
//--------------------------------------------
//プレイヤの表示
void Player_Draw(Chara& c_)
{
if (c_.state == State::Normal) {
ML::Box2D draw(-32, -12, 64, 25);
draw.Offset(c_.x, c_.y);
ML::Box2D src(0, 0, 64, 25);
imgPlayer->Draw(draw, src);
}
}
//-----------------------------------------------
//敵の初期化
void Enemy_Initialize(Chara& c_, int x_, int y_)
{
c_.state = State::Normal;
c_.x = x_;
c_.y = y_;
c_.moveCnt = 0;
c_.hitBase = ML::Box2D(-20, -20, 40, 40);
}
//----------------------------------------------
//敵の表示処理
void Enemy_Draw(Chara& c_)
{
if (c_.state == State::Normal) {
ML::Box2D draw(-20, -20, 40, 40);
draw.Offset(c_.x, c_.y);
ML::Box2D src(0, 0, 40, 40);
imgEnemy->Draw(draw, src);
}
}
//--------------------------------------------
//敵の行動処理
void Enemy_UpDate(Chara& c_)
{
if (c_.state == State::Normal) { if (c_.moveCnt < 100) { c_.x += 1; } else { c_.x -= 1; } c_.moveCnt++; if (c_.moveCnt >= 200) { c_.moveCnt = 0; } //敵とプレイヤのあたり判定を行う(敵が主体) //自分(敵)の矩形を用意 ML::Box2D me = c_.hitBase.OffsetCopy(c_.x, c_.y); if (player.state == State::Normal) {//相手(プレイヤ)の矩形を用意 ML::Box2D you = player.hitBase.OffsetCopy(player.x, player.y); //接触判定 if (you.Hit(me) == true) { c_.state = State::Non; player.state = State::Non; } } }
}
//-------------------------------------
//弾の初期化
void Shot_Initialize(Chara& c_, int x_, int y_)
{
c_.state = State::Non;
}
//--------------------------------------
//弾の表示処理
void Shot_Draw(Chara& c_)
{
if (c_.state == State::Normal) {//有効になっている弾のみ
//弾の表示処理
ML::Box2D draw(-16, -16, 32, 32);
draw.Offset(c_.x, c_.y);
ML::Box2D src(0, 96, 32, 32);
imgShot->Draw(draw, src);
}
}
//--------------------------------------
//弾の行動処理
void Shot_UpDate(Chara& c_)
{
if (c_.state == State::Normal) {//有効になっている弾のみ
//弾の行動処理
c_.x += 4;
//弾が画面外に出たとき、弾を無効する
if (c_.x > 480 + 16) {
c_.state = State::Non;
}
//弾と敵の当たり判定を行う
if (c_.state == State::Normal) {
//自分(弾)の矩形を用意
ML::Box2D me = c_.hitBase.OffsetCopy(c_.x, c_.y);
//すべての敵と当たり判定を試みる
for (int e = 0; e < 30; ++e) {
if (enemys[e].state == State::Normal) {//敵が存在している場合のみ
//相手(敵キャラ)の矩形を用意
ML::Box2D you = enemys[e].hitBase.OffsetCopy(enemys[e].x, enemys[e].y);
//接触判定//自分と接触しているか相手に判断してもらう
if (you.Hit(me) == true) {
enemys[e].state = State::Non;
c_.state = State::Non;
}
}
}
}
}
}
