提示コードの///コメント部内部のコードですが当たり判定が以下の画像のような挙動をしてしまい上手く実装出来ません。これはどうしたらいいのでしょうか?
「左側に衝突して補正されて左キーを離してすぐに下キーを押押すと二枚目のように少しめり込み、キーを離すと上に補正されてしまいます。」
これはどうしたらいいのでしょうか?おそらくコメント内部のコードが悪いと思うのですが何度見ても正しいです。どうすればいいのでしょうか?
試したこと
キー入力は問題りませんでした。
その他
ゆっくりと動かすと問題なのですが。 素早くキーを押し変えると問題が発生します。
Github: https://github.com/Shigurechan/ActionGame
2Dアクションゲーム
#define CELL ((int)48)
cpp
1#include "Input.hpp" 2 3// コンストラクタ 4Input::Input() 5{ 6 //キー状態配列を初期化 7 for (int i = 0; i < 256; i++) 8 { 9 Key[i] = 0; 10 } 11} 12 13//キー入力状態を更新 14void Input::Update() 15{ 16 char tmpKey[256]; // 現在のキーの入力状態を格納する 17 GetHitKeyStateAll(tmpKey); // 全てのキーの入力状態を得る 18 for (int i = 0; i < 256; i++) { 19 if (tmpKey[i] != 0) { // i番のキーコードに対応するキーが押されていたら 20 Key[i]++; // 加算 21 } 22 else { 23 // 押されていなければ 24 Key[i] = 0; // 0にする 25 } 26 } 27} 28 29//キーを押した時だけ 30bool Input::getKeyDown(unsigned char KeyCode) 31{ 32 if (Key[KeyCode] == 1) 33 { 34 return true; 35 } 36 else 37 { 38 return false; 39 } 40} 41 42//キーを押している時 43int Input::getKeyDownHold(unsigned char KeyCode) 44{ 45 //printf("あああ\n"); 46 return Key[KeyCode]; 47} 48 49 50
cpp
1#include "Player.hpp" 2 3//コンストラクタ 4Player::Player(Entry* e) : Actor(e) 5{ 6 7} 8 9//座標を修正 10void Player::FixPos(glm::ivec2 pos) 11{ 12 if (mVector == VECTOR_UP) 13 { 14 printf("UP\n"); 15 mPosition.y = pos.y + CELL + CELL / 2; 16 } 17 else if (mVector == VECTOR_DOWN) 18 { 19 printf("DOWN\n"); 20 21 mPosition.y = pos.y - (CELL / 2); 22 } 23 else if (mVector == VECTOR_LEFT) 24 { 25 printf("LEFT\n"); 26 27 mPosition.x = pos.x + (CELL + CELL / 2); 28 } 29 else if (mVector == VECTOR_RIGHT) 30 { 31 printf("RIGHT\n"); 32 33 mPosition.x = pos.x - (CELL / 2); 34 } 35 else { 36 printf("None\n"); 37 } 38 39} 40 41 42 43 44//更新 45void Player::Update() 46{ 47 DrawFormatString(0,0,GetColor(0,255,0),"Position: %d , %d ",mPosition.x,mPosition.y); 48 49 50 51 //printf("%d\n",mSpeed_Max); 52 Bullet_Update(); //バレットを更新 53 Player_Update(); //プレイヤー更新 54} 55 56//ステータスを設定 57void Player::set_Bulid(ItemData data) 58{ 59 60 mSpeed_Max += data.mSpeed_Max; 61 62 HP_Max += data.HP_Max; 63 HP += data.HP_Rec; 64 HP_autoRec += data.HP_autoRec; 65 66 Attack += data.Attack; 67 68 Coin += data.Coin; 69 70} 71 72 73 74//キー入力部 75////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 76//プレイヤー 更新 77void Player::Player_Update() 78{ 79 //printf("いいいい\n"); 80 81 82 mSpeed = mSpeed_Max; 83 //キー入力 84 if (Owner->InputKey->getKeyDownHold(KEY_INPUT_LEFT) > 0) 85 { 86 mVector = VECTOR_LEFT; //方向 87 } 88 else if (Owner->InputKey->getKeyDownHold(KEY_INPUT_RIGHT) > 0) 89 { 90 mVector = VECTOR_RIGHT; //方向 91 } 92 else if (Owner->InputKey->getKeyDownHold(KEY_INPUT_UP) > 0) 93 { 94 mVector = VECTOR_UP; //方向 95 } 96 else if (Owner->InputKey->getKeyDownHold(KEY_INPUT_DOWN) > 0) 97 { 98 mVector = VECTOR_DOWN; //方向 99 } 100 else { 101 mSpeed = 0; 102 } 103 104 105 106 107 108 109 //当たり判定 110 111 //スプライトの中心からのため修正 112 glm::ivec2 pos = mPosition; 113 pos.x += -(CELL / 2); 114 pos.y += -(CELL / 2); 115 mCol.setPosition(pos); 116 mCol.setSize(mSize); 117 mCol.setTrigger(false); 118 mCol.setVector(mVector); 119 120 121} 122///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 123//描画 124void Player::Draw() 125{ 126 Bullet_Draw(); //バレット描画 127 Player_Draw(); //プレイヤー描画 128} 129 130 131//プレイヤー 描画 132void Player::Player_Draw() 133{ 134 //方向 135 if (mVector == VECTOR_UP) 136 { 137 DrawRotaGraph(mPosition.x, mPosition.y, 1.0, 0, mSprite, true, false); 138 } 139 else if (mVector == VECTOR_DOWN) 140 { 141 DrawRotaGraph(mPosition.x, mPosition.y, 1.0, PI, mSprite, true, false); 142 } 143 else if (mVector == VECTOR_LEFT) 144 { 145 DrawRotaGraph(mPosition.x, mPosition.y, 1.0, -(PI * 2) / 4, mSprite, true, false); 146 } 147 else if (mVector == VECTOR_RIGHT) 148 { 149 DrawRotaGraph(mPosition.x, mPosition.y, 1.0, (PI * 2) / 4, mSprite, true, false); 150 } 151 152 DrawPixel(mPosition.x, mPosition.y,GetColor(0,255,0)); 153} 154 155 156//バレット 描画 157void Player::Bullet_Draw() 158{ 159 for (std::vector<Bullet>::iterator itr = mBullet->begin(); itr != mBullet->end(); itr++) 160 { 161 itr->Draw(); //バレット描画 162 } 163} 164 165 166 167//デストラクタ 168Player::~Player() 169{ 170 171} 172
cpp
1#include "Stage.hpp" 2 3//コンストラクタ 4Stage::Stage(Entry* e) 5{ 6 7} 8 9//更新 10 11///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 12//プレイヤーとの当たり判定 13void Stage::ColPlayer(Player &player) 14{ 15 for (std::vector<MapChip>::iterator itr = mStage.begin(); itr != mStage.end(); itr++) 16 { 17 if (Box_Collision::Intersect(itr->mCol,player.mCol) == true) 18 { 19 switch (itr->mCol.getObjectType()) 20 { 21 //ショップ 22 case StageObjectType::Shop: 23 { 24 if (Owner->InputKey->getKeyDown(KEY_INPUT_P) == true) 25 { 26 player.setIsMenu(true); 27 player.FixPos(itr->mCol.getPosition()); 28 } 29 } 30 break; 31 32 //レンガとの当たり判定 33 case StageObjectType::Brick: 34 { 35 player.FixPos(itr->mCol.getPosition()); 36 } 37 break; 38 39 //ブロックとの当たり判定 40 case StageObjectType::Block: 41 { 42 43 player.FixPos(itr->mCol.getPosition()); 44 } 45 break; 46 } 47 } 48 } 49} 50/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 51 52 53//画面スクロール 54void Stage::ScrollMap(Player& player) 55{ 56 //左右移動 57 if (player.getPosition().x > (SCREEN_WIDTH - 100) + player.getSpeed() && player.getVector() == VECTOR_RIGHT) { 58 printf("Right\n"); 59 60 for (std::vector<MapChip>::iterator itr = mStage.begin(); itr != mStage.end(); itr++) 61 { 62 63 glm::ivec2 pos; 64 pos = itr->getPosition(); 65 pos.x += -player.getSpeed(); 66 67 itr->setPosition(pos); 68 } 69 } 70 else if (player.getPosition().x < ( 100 ) + player.getSpeed() && player.getVector() == VECTOR_LEFT) 71 { 72 printf("Left\n"); 73 for (std::vector<MapChip>::iterator itr = mStage.begin(); itr != mStage.end(); itr++) 74 { 75 glm::ivec2 pos; 76 pos = itr->getPosition(); 77 pos.x += player.getSpeed(); 78 79 itr->setPosition(pos); 80 } 81 82 //上下移動 83 }else if (player.getPosition().y > (SCREEN_HEIGHT - 100) + player.getSpeed() && player.getVector() == VECTOR_DOWN) { 84 printf("Dwon\n"); 85 86 for (std::vector<MapChip>::iterator itr = mStage.begin(); itr != mStage.end(); itr++) 87 { 88 89 glm::ivec2 pos; 90 pos = itr->getPosition(); 91 pos.y += -player.getSpeed(); 92 93 itr->setPosition(pos); 94 } 95 } 96 else if (player.getPosition().y < (100) + player.getSpeed() && player.getVector() == VECTOR_UP) 97 { 98 printf("Up\n"); 99 for (std::vector<MapChip>::iterator itr = mStage.begin(); itr != mStage.end(); itr++) 100 { 101 glm::ivec2 pos; 102 pos = itr->getPosition(); 103 pos.y += player.getSpeed(); 104 105 itr->setPosition(pos); 106 } 107 } 108 else { 109 110 111 //移動 112 int speed = player.getSpeed(); 113 glm::ivec2 vec = player.getVector(); 114 glm::ivec2 pos = player.getPosition(); 115 pos.x += vec.x * speed; 116 pos.y += vec.y * speed; 117 118 player.setPosition(pos); 119 } 120} 121 122//エネミーとの当たり判定 123void Stage::ColEnemy(std::shared_ptr<std::vector<Enemy>> enemy) 124{ 125 for (std::vector<MapChip>::iterator itr = mStage.begin(); itr != mStage.end(); itr++) 126 { 127 MapChip chip = *itr; 128 for (std::vector<Enemy>::iterator itr = enemy->begin(); itr != enemy->end(); itr++) 129 { 130 //交差判定 131 if (Box_Collision::Intersect(chip.mCol, itr->mCol) == true ) 132 { 133 switch (chip.mCol.getObjectType()) 134 { 135 136 //ブロック 137 case StageObjectType::Block: 138 { 139 itr->FixPos(chip.mCol.getPosition()); 140 itr->setMove_Rand(); 141 } 142 143 144 } 145 } 146 } 147 } 148 149} 150 151 152 153 154 155 156//デストラクタ 157Stage::~Stage() 158{ 159 160} 161 162
回答1件
あなたの回答
tips
プレビュー