ゲーム開発

プロおよび独立系ゲーム開発者向けのQ&A

1
グローバルキーボードの状態
キーボード入力の処理について次の考えがあります。次のように、「メイン」のゲームクラスで入力をキャプチャします。 protected override void Update(GameTime gameTime) { this.CurrentKeyboardState = Keyboard.GetState(); // main :Game class logic here base.Update(gameTime); this.PreviousKeyboardState = this.CurrentKeyboardState; } 次に、キーボードの状態(internalスコープを持つ)を他のすべてのゲームコンポーネントで再利用します。この背後にある理由は、1)キーボード処理の負荷を最小限に抑え、2)同様のキーボード状態変数を使用して他のすべてのクラスの「汚染」を減らすことです。 私はゲーム開発とXNA開発の両方でまったくの初心者なので、これらすべてが妥当に聞こえるかどうか知りたいのですが。 UPDATE:誰かが興味を持っている場合によって示唆されているように、実際のユーティリティクラス、デビッドGouveiaの、私が作成したここで見つけることができます。

2
HTML5 / JavaScriptゲームでタイルを使用して滑らかな照明遷移を作成する
タイル置換を使用してHTML5 / JavaScriptゲームに照明効果を実装しようとしています。私が今持っているのは一種の動作ですが、光源が動き回るので、トランジションは十分に滑らか/自然に見えません。これが私が今いるところです: 現在、背景マップに明るい/シャドウスペクトルのPNGタイルシートが適用されています。最も暗いタイルから完全に透明になっています。デフォルトでは、最も暗いタイルが起動時にレベル全体に描画され、他のすべてのレイヤーなどをカバーします。 各タイルの位置を計算し、そのx座標とy座標を配列に格納するために、所定のタイルサイズ(40 x 40ピクセル)を使用しています。 次に、配列の各位置に透明な40 x 40ピクセルの「グリッドブロック」エンティティを生成します 次に、使用しているエンジン(ImpactJS)により、光源エンティティからこのグリッドブロックエンティティのすべてのインスタンスまでの距離を計算できます。 次に、それらの各グリッドブロックタイルの下のタイルを適切な透明度のタイルに置き換えることができます。 現在、マップ上に生成されるグリッドブロックエンティティの各インスタンスで、次のような計算を行っています。 var dist = this.distanceTo( ig.game.player ); var percentage = 100 * dist / 960; if (percentage < 2) { // Spawns tile 64 of the shadow spectrum tilesheet at the specified position ig.game.backgroundMaps[2].setTile( this.pos.x, this.pos.y, 64 ); …


1
Update(GameTime)メソッドとPauseの実装に関する問題
私は一時停止機能を実装しており、プレーヤーの画面を暗くしてゲームプレイの更新を停止するという点で正しく機能します。 問題は、一時停止中にGameTimeが増加し続けることです。そのため、別の敵を生成する前にgameTimeとpreviousSpawnTimeをチェックするメソッドがめちゃくちゃになり、ゲームの一時停止が長すぎると、次の敵の描画が早すぎることがわかります。 これが敵のアップデート用のコードです。 private void UpdateEnemies(GameTime gameTime) { // Spawn a new enemy every 1.5 seconds if (gameTime.TotalGameTime - previousSpawnTime > enemySpawnTime) { previousSpawnTime = gameTime.TotalGameTime; // Add an Enemy AddEnemy(); } ... gameTimeに依存する他のメソッドもあります。合計休止時間を取得し、それを合計ゲーム時間から差し引こうとしましたが、それが私がこれを解決しようとする方法である場合、それが正しく機能するようには見えません。 他のコードが必要な場合はお知らせください。ありがとうございました。

1
シャドウマップの粒度
すべてのライトに同じシャドウマップを再利用できると思いました。しかし、ライト間のシャドウマップを再利用することはできず、個別のサーフェスを使用する必要があることを示唆する業界の記事を見てきました。 ライトごとに1つのシャドウマップが必要ですか?または、プロセス全体の1つですか?

1
2Dキャラクターのさまざまな部分にさまざまなアクションを適用するにはどうすればよいですか?
Javaで2Dプラットフォームのゲームを開発しています。プレイヤーは毎回手に銃を持っています。彼は歩いて銃で撃つ必要があります(歩くには矢印キー、撃つにはXキー)。ウォークサイクルは6フレームかかり、矢印キーを押すと、スプライトシートをインポートしてシーケンスをアニメーション化できます。しかし、私は銃の動きを追加する必要があります。プレイヤーは銃を上向きに持ち、Xキーが押されると、銃をまっすぐにして発砲します。ウォーク+シュートアクションを実装する方法は?

2
後でアクションが完了するのを待つコマンドまたはイベントの処理
2つのイベントがあるとします:Action1とAction2。Action1を受け取ったときに、次にAction2が回転するときに使用する任意のデータを保存する必要があります。最適には、Action1は通常コマンドですが、他のイベントにすることもできます。考え方は同じです。 これを実装する現在の方法は、状態を格納し、特定の状態が存在する場合にAction2が呼び出されたときに単純にチェックすることです。これは明らかに少し厄介であり、多くの冗長なコードにつながります。これが私がこれをどのように行っているかの例を、疑似コードの形式で(そして明らかにかなり細かく分解して)示します。 void onAction1(event) { Player = event.getPlayer() Player.addState("my_action_to_do") } void onAction2(event) { Player = event.getPlayer() if not Player.hasState("my_action_to_do") { return } // Do something } 他の多くのアクションでこれを行うと、それはやや醜くなり、それを改善するために私にできることがあるかどうか知りたいと思いました。 データを渡す必要がないようなものを考えていましたが、これも正しい方向ではありませんか? void onAction1(event) { Player = event.getPlayer() Player.onAction2(new Runnable() { public void run() { // Do something } }) } それをさらに進めたい場合は、単にこれを行うことはできませんか? void onPlayerEnter(event) …
7 java  events 

1
歪んだ:シンプルなCPUベースのボクセルレイキャスター/レイトレーサーの回転カメラ
TL; DR —私の最初のシンプルなソフトウェアボクセルレイキャスターでは、カメラの回転を機能させることができません。結果は歪んでいます。フラットレンダリングのように、正しく回転しますが、歪みがあり、奥行きがありません。(軸が揃っている、つまり回転していない間、奥行きと視差は予想どおりです)。 簡単なボクセルレイキャスターを学習課題として記述しようとしています。これは純粋にCPUベースで、物事が正確にどのように機能するかを理解するまでは、今のところ、OpenGLは生成されたビットマップをできるだけ頻繁に画面に表示するために(ab)使用されています。 これで、透視投影カメラが世界を移動できるようになり、(ほとんどの場合、調査が必要なアーティファクトを差し引いて)「世界」の透視的に正しい3次元ビューをレンダリングできます。スタンフォードバニーのボクセルキューブが含まれています。 それで、私は上下に移動でき、左右に移動でき、「前方/後方に歩く」ことができるカメラを持っています。これまでのところ、軸はすべて揃っていて、カメラは回転していません。ここに私の問題があります。 スクリーンショット#1:カメラがまだ厳密に軸合わせされている場合の正しい奥行き。回転しない。 今私はローテーションを機能させるために数日間努力してきました。行列と3D回転の背後にある基本的な論理と理論は、理論的には非常に明確です。それでも、カメラが回転したときに「2.5レンダリング」を達成したのは、Googleストリートビューのような魚眼のようなものだけです。ボリュメトリックな世界の表現を持っているにもかかわらず、私が何をしようとも、最初のように見えます「正面図」からレンダリングを作成し、カメラの回転に従ってそのフラットレンダリングを回転させます。言うまでもありませんが、光線を回転させることは特に必要ではなく、エラーが発生しやすいことはわかっています。 それでも、私の最新の設定では、可能な限り最も単純化されたレイキャストレイの位置と方向のアルゴリズムにより、私の回転は同じ魚目状のフラットレンダー回転スタイルの外観を生成します。 スクリーンショット#2:カメラが「39度右に回転」—画面2の立方体の青い影付きの左側がこの回転では見えないことに注目してください。 もちろん、私はこれに気づいています。最初のように単純なaxis-aligned-no-rotation-setupで、光線は単純に正のz方向に移動し、左または右と上に発散します。ピクセル位置と射影行列に応じてのみ、または下部。「カメラを右または左に回転させる」、つまりY軸を中心に回転させると、これらのステップは適切な回転行列によって単純に変換されるはずです。したがって、順方向トラバーサルの場合、カムが回転するほどZステップは少し小さくなり、Xステップの「増加」によってオフセットされます。しかし、ピクセル位置ベースの水平+垂直発散の場合、xステップの増加する割合をzステップに「追加」する必要があります。どういうわけか、私が実験した多くのマトリックスのどれも、 これが私の基本的なレイごとのトラバーサルアルゴリズムです。Goの構文ですが、疑似コードとして使用します。 fxおよびfy:ピクセル位置xおよびy rayPos:ワールド空間での光線開始位置のvec3(以下のように計算されます) rayDir:レイトラバーサル中に各ステップでrayPosに追加されるxyzステップのvec3 rayStep:一時的なvec3 camPos:ワールド空間でのカメラの位置を表すvec3 camRad:ラジアンでのカメラ回転のためのvec3 pmat:典型的な透視投影行列 アルゴリズム/疑似コード: // 1: rayPos is for now "this pixel, as a vector on the view plane in 3d, at The Origin" rayPos.X, rayPos.Y, rayPos.Z = ((fx / width) - 0.5), ((fy …
7 voxels  raycasting  go 

1
AABB-AABB衝突、どちらの顔に当たる?
オブジェクトが衝突したときにスライドできるようにするには、次のことを行う必要があります。 彼らが衝突するAABBのどの面を知っています。 その面の法線を計算します。 法線を返し、プレイヤーの速度に適用するインパルスを計算します。 質問 2つのAABBが衝突していることを知りながら、衝突したAABBの面を計算するにはどうすればよいですか?1つはプレーヤーで、もう1つはワールドオブジェクトです。 これは次のようになります(白で囲まれた問題の衝突)。 ご協力ありがとうございました。

2
C ++エンティティコンポーネントシステムフレームワーク[終了]
現在のところ、この質問は、Q&A形式には適していません。私たちは回答が事実、参考文献、または専門知識によってサポートされることを期待しますが、この質問はおそらく議論、議論、投票、または拡張ディスカッションを誘います。この質問を改善でき、再開できると思われる場合は、ヘルプセンターにアクセスしてください。 7年前休業。 ActionScriptのAshやRush、JavaやC#のArtemisなど、C ++以外の他の言語のエンティティシステムフレームワークをいくつか見つけました。 私の質問は、C ++の上記のようなフレームワークが存在するかどうかです。

1
歩行/衝突用のサイドスクローラー可変地形高度マップ
私はXNAの傾斜したタイルを移動するのをいじっていますが、それは半機能的ですが完全に満足できるものではありません。また、あらかじめ決められた勾配のセットがあると、「有機的」に見える地形が十分に得られない可能性があるとも考えていました。また、スロープごとにいくつかの異なるタイプのタイルを作成する必要があるという問題もあります(私が理解しているように、45度のタイルのみが完全にチェーンされます)。 傾斜したタイルがつながっているエッジのグリッチで問題が発生したため、傾斜したタイルのつながったチェーンをスキャンして新しい大きな三角形として扱うことを考えていました。しかし、これは地形の曲率を制限する問題に戻ります。 したがって、私が今やりたいのは、レベル(またはレベルのセクション)のテレインの単純な画像またはテクスチャを作成し、テレインの単純な高さマップ(各XのYの)を生成することです。プレーヤーのY位置は、X位置に基づいて更新されます。 これを行う簡単な方法(またはこの問題を解決するより良い方法)はありますか?私がこの方法で見ることができる主な問題は、歩くことができる地上の領域がある場合です。多分歩くことができるすべての地上エリアをマッピングする方法はありますか? 私はこの有用なコードを調べてきました:http : //thirdpartyninjas.com/blog/2010/07/28/sloped-platform-collision/ しかし、実際のポイント/ベクトルを生成する方法が必要です。 編集:私は投稿したリンクを使用して傾斜したパスを事前に生成しようとしましたが、今は提案したとおりにピクセルごとの衝突を使用する必要があると確信しています。私はhttp://create.msdn.com/en-US/education/catalog/tutorial/collision_2d_perpixelで例を見ていて、衝突が検出されたときにスプライトを調整する方法を理解しようとしています。デビッドが示唆したように、私はいくつかのセンサーポイント(足、側面、下部中央など)を作成し、これらのポイントが実際に2番目のテクスチャの不透明な部分(単純な傾斜)と衝突するときを簡単に検出できます。衝突に基づいて実際にスプライトの位置を調整する方法のアルゴリズムに問題があります。 スプライトの右足の斜面との衝突を検出したとしましょう。傾斜テクスチャデータをスキャンして、スプライトの足を傾斜の内側に配置しないようにY位置を見つけるにはどうすればよいですか?例で1D配列として格納する方法は少しわかりにくいですが、代わりに2D配列としてデータを格納する必要がありますか? また、衝突チェックを水平方向と垂直方向に分離するのが最善であると何人かの人々が述べていることに気づきました。なぜそれが正確なのですか?

4
チェックポイントを設定するか、プレイヤーを保存するか
私が作っているトップダウンアクション/ホラーゲームを、私は「ゲームのセーブ」機能を追加するプロセスにいますよ。ただし、私はレベル全体に自動チェックポイントを設定することと、ユーザーがいつでも好きなときにゲームを保存できるようにすることとの間で悩んでいます。 各アプローチの長所と短所は何ですか?

1
遠近法マトリックスが右手系座標系か左手系座標系かを知るにはどうすればよいですか?
たとえば、パースペクティブマトリックスを次のように定義するとします。 m[0] = 1.f / ( aspect * focalLength ); m[5] = 1.f / focalLength; m[10] = -zFar / (zFar - zNear); m[11] = -1; m[14] = -(zFar*zNear)/(zFar - zNear); 遠近法マトリックスが右手系座標系か左手系座標系かをどのように確認できますか?

1
複数のゲームで同じウィンドウを再利用することは可能ですか?
特に、私はC#とXNA、そして明らかにWindowsについて考えています。通常のXNAゲームであるメインゲームがあるとしますが、ある時点で、XNAにも実装されているがゲームとは完全に独立したミニゲームに一時的に切り替えたいと考えています。 同じウィンドウハンドルを再利用しながら、2つのゲームに切り替えたり、元に戻したりする方法はありますか?また、古い状態をメモリに保持することもできますが、この永続的なファイルへの書き込みも実装できます。 また、最初のゲームに戻るときに、ミニゲームのメインメソッドによって返された値にアクセスする方法はありますか?たとえば、プレーヤーがミニゲームをクリアしたかどうかに応じて、1または0になります。 アンドリュー・ラッセルは書いている: ミニゲームとメインゲームを同じプログラム内の別々のクラスに構築する必要があります。これらの各クラスには、Update、Draw、Initializeなどのメソッドが必要です。次に、これらのメソッドを呼び出して一度に1つのゲームのみをアクティブにする何らかの種類のマスターコントローラーを用意する必要があります(これは単にメインゲームクラスにある場合もあります)。 答えてくれてありがとう。あなたの提案は、私が通常のゲーム状況で行うことです-私がミニゲームとそのコンテンツのすべてを作成している状況です。 しかし、これはゲームではなく、グラフィックアドベンチャーを作成するためのゲームメーカーツールであり、特定のゲームイベントに応答して外部ミニゲームを接続する必要性を感じるのはエンドユーザーです。 私が交換しようとしている古い内部エンジンはFlashで行われ、メインのSWF内にSWFをロードするだけでこの問題を解決しました。ほとんどの場合、問題なく動作しました。同様のことをしようとしていますが、現在XNAを使用しています。 しかし、あなたの電車や考えに従って、おそらくすべてのミニゲームの基本クラスまたは共通インターフェイスを含む個別のアセンブリを作成し、それをdllとしてコンパイルできます。次に、ユーザーはそのライブラリを参照し、インターフェイスを実装して、実行時にエンジンによってロードされ、メインゲーム内の別の状態として実行される独自のライブラリにコンパイルします。私はいくつかの隠された影響を逃していますか?
7 xna  c#  windows 

4
レンダリングコードでID3D11InputLayoutを処理するのに最適な方法は?
directx11コードで入力レイアウトを処理するエレガントな方法を探しています。 EffectクラスとElementクラスがあるという問題があります。エフェクトクラスはシェーダーと同様の設定をカプセル化し、Elementクラスは描画可能なもの(3dモデル、lanscapeなど)を含みます 私の描画コードは、指定された効果を使用してデバイスシェーダーなどを設定し、次にElementのdraw関数を呼び出して、それに含まれる実際のジオメトリを描画します。 問題はこれです-どこかにD3D11InputLayoutを作成する必要があります。これは実際にはElementクラスに属します。これは、その要素が頂点レイアウトを表すためにどのように選択するかは、システムの他の部分のビジネスではないためです。ただし、オブジェクトを作成するために、APIはオブジェクトの描画に使用される頂点シェーダーの頂点シェーダーバイトコードを必要とします。directx9では簡単で、依存関係がなかったので、要素に独自の入力レイアウト構造を含め、影響を与えることなくそれらを設定できました。 しかし、要素は、それが描画されている効果について何も知っている必要はありません。それは単にレンダリング設定であり、要素はジオメトリを提供するために存在します。 そのため、保存する場所と、各描画呼び出しに対してInputLayoutを選択する方法が本当にわかりません。つまり、私は何かを働かせましたが、それは非常に醜いようです。 これは私が何か明白なものを逃したことを私に引き起こします、さもなければ、すべてのレンダリング設定をエフェクトに、要素にジオメトリを、そしてそれをすべて描画するサードパーティを持っている私のデザインはただ欠陥があります。 他の誰かがdirectx11で入力レイアウトをエレガントな方法でどのように処理するのか疑問に思っていますか?
7 directx11 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.