このプログラムで関数化を行いたいのですが、プレイヤの表示処理を関数化する場合どこをどのように変更すればいいですか?
関数のインターフェイス部分はvoid Player_Draw(Chara& c_);
ここから始め
#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発
//-----------------------------------------------------------------------------
//初期化処理
//機能概要:プログラム起動時に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.state = State::Normal; player.x = 50; player.y = 270 / 2; //弾の初期化 for (int s = 0; s < 10; ++s) { shots[s].state = State::Non; } //敵の初期化 for (int e = 0; e < 30; ++e) { enemys[e].state = State::Normal; int x = (e % 6) * 40; int y = (e / 6) * 40; enemys[e].x = 160 + x; enemys[e].y = 40 + y; enemys[e].moveCnt = 0; enemys[e].hitBase = ML::Box2D(-20, -20, 40, 40); }
}
//-----------------------------------------------------------------------------
//解放処理
//機能概要:プログラム終了時に1回実行される(素材などの解放を行う)
//-----------------------------------------------------------------------------
void MyGameMain_Finalize()
{
imgPlayer.reset();
imgShot.reset();
in1.reset();
imgEnemy.reset();
}
//-----------------------------------------------------------------------------
//更新処理
//機能概要:ゲームの1フレームに当たる処理
//-----------------------------------------------------------------------------
void MyGameMain_UpDate()
{
auto inp = in1->GetState();
//プレイヤー行動
if (player.state == State::Normal) {
if (inp.LStick.BL.on) { player.x -= 3; }
if (inp.LStick.BR.on) { player.x += 3; }
if (inp.LStick.BU.on) { player.y -= 3; }
if (inp.LStick.BD.on) { player.y += 3; }
if (inp.B1.down) {
//弾を発射する処理
for (int s = 0; s < 10; ++s) {
if (shots[s].state == State::Non) {//空き領域を見つけたら
//弾を生成する
shots[s].state = State::Normal;
shots[s].x = player.x;
shots[s].y = player.y;
shots[s].hitBase = ML::Box2D(-16, -16, 32, 32);
break;
}
}
}
}
//プレイヤ弾の行動
for (int s = 0; s < 10; ++s) {
if (shots[s].state == State::Normal) {//有効になっている弾のみ
//弾の行動処理
shots[s].x += 4;
//弾が画面外に出たとき、弾を無効する
if (shots[s].x > 480 + 16) {
shots[s].state = State::Non;
}
//弾と敵の当たり判定を行う
if (shots[s].state == State::Normal) {
//自分(弾)の矩形を用意
ML::Box2D me = shots[s].hitBase.OffsetCopy(shots[s].x, shots[s].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;
shots[s].state = State::Non;
}
}
}
}
}
}
//敵の行動
for (int e = 0; e < 30; ++e) {
if (enemys[e].state == State::Normal) {
if (enemys[e].moveCnt < 100) { enemys[e].x += 1; }
else { enemys[e].x -= 1; }
enemys[e].moveCnt++;
if (enemys[e].moveCnt >= 200) { enemys[e].moveCnt = 0; }
//敵とプレイヤのあたり判定
//自分(敵)の矩形を用意
ML::Box2D me = enemys[e].hitBase.OffsetCopy(enemys[e].x, enemys[e].y);
if (player.state == State::Normal) {
//相手(プレイヤ)の矩形を用意
ML::Box2D you = player.hitBase.OffsetCopy(player.x, player.y);
//接触判定
if (you.Hit(me) == true) {
enemys[e].state = State::Non;
player.state = State::Non;
break;
} } } }
}
//-----------------------------------------------------------------------------
//描画処理
//機能概要:ゲームの1フレームに当たる表示処理 2D
//-----------------------------------------------------------------------------
void MyGameMain_Render2D()
{
//プレイヤの表示
if (player.state == State::Normal) {
ML::Box2D draw(-32, -12, 64, 25);
draw.Offset(player.x, player.y);
ML::Box2D src(0, 0, 64, 25);
imgPlayer->Draw(draw, src);
}
//プレイヤ弾の表示 for (int s = 0; s < 10; ++s) { if (shots[s].state == State::Normal) {//有効になっている弾のみ //弾の表示処理 ML::Box2D draw(-16, -16, 32, 32); draw.Offset(shots[s].x, shots[s].y); ML::Box2D src(0, 96, 32, 32); imgShot->Draw(draw, src); } } //敵の表示処理 for (int e = 0; e < 30; ++e) { if (enemys[e].state == State::Normal) { ML::Box2D draw(-20, -20, 40, 40); draw.Offset(enemys[e].x, enemys[e].y); ML::Box2D src(0, 0, 40, 40); imgEnemy->Draw(draw, src); } } }

あなたの回答
tips
プレビュー