ゲーム開発

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

2
データ指向設計の例
一般的なゾンビゲームのデータ指向のデザインの良い説明が見つからないようです(これは単なる例であり、かなり一般的な例です)。 ジェネリックゾンビクラスの作成に関するデータ指向デザインの例を挙げていただけませんか?以下は良いですか? ゾンビリストクラス: class ZombieList { GLuint vbo; // generic zombie vertex model std::vector<color>; // object default color std::vector<texture>; // objects textures std::vector<vector3D>; // objects positions public: unsigned int create(); // return object id void move(unsigned int objId, vector3D offset); void rotate(unsigned int objId, float angle); void setColor(unsigned int objId, …

2
IPv6テクノロジーを使用してLANネットワークでゲームサーバーを見つける方法は?
IPv4時代に戻って、ブロードキャストパケットを単に使用した人々は、この回答で説明されているように、ネットワークに利用可能なサーバーがあるかどうかを確認します。しかし、IPv6プロトコルでは、ブロードキャストのサポートを廃止しました。利用可能なマルチキャストサポートはまだありますが、どのように使用できますか?

4
攻撃ダメージアルゴリズムのアイデア(言語は関係ありません)
私はゲームに取り組んでおり、プレイヤーが攻撃したときに敵に与えられるダメージについてのアイデアが必要です。敵が持っているヘルスの合計量はと呼ばれenemyHealth、値は1000です。最初に、40ポイントのダメージを与える(変更される場合があります)武器から始めますplayerAttack。この値は1から始まり、何度もレベルを上げてゲームの奥まで行った後の最大値は100です。武器が与えるダメージ量はカットされて乾き、敵がヒットするたびに合計1000ポイントのヘルスから40ポイントが差し引かれます。しかし、何をするかはplayerAttack、パーセンテージでその値に追加することです。これが私が今持っているアルゴリズムです。(私はすべてのGUI、クラスなどを取り出し、変数に非常に前向きな名前を付けました) double totalDamage = weaponDamage + (weaponDamage*(playerAttack*.05)) enemyHealth -= (int)totalDamage; これはほとんどの部分でうまく機能するように見えました。だから私はいくつかの値をテストすることを定めました... //enemyHealth ALWAYS starts at 1000 weaponDamage = 50; playerAttack = 30; これらの値を設定すると、敵に与えられるダメージ量は125になります。良い数値のように見えたので、プレイヤーの攻撃が最大になり、開始武器が最も弱い場合にどうなるかを確認したいと思いました。 weaponDamage = 50; playerAttack = 100; totalDamageは300になり、数回のヒットで敵を殺します。あなたの攻撃がそんなに高いとしても、私は最も弱い武器が敵をそれほど速く殺せるようにしたくないでしょう。防御を追加することを考えましたが、長期的にはゲームの一貫性が失われ、アンバランスになると思います。おそらく、武器減少モディファイアの適切に設計されたアルゴリズムは、低レベルの武器やそのようなもので機能します。これに対処するための最良の方法を見つけようとすることから少し離れてください。ゲームの経験があり、レベリングを一貫して維持している誰かが私にいくつかのアイデア/ポインタを与える可能性があります。

1
回転に最適なスプライトサイズ
私はスプライトベースのゲームを作っていて、途方もなく大きな解像度で大量の画像を取得していて、それらをゲームリソースに変換する前に目的のスプライトサイズ(たとえば64x64ピクセル)にスケーリングしているので、ゲーム内のスプライト、私はそれをスケーリングする必要はありません。 ただし、この小さなスプライトをゲーム内で(エンジンにとらわれずに)回転させると、一部の宛先ピクセルが補間され、スプライトがぼやけて見えます。 これはもちろん、回転角と補間アルゴリズムに依存しますが、それにもかかわらず、特定の宛先ピクセルを正しくサンプリングするのに十分なデータがありません。 だから私が考えることができる2つのソリューションがあります。1つ目は、元の巨大な画像を使用し、それを必要な角度に回転させてから、すべての反発バリエーションを縮小し、アトラスに配置することです。これは、実装が非常に簡単であるという利点がありますが、単純に2倍のスプライトを消費します。各回転のスペース(各回転は、元のスプライトの長方形の対角線である直径の円に内接する必要があり、その面積は正方形のスプライトを想定して、元の長方形の2倍です)。 また、ゲームによっては大丈夫かそうでないかを問わず、事前に定義されたローテーションのセットしか利用できないという欠点もあります。 したがって、もう1つの選択肢は、より大きな画像を保存し、レンダリング中に回転および縮小することです。これが私の質問につながります。 このスプライトの最適なサイズは何ですか?最適な意味は、大きな画像が結果の画像に影響を与えないことを意味します。 これは、画像サイズ、データ損失のない望ましい回転量である1/256に完全に依存しています。これは、表現可能な最小の色差です。 私はこの問題に対する理論的な一般的な答えを探しています。たくさんのサイズを試してもかまいませんが、最適とはほど遠いからです。
8 2d  sprites 

2
エンジンは、物理エンジンで「フェーズロック」(同じ場所にある複数のオブジェクト)をどのように回避しますか?
最初にフェーズロックについて説明します。質量がゼロではない2つのオブジェクトが同じ空間を占めているが、エネルギーがゼロ(速度なし)である場合。 それらはゼロ速度解像度ベクトルで永遠にぶつかりますか、それとも外部の力が相互作用するまで一緒にロックされたままですか? 自作のエンジンで、キャラクターをツリーにロードして移動すると、衝突を通知して元の場所に戻ることに気づきました。これは、衝突が発生したときにインパルスを実装することで解決できたと思います。私の最後の場所(私の実装のようなもの)にジャンプするだけではありません。 しかし、私は自分のエンジンをより堅牢にしていますが、他のほとんどの物理エンジンがこのケースをどのように処理するかについて興味があります。移動速度のない同じ場所で始まるオブジェクトは、ランダムな方向に互いに発射するだけですか?または何かが起こるまで彼らはそこに座っていますか?一般的にどのオプションが最善のアプローチですか?

3
単一のタイル画像よりも大きい等角図の描画順序-描画順序アルゴリズム?
さまざまな画像を配置するアイソメマップがあります。ほとんどの画像は単一のタイルに収まりますが、一部の画像はわずかに大きくなります。たとえば、2x3タイルのサイズのベッドがあります。 これにより、一部のタイルが他のタイルと誤って重なるため、オブジェクトを画面に描画するときに問題が発生します。 私が知っている2つの解決策は、画像を1x1タイルセグメントに分割するか、たとえば各画像に番号を割り当てることによって、独自の描画順序アルゴリズムを実装することです。番号1の画像が最初に描画され、次に2、3などが描画されます。 誰か私が何をすべきかについてのアドバイスはありますか? アイソメトリック画像を分割することは非常に明白ではないように思えます。画像のどの部分が特定のタイルに含まれるかをどのように決定しますか?すべての画像を手動で分割する余裕もありません。 描画順序アルゴリズムはより良い選択のように見えますが、実装が簡単になるかどうかはわかりません。私は頭の中で、1つの画像のインデックスを変更する状況に対処する方法を解決できません。誰かがこれについてのリソース/チュートリアルを持っているなら、私は最も感謝します。

3
ゲームアセットストレージ:アーカイブvs個別ファイル[終了]
休業。この質問には、より焦点を当てる必要があります。現在、回答を受け付けていません。 この質問を改善してみませんか?質問を更新して、この投稿を編集するだけで1つの問題に焦点を当てます。 4年前休業。 私は3D c ++ゲームを作成している最中なので、ストレージに関してゲームアセットを処理するときに、何がより有益かを考えていました。一部のゲームでは、すべてが圧縮された単一のアセットファイルと、多数の小さな圧縮ファイルを含む他のアセットファイルが見られます。 個別のファイルがたくさんある場合、一度に大きなファイルを読み込んでメモリを使い果たす必要はありませんが、必要なすべての正しいファイルを見つけるために、レベルが読み込まれたときにコードがファイルを探す必要があります。 1つの大きなファイルを処理するときに必要なファイルシークはありませんが、1つのファイルでロードされる、現在必要ではないすべてのアセットについてはどうでしょうか。 レベルごとにアセットファイルを作成することもできますが、共有アセットをどのように処理しますか これはしばらくの間私を悩ませてきましたので、物事のどちらの方法にも他の長所と短所があるか教えてください。

3
視覚障害者のためのデザイン
グローバルすべての年齢層の人々の数視覚障害者は 39百万がある人の、2.85億と推定されているブラインド。 — 2010年世界保健機関。 (これは世界の人口の4.2%と0.6%です。) ほとんどのビデオゲームは、コンテンツ配信においてビジュアルを非常に重視しています。視覚障害のあるゲーマーはほとんど除外されています。 視覚障害のあるゲーマーがアクセスできるようにゲームを設計するにはどうすればよいですか?

2
壁回避ステアリング
レイノルズボイドアルゴリズムを使用して小さなステアリングシミュレータを作成しています。次に、壁回避機能を追加します。私の壁は3Dであり、そのような2つの点を使用して定義されています。 ---------. P2 | | P1 .--------- 私のエージェントは速度、位置などを持っています... エージェントを回避する方法を教えてください。 Vector2D ReynoldsSteeringModel::repulsionFromWalls() { Vector2D force; vector<Wall *> wallsList = walls(); Point2D pos = self()->position(); Vector2D velocity = self()->velocity(); for (unsigned i=0; i<wallsList.size(); i++) { //TODO } return force; } 次に、boid関数によって返されるすべての力を使用し、エージェントに適用します。 私は自分の壁でそれを行う方法を知る必要があるだけです。 ご協力いただきありがとうございます。

2
レイキャスティングチュートリアル/ベクトル数学の質問
私はhttp://lodev.org/cgtutor/raycasting.htmlでこの素晴らしいレイキャスティングチュートリアルをチェックしていて、おそらく非常に単純な数学の質問があります。 DDAアルゴリズムで、光線が1つのx側から次のx側へ、または1つのy側から次へと移動する距離であるdeltaDistXおよびdeltaDistY変数の計算を理解できません。 y側、世界地図を構成する正方形のグリッド内(下のスクリーンショットを参照)。 チュートリアルでは、それらは次のように計算されますが、あまり説明されていません。 //length of ray from one x or y-side to next x or y-side double deltaDistX = sqrt(1 + (rayDirY * rayDirY) / (rayDirX * rayDirX)); double deltaDistY = sqrt(1 + (rayDirX * rayDirX) / (rayDirY * rayDirY)); rayDirYとrayDirXは、キャストされた光線の方向です。 これらの数式をどのように取得しますか?ピタゴラスの定理がその一部であるように見えますが、どういうわけかここに関与する分割があります。ここで不足している数学的知識について誰かが私に手掛かりを与えたり、それがどのように導出されたかを示すことによって式を「証明」したりできますか?

3
ハッキングされたサーバーがマスターサーバーになりすますのを防ぐ方法は?
プレイヤーが対戦をホストし、ホスト(つまり、権威のあるサーバー)として機能するルームベースのマルチレイヤーゲームモデルをセットアップしたいと思います。プレイヤーのアイテム、ランク、現金、経験値などを追跡するマスターサーバーをホストしたいと思います。 このようなモデルで、ゲームをホストしている(変更されたサーバーで)誰かが無効な一致結果でマスターサーバーをスプーフィングして、exp、お金、またはランキングを取得することを防ぐにはどうすればよいですか。 ありがとう。-コーディ

2
すべてが動いているときのスペース分割
バックグラウンド 私は友達と一緒に、宇宙を舞台にした2Dゲームに取り組んでいます。可能な限り没入型でインタラクティブなものにするために、何千ものオブジェクトが自由に浮遊し、一緒にクラスター化されたり、空のスペースに漂っていたりしたいと思っています。 チャレンジ レンダリングと物理エンジンに負担をかけないようにするには、ある種の空間分割を実装する必要があります。私たちが克服しなければならない2つの課題があります。最初の課題は、すべてが動いているため、データ構造の再構築/更新はフレームごとに実行する必要があるため、非常に安価でなければならないということです。2つ目の課題は、オブジェクトの分散です。前述のように、オブジェクトのクラスターと膨大な空きスペースがあり、さらに悪いことに、スペースの境界はありません。 既存のテクノロジー 私はBSPツリー、クワッドツリー、kdツリー、さらにはRツリーなどの既存の手法を見てきましたが、他のセルに移動した多くのオブジェクトを更新しているため、これらのデータ構造は完全には適合しません比較的高価です。 私が試したこと 私は、クエリに基づいて可能な最小のヒットを返すよりも、迅速な挿入/更新を目的としたデータ構造が必要だと判断しました。その目的のために、セルを暗黙的にしたので、各オブジェクトは、その位置を指定すると、どのセルにあるかを計算できます。次に、HashMapセル座標をArrayList(セルの内容)にマップするを使用します。「空の」セルでメモリが失われることがなく、検査するセルを簡単に計算できるため、これはかなりうまく機能します。ただし、これらすべてのArrayLists(最悪の場合N)を作成するとコストがかかるためHashMap、多くの時間をかけて成長します(ただし、初期容量を大きくすることで多少軽減されます)。 問題 わかりましたので、これは機能しますが、まだそれほど高速ではありません。これで、JAVAコードをマイクロ最適化することができます。ただし、プロファイラーはセルの格納に使用するすべてのオブジェクトの作成にほとんどの時間を費やしていると私に言っているので、あまり期待していません。これを大幅に高速化する他のトリック/アルゴリズムがいくつかあることを願っています。理想的なデータ構造は次のようになります。 最優先事項は、データ構造全体の高速更新/再構築です オブジェクトを同じサイズのビンに細かく分割することはそれほど重要ではありません。更新が少し速いことを意味する場合、いくつかの追加のオブジェクトを描画し、いくつかの追加の衝突チェックを実行できます。 メモリはそれほど重要ではありません(PCゲーム)

2
Unity:プログラムによる変更をテレインSplatPrototypeに適用する方法?
テレインオブジェクトを追加するスクリプトがあります(パブリックテレインフィールドにテレインをドラッグアンドドロップします)。 テレインはすでにUnityで2つのPaintTexturesが設定されています。1は正方形(タイルサイズで設定され、市松模様のパターンを形成する)で、2つ目は草の画像です。 また、最初のPaintTextureのターゲット強度が低下しているため、市松模様のパターンによって下にある草の一部も表示されます。 ここで、実行時に、最初のPaintTextureのタイルサイズを変更します。つまり、さまざまな実行時の条件に応じて、チェッカーを増減します。Unityのドキュメントを調べたところ、Terrain.terrainData.SplatPrototypeこれを変更できる配列があることがわかりました。またRefreshPrototypes()、terrainDataオブジェクトのFlush()メソッドとオブジェクトのメソッドがありTerrainます。だから私はこのようなスクリプトを作りました: public class AStarTerrain : MonoBehaviour { public int aStarCellColumns, aStarCellRows; public GameObject aStarCellHighlightPrefab; public GameObject aStarPathMarkerPrefab; public GameObject utilityRobotPrefab; public Terrain aStarTerrain; void Start () { //I've also tried NOT drag and dropping the Terrain on the public field //and instead just using the commented line …

4
トップダウン2Dマップ上で画面外のオブジェクトを効率的にカリング
ゲームプログラミングでは効率が重要であることを知っています。以前に「マップ」をレンダリングした経験はありましたが、おそらく最善の方法ではありません。 2Dトップダウンゲームの場合:(世界のテクスチャ/タイルをレンダリングするだけです) たとえば、1000x1000(タイルなど)のマップがあるとします。タイルがカメラのビューにない場合、レンダリングされるべきではありません-とても簡単です。表示されないタイルをレンダリングする必要はありません。しかし、マップ内に1000x1000オブジェクトがあるか、おそらくそれより少ないため、レンダリングされるかどうかを確認するためだけにすべての1000 * 1000タイルをループ処理したくない場合があります。 質問:この効率を実装する最良の方法は何ですか?それで、「素早く/より速く」、どのタイルがレンダリングされると想定されるかを決定できますか? また、SpriteBatchでレンダリングされたタイルを中心にゲームを構築するのではないため、四角形はなく、形状はさまざまなサイズで複数のポイントを持つことができます。たとえば、10ポイントの湾曲したオブジェクトとそのシェイプ内のテクスチャです。 質問:この種のオブジェクトがカメラのビューの「内側」にあるかどうかをどのように判断しますか? 48x48の長方形で簡単です。X+ WidthまたはY + Heightがカメラのビュー内にあるかどうかを確認してください。複数のポイントで異なります。 簡単に言うと、何百万ものオブジェクトを同時に実行/ループする必要がないように、コードとデータを効率的に管理する方法です。

1
JavaScript keyDown-イベントアプローチなし
JavaScriptでゲームを作っています。描画とゲームループ用のキャンバスがあります。ゲームループでメソッドreadKeyboardを作成して、押されたキーがあるかどうかを確認します。イベントをキャンバスにアタッチしたくないのは、ゲームのループデザインに適合しないためです。たぶん、このイベントを添付する必要がありますか?最良の解決策は何ですか?

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