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

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

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

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

Q&A

解決済

3回答

610閲覧

シューティングゲームで自機が破壊された時に描画範囲から外に出すことによって表示しなくさせる技法は正しいのかどうか知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2020/08/05 07:19

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;//クールタイムを設定 } }

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

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

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

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

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

guest

回答3

0

ベストアンサーが既についていますが、補足です。
オブジェクト指向型言語(C++)で開発されているようでしたので、一番良いのはプレイヤークラスをデストラクタすることです。プレイヤークラスに位置情報のデータ、衝突判定、描画の処理を書いておけば、それらを一斉に消すことが可能なので設計的にも非常に便利でラクです。

投稿2020/08/06 05:58

stdio

総合スコア3307

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

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

退会済みユーザー

退会済みユーザー

2020/08/06 09:05

オブジェクト指向でゲーム開発についてですが依存性の注入という考えは正しいのでしょうか?
stdio

2020/08/17 00:51

その通りです。 セキュリティ等を考えるとバイナリーデータにした方が良いような感じがしますが...
guest

0

ベストアンサー

描画をしない方法が一番楽だとは思いますが、
どうしても常に描画された状態にしたいのであれば、
当たり判定の半径を0にするなど描画範囲外での衝突を避ける必要があると思います

自機が-100,-100に行く→3秒待っているときに偶然-100,-100に球が来た→

のループにはまる可能性があるので

投稿2020/08/05 08:10

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/08/05 08:18

ゲーム設計上仕方ないのでそうしたんですが一番いいのは描画しないこととありますが当たり判定を無効するというのがポイントでしょうか?
guest

0

べつにその方法で正常動作するなら好きにすれば良いと思うのですが,
mRestartTimeなる変数から状態がわかるのであれば,
単純に「「三秒間」の間であれば描画自体をしない」という処理にしておけばよいだけであるようにも思えます.

投稿2020/08/05 07:36

fana

総合スコア11652

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問