UpdateActor関数部の中ですが衝突して破壊される自機はまた数秒後にリスポーンするため三秒間だけ描画範囲の外である-100,-100である座標に描画してスポーンするときに画面の真ん中に再表示するという技法を考えたのですがこれはどなのでしょうか?delteしてしまうとゲームの設計上無理があるのでw
#include "Ship.hpp" #include "AnimSpriteComponent.hpp" #include "InputComponent.hpp" #include "Game.hpp" #include "SDL.h" #include "Laser.hpp" Ship::Ship(Game* game) :Actor(game) //,mRightSpeed(0.0f) //,mDownSpeed(0.0f) ,mCooldown(0.0f) { //自機スプライトを読み込み SpriteComponent *sc = new SpriteComponent(this,150); sc->SetTexture(game->GetTexture("Assets/Ship.png")); //キー入力を設定 InputComponent *ic = new InputComponent(this); ic->SetForwardKey(SDL_SCANCODE_W); ic->SetBackKey(SDL_SCANCODE_S); ic->SetClockwiseKey(SDL_SCANCODE_A); ic->SetCounterClockwiseKey(SDL_SCANCODE_D); ic->SetMaxForwardSpeed(300.0f); ic->SetMaxAngularSpeed(Math::TwoPi); //当たり判定(円) cc = new CircleComponent(this); cc->SetRadius(30);//当たり判定の半径を設定 } // void Ship::UpdateActor(float deltaTime) { //攻撃の連射間隔 if(mCooldown >= 0.0f){ mCooldown -= deltaTime; } //生きているとき if(mRestartTime == 0){ //自機と惑星の当たり判定 for(auto ast : GetGame()->GetAsteroids()) { if(Intersect(*cc,*(ast->GetCircle()))) { printf("ゲームオーバー\n"); SetPosition(Vector2(-100,-100));//死んだため画面の描画範囲外に描画して消したことにする。 mRestartTime = (deltaTime * 180);//リスポーン待ち時間は3秒 // SetState(EDead); //ast->SetState(EDead); break; } } }else {//死亡しているまでのリスポーンタイム中 mRestartTime -= deltaTime; if(mRestartTime <= 0.0) { mRestartTime = 0.0; //1024, // Width of window //768, // Height of window //座標をリスポーン座標である画面の中心に設定し再出現 SetPosition(Vector2( (1024 / 2) - 1, (768 / 2) - 1 )); } } } //shipクラス独自の入力 void Ship::ActorInput(const uint8_t* keyState) { if(keyState[SDL_SCANCODE_SPACE] && mCooldown <= 0.0f) { Laser *laser = new Laser(GetGame()); laser->SetPosition(GetPosition()); laser->SetRotation(GetRotation()); mCooldown = 0.5;//クールタイムを設定 } }
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/08/06 09:05
2020/08/17 00:51