質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

Q&A

1回答

1162閲覧

DXライブラリで誘導弾を作りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

0グッド

0クリップ

投稿2020/08/24 07:44

編集2020/08/24 08:04
#include<math.h> //計算のh #include "Player.h" #include"../GameMain.h" //プレイヤーの状態 enum PLAYER_STATE { PLAYER_STATE_ACTIVE, //操作できる状態 PLAYER_STATE_BOMB, //やられ状態 }; //飛行機の画像切り取り情報 #define PLAYER_RECT_X1 0 #define PLAYER_RECT_Y1 0 #define PLAYER_RECT_X2 32 #define PLAYER_RECT_Y2 32 //移動スピード #define PLAYER_VEL 3.0f //弾の発射感覚 #define PLAYER_BULLET_INTERVAL 5 //初期の残機 #define PLAYER_STOCK_DEFAULT 3 //プレイヤーの当たり判定 #define PLAYER_RADIUS 5.0f // プレイヤーのジャンプ力 #define PLAYER_JUMP -15.0f; // プレイヤーの偽重力 #define PLAYER_GRAVITY 0.1f /*--------------------------- 初期化 ----------------------------*/ void Player::Initialize(int textureHandle, BulletManager* pBulletManager) { //状態の初期化 mState = PLAYER_STATE_ACTIVE; //画像の設定 /*mSprite.SetTexture(textureHandle); mSprite.src.x = PLAYER_RECT_X1; mSprite.src.y = PLAYER_RECT_Y1; mSprite.size.x = PLAYER_RECT_X2; mSprite.size.y = PLAYER_RECT_Y2;*/ mSprite.SetTexture(textureHandle); mSprite.src.x = 0; mSprite.src.y = 64; mSprite.size.x = PLAYER_RECT_X2; mSprite.size.y = PLAYER_RECT_Y2; mSprite.scale.x = 1.0f; mSprite.scale.y = 1.0f; mSprite.alpha = 1.0f; //画像に座標を反映 mSprite.pos.x = mPos.x; mSprite.pos.y = mPos.y; //弾の管理者のポインタ(連絡先)を保存 mpBulletManager = pBulletManager; //弾の発射感覚管理用タイマーの初期化 mShootIntervalTimer = 0; //残機の初期化 mStock = PLAYER_STOCK_DEFAULT; //爆破用タイマーの初期化 mBombTimer = 0; //pleyer無敵時間用のタイマー mPTimer = 0; //モーションタイマー mMotionTimer = 0; //当たり判定の初期化 mCollision.mRadius = PLAYER_RADIUS; mCollision.mPos.x = mPos.x; mCollision.mPos.y = mPos.y; ////初期座標の設定 mPos.x = SCREEN_LEFT - 100; mPos.y = 240; //mPosX = SCREEN_CENTER_X; //mPosY = SCREEN_CENTER_X; // 適当な数字 mVelX = 0.0f; mVelY = 0.0f; mIsJump = FALSE; } /*-------------------------------- 更新 -------------------------------*/ void Player::Update(void) { switch (mState) { //操作できる状態 ============= case PLAYER_STATE_ACTIVE: { if (mMotionTimer <= 20) //タイマーが20より上になるまでタイマーを進める { mMotionTimer++; mPos.x += mMotionTimer; //プレイヤーのx座標を増やす } else if (mMotionTimer >= 20) { } //タイマー処理 ++mShootIntervalTimer %= PLAYER_BULLET_INTERVAL; // 移動処理 Move(); //弾の発射処理 if (mShootIntervalTimer == 1 && IsButtonDown(PAD_INPUT_1) == TRUE) { mpBulletManager->Shot(BULLET_TYPE_PLAYER_NORMAL, SHOOTER_TYPE_PLAYER, mPos); PlaySoundMem(mShooting1, DX_PLAYTYPE_BACK); //弾発射で音再生 } if (mShootIntervalTimer == 0 && IsButtonDown(PAD_INPUT_2) == TRUE)// { mpBulletManager->Shot(BULLET_TYPE_PLAYER_POWER_LEFT, // SHOOTER_TYPE_PLAYER, mPos); PlaySoundMem(mShooting2, DX_PLAYTYPE_BACK); //弾発射で音再生// } if (mShootIntervalTimer == 0 && IsButtonDown(PAD_INPUT_3) == TRUE)// { mpBulletManager->Shot(BULLET_TYPE_PLAYER_POWER_RIGHT, // SHOOTER_TYPE_PLAYER, mPos); PlaySoundMem(mShooting2, DX_PLAYTYPE_BACK); //弾発射で音再生// } break; } //やられ状態 ===================== case PLAYER_STATE_BOMB: { //タイマーをすすめる mBombTimer++; if (mBombTimer == 5) { mSprite.src.x = 48; //切り取り座標のx } else if (mBombTimer == 10) { mSprite.src.x = 64; } else if (mBombTimer == 15) { mSprite.src.x = 80; } else if (mBombTimer == 20) { mSprite.alpha = 0.0f; } else if (mBombTimer >= 40)//mSprite.alpha=0.0f { mSprite.src.x = PLAYER_RECT_X1; mSprite.src.y = PLAYER_RECT_Y1; mSprite.size.x = PLAYER_RECT_X2; mSprite.size.y = PLAYER_RECT_Y2; mSprite.scale.x = 1.0f; mSprite.scale.y = 1.0f; mSprite.alpha = 1.0f; //爆発タイマーの初期化 mBombTimer = 0; //操作可能状態へ mState = PLAYER_STATE_ACTIVE; } break; } } //画像に座標を反映 mSprite.pos.x = mPos.x; mSprite.pos.y = mPos.y; //当たり判定に座標を反映 mCollision.mPos.x = mPos.x; mCollision.mPos.y = mPos.y; } /*----------------------------------------- 描画 ----------------------------------------*/ void Player::Draw(void) { //自機の表示 mSprite.Draw(); } /*---------------------------------- プレイヤーの移動処理 ----------------------------------*/ void Player::Move(void) { /*if (IsButtonDown(PAD_INPUT_10) == TRUE) { mPos.x = 0.0f; mPos.y = 0.0f; }*/ // 移動処理 if (IsButtonDown(PAD_INPUT_LEFT) == TRUE) { mPTimer++; if (mPTimer == 0) { mSprite.src.x = 32; mSprite.src.y = 32; } else if (mPTimer == 15) { mSprite.src.x = 64; mSprite.src.y = 32; } else if (mPTimer >= 30) { mSprite.src.x = 0; mSprite.src.y = 32; mSprite.size.x = PLAYER_RECT_X2; mSprite.size.y = PLAYER_RECT_Y2; mSprite.scale.x = 1.0f; mSprite.scale.y = 1.0f; mSprite.alpha = 1.0f; mPTimer = 0; } mVelX = -PLAYER_VEL; } else if (IsButtonDown(PAD_INPUT_RIGHT) == TRUE) { mPTimer++; if(mPTimer==0) mSprite.src.x =32; else if (mPTimer == 15) mSprite.src.x = 64; else if (mPTimer >= 30) { mSprite.src.x = 0; mSprite.src.y = 64; mSprite.size.x = PLAYER_RECT_X2; mSprite.size.y = PLAYER_RECT_Y2; mSprite.scale.x = 1.0f; mSprite.scale.y = 1.0f; mSprite.alpha = 1.0f; mPTimer = 0; } mVelX = PLAYER_VEL; } else if (IsButtonDown(PAD_INPUT_UP) == TRUE) //上キーが押されているときは重力を0にする { mPos.y += -PLAYER_VEL; mVelY = 0; } else if (IsButtonDown(PAD_INPUT_UP) == FALSE) //上キーが押されていないときに重力をかける { mVelY += PLAYER_GRAVITY; } else if (IsButtonDown(PAD_INPUT_DOWN) == TRUE) { mPos.y += PLAYER_VEL; } else { mVelX = 0.0f; } **↓ヘッダー** ```c ```c ```c #include "../PlayScene/Utility.h" #include "Database.h" #include "Collision.h" //前方宣言 struct Player; // //弾を発射した対象 enum SHOOTER_TYPE { SHOOTER_TYPE_PLAYER, //プレイヤー SHOOTER_TYPE_ENEMY, //敵 SHOOTER_TYPE_NUM, //発射対象の総数 }; struct Bullet { //変数=========================- //弾の種類 int mBulletType; //発射対象 int mShooterType; //画像描画構造体 SpriteData mSprite; //座標 Float2 mPos; //速度 Float2 mVel; //使用されているかのフラグ BOOL mIsActive; //威力 int mPower; //円の当たり判定情報 CircleCollider mCollision; //関数====================== //初期化 void Initialize(int textureHandle, int bulletType, int shooterType, Float2 pos); //更新 void Update(void); //描画 void Draw(void); }; ```c #include "Bullet.h" #include "../GameMain.h" #include "../PlayScene/Player.h"// // 弾が生存している画面外プラスαの範囲 #define BULLET_ALIVE_AREA 50 #define SECOND 2 /*----------------------------------- 初期化 引数 :int textureHandle(弾の画像ハンドル)、 int bulletType(弾の種類), Float2 pos(弾の座標) ---------------------------------*/ void Bullet::Initialize(int textureHandle, int bulletType, int shooterType, Float2 pos) { //弾の種類を保存 mBulletType = bulletType; //発射対象の保存 mShooterType = shooterType; //弾の情報を取得 const BulletData data = Database::msBulletdata[bulletType]; //画像の設定 mSprite.SetTexture(textureHandle); mSprite.src.x = data.mRectX1; mSprite.src.y = data.mRectY1; mSprite.size.x = data.mRectX2; mSprite.size.y = data.mRectY2; //初期座標の設定 mPos.x = pos.x; mPos.y = pos.y; //画像に座標を反映 mSprite.pos.x = mPos.x; mSprite.pos.y = mPos.y; //使用状態とする mIsActive = TRUE; //威力の設定 mPower = data.mPower; //当たり判定情報の初期化 mCollision.mRadius = data.mRadius; mCollision.mPos.x = pos.x; mCollision.mPos.y = pos.y; } /*---------------------- 更新 -----------------------*/ void Bullet::Update(void) { //使用中でなければ処理しない if (mIsActive==FALSE) { return; } //弾の情報を取得 const BulletData data = Database::msBulletdata[mBulletType]; //弾の種類に応じた移動処理 switch (mBulletType) { case BULLET_TYPE_PLAYER_NORMAL: //プレイヤー通常弾 { //mPos.y -= data.mVel; mPos.x +=data.mVel; break; } case BULLET_TYPE_ENEMY_NORMAL: //敵通常弾 { //mPos.y += data.mVel; mPos.x -= data.mVel; break; } } //画面外に出たら弾を未使用状態にする if ( mPos.x < SCREEN_LEFT - BULLET_ALIVE_AREA || mPos.x > SCREEN_RIGHT + BULLET_ALIVE_AREA || mPos.y < SCREEN_TOP - BULLET_ALIVE_AREA || mPos.y > SCREEN_BOTTOM + BULLET_ALIVE_AREA ) { mIsActive = FALSE; } // 画像に座標を反映 mSprite.pos.x = mPos.x; mSprite.pos.y = mPos.y; //当たり判定に座標を反映 mCollision.mPos.x = mPos.x; mCollision.mPos.y = mPos.y; } /*---------------------------- 描画 ----------------------------*/ void Bullet::Draw(void) { //使用中でなければ処理しない if (mIsActive == FALSE) { return; } //自機の表示 mSprite.Draw(); }
シューティングを作っているのですが誘導弾のやり方がわかりません。わかりやすくお願いします。

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

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

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

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

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

episteme

2020/08/24 08:12

すまんけど、そのコードは読むに堪えない。
littlestream

2024/02/13 03:39

シューティングアルゴリズムマニアックスという書籍に誘導弾のアルゴリズムが載っています。 あまり自信が無いですがプチコン3号にも誘導弾のソースが書いてありました。
guest

回答1

0

一件C言語のような書き方ですが、タグにC++とありますし、プログラムを見ても構造体の中に関数を作っているのでC++だと判断致します。

プログラムに関しまして、クラスの継承を使えば下記のあたりはもっとスッキリすることが可能です。
誘導弾を作りたいなら、まずはこのあたりの構造をもう少し整えるところから始めましょう。

C++

1//弾の種類に応じた移動処理 2switch (mBulletType){ 3 case BULLET_TYPE_PLAYER_NORMAL://プレイヤー通常弾 4 { 5 //mPos.y -= data.mVel; 6 mPos.x += data.mVel; 7 break; 8 } 9 case BULLET_TYPE_ENEMY_NORMAL://敵通常弾 10 { 11 //mPos.y += data.mVel; 12 mPos.x -= data.mVel; 13 break; 14 } 15}

誘導弾に関しましては、弾の発射時にプレイヤーの位置情報を取得して来て、その方向に向かうようにすれば、基本系は完成します。
現時点ではベクトルを勉強していないように見えましたので少し難しいと思いますが、これからもゲーム制作を楽しんで下さい。

投稿2020/08/24 09:09

stdio

総合スコア3307

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問