teratail header banner
teratail header banner
質問するログイン新規登録
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

0回答

525閲覧

Visual studioの関数化

lx.qz9

総合スコア0

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2024/07/25 16:16

0

0

このプログラムで関数化を行いたいのですが、プレイヤの表示処理を関数化する場合どこをどのように変更すればいいですか?
関数のインターフェイス部分は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); } } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問