#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(); }
シューティングを作っているのですが誘導弾のやり方がわかりません。わかりやすくお願いします。