ゲーム開発

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

3
クライアントをサーバーと相互に同期する
すべてのクライアントをサーバーと相互に同期させる最良の方法は何ですか? 現在、2つのアプローチが考えられています。 クライアントがサーバーに何かを送信すると、サーバーはすぐにすべてのクライアントにメッセージを送信します。 いくつかの時間遅延の導入により、サーバーはすべてのクライアントにメッセージを送信しますt。 2番目のアプローチは、クライアントをよりよく同期させる可能性が高いようです(ある程度の遅延に対応しているため)。しかし、応答性が大幅に低下するかどうか(つまり、ユーザーが「ジャンプ」をクリックし、ボタンを押すことと実際にジャンプすることの間に顕著なギャップがある)かどうかと思います。 クライアントに自分の位置を計算させる可能性もあります(サーバーが「ジャンプした」と言うのを待たないでください)。しかし、避けられない遅延のために、クライアントは非常に非同期になります。 次に、TCPとUDPの全体の問題があります。私たちはそれを速くしたいのですが、あなたが思っていたのとは完全に異なる場所にいるとサーバーが言うのも嫌です。 これらのすべての競合する要求により、この問題への取り組み方は非常に不確実になります。これらのアプローチ(またはその他のアプローチ)のうち、クライアントとサーバーをすべて同期させるのに最適なのはどれですか。業界で実際に使用されているのはどれですか?

3
2Dスターマップで境界線/州のエリアを生成するための適切なアルゴリズムは何ですか?
私は、それぞれが1つ以上の星系を所有している、異なる派閥/状態を示すかなり大きな2次元の星図を生成しようとしています。派閥の境界・エリアを自動で作成したいのですが。 アイデアは基本的にこのようなものから行くことです(ドットは2d平面上の星系を表し、色は派閥の所属です) これに このようなマップを生成することはかなり一般的な要件のように思われるので、私の実際の質問はこれです:示されているように状態領域を生成するための標準的なアルゴリズムはありますか?もしそうなら、私にそれらを指摘してもらえますか?そうでない場合、良いアルゴリズムを考えることができますか? アルゴリズムのパフォーマンスは私にとって主な関心事ではないので、生成するのが高速なマップよりも「きれいな」マップを使用したいと思います。この同様の質問は、いくつかの「整形」が必要であるにもかかわらず、おそらく私の問題に適用できるアプローチを提供します: グラフからマップを作成する方法 きれいに言うときの意味を説明しましょう。リンクされた質問の下部に、質問者は受け入れられた回答を実装した後の最終結果を提示します。ここでの最初の問題:ノード#6、#9、および#12の領域は非常に小さく、奇妙な形をしています。また、シャープなエッジの代わりに、滑らかで湾曲した外観を好むでしょう。 これまでに見たそれぞれの欠点/質問を含む、これまでの自分のアイデア: 各派閥の「凸包」ポリゴンを生成し、少し外側に拡張します。問題:凹面の特徴はありません。また、オーバーラップにはどのように対処しますか? ドットのボロノイグラフを生成し、隣接する異なる派閥のシステム間のボロノイポリゴンエッジを境界として使用します。問題:マップの端にある大きなポリゴン-それらを特定して修正するにはどうすればよいですか? ドットごとに固定サイズのポリゴンを生成し、単一のファクションのすべてのポリゴンを結合します(結果として、1つの大きく潜在的に複雑な「ファクションポリゴン」が生成されます)。次に、2つの派閥間の重複領域を調整するために何かを行います。問題:これを正確に行うにはどうすればよいですか?単純なプロセスではありません。3つ以上の派閥間で重複がある場合はどうなりますか? よろしくお願いします。 補遺:最初の2つの回答と問題を解決するためのそれぞれのアプローチを検討した後、上記の要件が不完全であることに気付きました。 私は、地図にまばらに人口の多いエリアがある可能性があることを追加する必要があります。これは、孤立した星または星のクラスターがある可能性があることを意味します。それらの各クラスターを、独自の隣接する色付きの領域で表示したいと思います。このようなもの: これには、クラスターを識別する最初のステップが必要であり、次に各クラスターに対して実際のアルゴリズムを実行する必要があることを理解しています。
9 2d  algorithm  maps 

3
同じ素材の断片を共有する複数のゲームオブジェクトをどのように持つのですか?
私の質問は、クローンではなく、同じマテリアルのピースをゲームオブジェクトで共有する方法はありますか?たとえば、これらのケースでは、同じマテリアルを共有する9つのゲームオブジェクトが、9つのオブジェクトのサイズを満たすように拡大されています。 そしてその場合、私は例えば真ん中のものを削除します、それは内部の空白で拡大された同じ素材を保持します: この目的のために、オブジェクトごとに1つのマテリアルを使用しましたが、私の意図は、複数のオブジェクトに1つのテクスチャを使用すること、または同じオブジェクトの異なる部分にある複数のテクスチャを使用することです。(カスタムUnity3Dテレインにあるペイントボタンのように)。

1
Godotエンジンを使用してプログラムでタイルを配置するにはどうすればよいですか?
私はGodot Engineに完全に新しいので、一般的にゲーム開発のアマチュアです。プロシージャルに生成されたレベルを実装する小さなプロジェクトがあり、そのためにプログラムでタイルを配置できるようにしたいと考えています。このGameMakerのビデオのようなものについて考えていますが、Godotでそれを行うための文書化された方法が見つかりません。 Godotはプログラムでタイルを配置することをサポートしていますか?

2
GameObjectsを静的としてマークする必要があるのはいつですか?
これは、対応するUnityのドキュメントです。 静的ゲームオブジェクトに関するUnityドキュメンテーションページの説明によると、ゲームオブジェクトを静的としてマークすると、パフォーマンスに悪影響を与えることがあります(たとえば、静的バッチ処理によりメモリ使用量が増加します)。 では、これらの機能を正確に使用したいのはいつですか? 前もって感謝します。 脚注: 私は現在、スプライトとLineRendererがたくさんある2Dトップダウンゲームを開発していますが、3Dオブジェクト(クワッドさえも)はありません。すべてのゲームオブジェクトは、既製のプレハブから手続き的にインスタンス化されています。LineRenderersは、フレームごとにスクリプトから更新されます。そして、ほぼすべてのスプライトは常に動いています。スプライトの大部分は同じマテリアルを共有しています。すべてのLineRendererも同じ素材を共有しています。

3
フレームレートがオブジェクトの速度に影響しています
私はJavaでゼロからゲームエンジンを構築する実験をしており、いくつか質問があります。私のメインゲームループは次のようになります。 int FPS = 60; while(isRunning){ /* Current time, before frame update */ long time = System.currentTimeMillis(); update(); draw(); /* How long each frame should last - time it took for one frame */ long delay = (1000 / FPS) - (System.currentTimeMillis() - time); if(delay > 0){ try{ Thread.sleep(delay); }catch(Exception …

3
GLViewportの混乱
誰かがGLViewportを理解し、サイズを変更するとどうなるかを理解してくれることを願っています これは私の混乱を示します。 だから、ここで私は画面の真ん中にクワッドをスタックしています。GLViewportをデバイスの幅と高さに一致させると、最初の(左側の)画像が表示されます。まさに私が期待するもの。 デバイスの解像度、2560 x 1600 ビューポート解像度2560 x 1600 クワッドサイズ200 x 200(注、上の画像は実物大ではありません!!! :-)) 四角形、正方形として表示 さて、2枚目(右)の写真です... デバイスの解像度、2560 x 1600 ビューポート解像度2560 x 1200(および垂直方向中央) クワッドサイズ(200、200) 四角形、長方形として表示 私の質問は、四角形が四角形ではなく四角形として表示されているのはなぜですか?私のクワッドが200 x 200ピクセルであることをログに記録して確認しました-物理ピクセルのサイズは確かに同じですか?変更することはできません。ここで何が起こっているのでしょうか? 私は(明らかに間違って)ビューポートを拡大縮小したとき、文字通りピクセルを切り落としたと考えました。 これがどのように機能するかを誰かが説明できれば幸いです。 編集する 現在、私はビューポートを次のように設定しています: width = (int) Math.min(deviceWidth, deviceHeight * 1.702127659574468); height = (int) Math.min(deviceHeight, deviceWidth / 1.702127659574468); ratio = width / height; GLES20.glViewport(offsetX, …

4
2つの四元数を論理的に等しいかどうか比較するにはどうすればよいですか?
私はいくつかの単体テストを書こうとしていますが、四元数を比較する方法がわかりません。2つの四元数が同じ方向を表すかどうかを知る必要があります(オブジェクトは同じ方向を向いています)。位置のようなベクトルを使用して、パーツを比較し、それらが十分に近いことを確認しますが、四元数の場合、値が大きく異なる可能性があります。 2つの四元数を比較するにはどうすればよいですか?

2
ハイトマップを拡大するときに補間アーティファクトを回避するにはどうすればよいですか?
高さマップをアップスケールするためにバイキュービック補間アルゴリズムを使用していますが、ピクセル境界の周りのアーティファクトに気づいています。ただし、単純な3次補間(スプライン)を使用すると、これらのアーティファクトは表示されないようです。 キュービックスプラインとは異なり、バイキュービック補間では2次導関数の連続性が保証されないためでしょうか?もしそうなら、連続的な二次導関数を持つ既知のアルゴリズムはありますか?そうでなければ、これらのアーティファクトに対処する方法はありますか? 線形補間(ピクセル境界を表示): バイキュービック補間(ピクセル境界で見えるアーティファクト): キュービック補間(顕著なアーティファクトなし): いくつかのバイキュービック式を試したところ、同じ結果が得られました。ここではいくつかの例を示します。 http://paulbourke.net/miscellaneous/interpolation http://www.paulinternet.nl/?page=bicubic

1
Entity System Architecture with Task Based Parallelismの使用
バックグラウンド 私は自分の暇な時間にマルチスレッドゲームエンジンの作成に取り組んでおり、エンティティシステムを既に作成したものに組み込むための最良の方法を決定しようとしています。これまでのところ、私は自分のエンジンの出発点としてIntelからのこの記事を使用しました。これまでのところ、タスクを使用して通常のゲームループを実装しており、システムやエンティティシステム、あるいはその両方の組み込みに取り掛かっています。私は過去にアルテミスに似たものを使ったことがありますが、並行性が私を捨ててしまいます。 Intelの記事では、エンティティデータのコピーが複数あり、各エンティティに加えられた変更が完全な更新の最後に内部的に配布されることが推奨されているようです。つまり、レンダリングは常に1フレーム遅れますが、得られるべきパフォーマンス上の利点を考えると、許容できる妥協案のようです。ただし、Artemisのようなエンティティシステムの場合、システムごとに各エンティティが複製されるため、各コンポーネントも複製する必要があります。これは実行可能ですが、多くのメモリを消費するように思えます。これを議論するインテルのドキュメントの部分は主に2.2と3.2.2です。探しているアーキテクチャを統合するための適切なリファレンスが見つかるかどうかを確認するためにいくつか検索を行いましたが、まだ有用なものを見つけることができていません。 注:このプロジェクトではC ++ 11を使用していますが、私が求めていることのほとんどは言語にとらわれないものでなければならないことを想像しています。 可能な解決策 EntitiesとEntityAttributesの作成と管理に使用されるグローバルEntityManagerを用意します。更新フェーズでのみ読み取りアクセスを許可し、すべての変更をスレッドごとにキューに保存します。すべてのタスクが完了すると、キューが結合され、それぞれの変更が適用されます。これは、同じフィールドへの複数の書き込みで問題が発生する可能性がありますが、それを整理する優先システムまたはタイムスタンプがあると確信しています。変更の配布段階でシステムにエンティティへの変更をかなり自然に通知できるため、これは私にとっては良いアプローチのようです。 質問 それが理にかなっているかどうかを確認するために私の解決策についてのフィードバックを探しています。私は嘘をついてマルチスレッドの専門家であると主張することはありません。私はこれを主に練習のために行っています。複数のシステムが複数の値を読み書きしている私のソリューションからいくつかの複雑な混乱が発生することを予測できます。私が言及した変更キューも、PODを使用していないときに起こりうる変更を簡単に通知できるようにフォーマットするのが難しい場合があります。 フィードバック/アドバイスは大歓迎です!ありがとう! リンク集 http://software.intel.com/en-us/articles/designing-the-framework-of-a-parallel-game-engine http://gamadu.com/artemis/ http://www.gamedev.net/topic/560083-rendering-in-a-task-based-multithreaded-environment/(この投稿の投稿には記載されていませんが、同様のソリューションが記載されています)

3
PNGをロードするためのSDL関数
私は現在SDL 2.0を学習しており、BMPをロードするためのこの方法を見てきました。 SDL_Texture* LoadImage(std::string file) { SDL_Surface *loadedImage = nullptr; SDL_Texture *texture = nullptr; loadedImage = SDL_LoadBMP(file.c_str()); if (loadedImage != nullptr) { texture = SDL_CreateTextureFromSurface(renderer, loadedImage); SDL_FreeSurface(loadedImage); } else std::cout << SDL_GetError() << std::endl; return texture; } PNGファイルをロードするように切り替えるにはどうすればよいですか? 編集:うーん、PNGをロードする私の方法を追加するのを忘れていました。 SDL_Texture* grass_image = nullptr; grass_image = IMG_LoadTexture(renderer, "res/grass.bmp"); SDL_Rect grass_rect; grass_rect.x …
9 c++  sdl 

2
エンティティシステム内でのエンティティの割り当て
エンティティシステム内でエンティティをどのように割り当て/類似する必要があるのか​​、よくわかりません。私にはさまざまなオプションがありますが、それらのほとんどには短所が関連付けられているようです。すべての場合において、エンティティはID(整数)に似ており、おそらくラッパークラスが関連付けられています。このラッパークラスには、エンティティにコンポーネントを追加/削除するメソッドがあります。 オプションについて言及する前に、ここに私のエンティティシステムの基本構造を示します。 エンティティ ゲーム内のオブジェクトを説明するオブジェクト 成分 エンティティのデータを格納するために使用されます システム 特定のコンポーネントを持つエンティティが含まれています 特定のコンポーネントでエンティティを更新するために使用されます 世界 エンティティシステムのエンティティとシステムが含まれています エンティティを作成/破棄し、システムをそこに追加/削除できます 私が考えた私の選択肢は次のとおりです: オプション1: エンティティラッパークラスを保存せず、次のID /削除されたIDのみを保存します。つまり、エンティティは次のように値で返されます。 Entity entity = world.createEntity(); これは、この設計にいくつかの欠陥があることを除いて、ententxによく似ています。 短所 エンティティラッパークラスが重複している可能性があります(コピークターを実装する必要があり、システムにエンティティを含める必要があるため) エンティティが破棄された場合、重複するエンティティラッパークラスの値は更新されません オプション2: エンティティラッパークラスをオブジェクトプール内に保存します。つまり、エンティティは次のようにポインタ/参照によって返されます。 Entity& e = world.createEntity(); 短所 重複するエンティティがある場合、エンティティが破棄されると、同じエンティティオブジェクトが別のエンティティの割り当てに再利用されることがあります。 オプション3: 未加工のIDを使用し、ラッパーエンティティクラスを忘れます。これの落とし穴は、それに必要な構文だと思います。これを実装するのが最も簡単で簡単に思えるので、これを行うことを考えています。構文が原因で、私はそれについてかなり確信が持てません。 つまり、このデザインでコンポーネントを追加するには、次のようになります。 Entity e = world.createEntity(); world.addComponent<Position>(e, 0, 3); これに付け加えて: Entity e = world.createEntity(); e.addComponent<Position>(0, 3); 短所 …

3
ランダムゼルダスタイルのマップ生成
ドアで接続された部屋のマップをランダムに生成しようとしていますが、このコードを使用してマップを生成することに成功しました。 public void generate(GameContainer gc) { rooms = new ArrayList<Room>(); startingRoom = new Room(0); startingRoom.setPosition(viewport.getCenterX(), viewport.getCenterY()); lastRoom = startingRoom; rooms.add(startingRoom); int roomsize = 25; for (int i = 0; i <= (1000 + Math.random() * 4000); i++) { Room room = new Room(i + 1); int direction = (int) (Math.random() …

3
モーション入力からジッターを取り除く方法は?
Razer Hydraからの入力をサポートするMinecraft modを書いています。非常に正確な位置と回転の情報を提供する1組のモーションコントローラ(各手に1つ)です。 この質問の目的のために、Y軸で右コントローラーを回転させると、プレーヤーのキャラクターが左または右(ヨー)に見え、X軸で回転させると、プレーヤーが上下(ピッチ)に見えます。 コントローラからの入力は、キャラクターの見出しに直接マッピングされます。コントローラーを左に30度回転させると、キャラクターは左に30度回転します。 問題は、入力が「ジッター」することです。コントローラを完全に動かさないようにしようとすると、キャラクタのヘディングが非常に小さな円錐(おそらく1度)内で不規則に移動します。 コントローラーのデータは一見正確であるため、これはおそらく私の手ぶれによるものです。 最後のXフレームからのデータを平均化することで入力をフィルタリングしようとしましたが、これは入力をバターのように見せます。 私の質問は次のとおりです。回転データをフィルター処理して、精度を失うことなくジッターを削除するにはどうすればよいですか?

2
SQLデータベースを使用してデスクトップゲームにデータを格納する必要がありますか?[閉まっている]
閉まっている。この質問はトピックから外れています。現在、回答を受け付けていません。 この質問を改善してみませんか? 質問を更新して、ゲーム開発スタック交換のトピックになるようにします。 2年前休業。 ゲームエンジンの開発 コンピュータゲームとそのエンジンを計画しています。一人称視点の3次元の世界があり、現時点ではシングルプレーヤーになります。プログラミング言語はC ++で、OpenGLを使用しています。 データ中心の設計決定 私の設計上の決定は、グローバルイベントマネージャーとグローバルデータマネージャーがあるデータ中心型アーキテクチャを使用することです。物理、入力、サウンド、レンダラー、aiなどの多くのコンポーネントがあります。各コンポーネントは、イベントをトリガーしてリッスンできます。さらに、各コンポーネントはデータの読み取り、編集、作成、削除を行うことができます。 問題はデータマネージャーについてです。 リレーショナルデータベースを使用するかどうか SQLiteやMySQLなどのSQLデータベースを使用してゲームデータを保存する必要がありますか?これには、アイテム、キャラクター、インベントリなどの実質的にすべてのゲームコンテンツが含まれます。さらにパフォーマンスに関連するメッシュとテクスチャを除いて、メモリに保持します。 SQLデータベースは、動くキャラクターの位置などのゲーム情報をリアルタイムで読み書きするのに十分な速度ですか?また、プラットフォーム間の互換性にも注意する必要があります。すべてをメモリに保持する以外に、どのような代替手段がありますか? 利点は MySQLのようなリレーショナルデータベースを使用する利点は、高速な計算を可能にするデータ指向の構造です。エンティティを表すためのオブジェクトは必要ありません。レンダリングに必要なプレーヤーの近くのオブジェクトのデータを簡単にクエリできました。そして、遠くにあるオブジェクトのデータを気にする必要はありません。さらに、ホールゲームの状態はデータベースに保存されるため、savegamesは必要ありません。最後に重要なことですが、ホールゲームの状態が格納されている場所が既にあるため、ゲームをオンラインゲームに拡張することは比較的簡単です。

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