ゲーム開発

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

3
球面上のルート-測地線を見つけますか?
私は、2Dマップ上を移動できるブラウザベースのゲームで友人と作業しています。ほぼ7年になりますが、まだこのゲームをプレイしているので、何か新しいものを提供する方法を考えています。それ以来、ゲームマップは制限された平面であり、人々は(0、0)から(MAX_X、MAX_Y)に量子化されたXとYの増分で移動できます(大きなチェス盤と想像してください)。 私たちはそれを別の次元にする時が来たと信じているので、ほんの数週間前に、ゲームが他のマッピングでどのように見えるか疑問に思い始めました: 継続的な動きのある無制限の飛行機:これは一歩前進かもしれませんが、それでも私には確信がありません。 トロイダルワールド(継続的または量子化された動き):以前はトーラスを使用して作業してきましたが、今回はもっと何かを求めています... 連続的な動きのある球形の世界:これは素晴らしいことです! 我々が望むものを ユーザーのブラウザは球面マップ上の各オブジェクトの(緯度、経度)のような座標のリストを与えられています。ブラウザは、これをユーザーの画面に表示して、Web要素内にレンダリングする必要があります(キャンバスでしょうか?これは問題ではありません)。人々が飛行機をクリックすると、(mouseX、mouseY)を(lat、lng)に変換し、現在のユーザーの位置からクリックされたポイントまでのルートを計算する必要があるサーバーに送信します。 私たちは 、回転行列、四元数、オイラー角、平行移動などを操作するための多くの有用な数学を備えたJavaライブラリの作成を開始しました。それらをすべてまとめて、球点を生成し、それらをレンダリングしてユーザーに表示するプログラムを作成しましたJPanel内。クリックをキャッチして球面座標に変換し、ビューの回転、スケール、変換などの他の便利な機能を提供することができました。現在、クライアントとサーバーの相互作用をシミュレートする小さな(非常に小さな)エンジンのようになっています。クライアント側は画面上のポイントを表示し、他の相互作用をキャッチし、サーバー側はビューをレンダリングし、現在の位置とクリックされたポイントの間のルートを補間するような他の計算を行います。 問題はどこだ? 明らかに、2つのルートポイント間を補間する最短パスが必要です。クォータニオンを使用して、球の表面上の2点間を補間します。これは、球の表面上で最短経路が得られないことに気付くまで、問題なく機能するように見えました。 問題は、ルートがX軸とY軸を中心とした2つの回転の合計として計算されることでした。そこで、目的地のクォータニオンの計算方法を変更しました。方向と呼ばれる3番目の角度(1番目は緯度、2番目は経度、3番目は現在の位置を指すベクトルを中心とした回転)を取得します。これで「向き」の角度ができたので、Z軸を回転し、結果のベクトルを宛先クォータニオンの回転軸として使用します(回転軸は灰色で表示されます)。 取得したのは正しいルートです(大きな円上にあることがわかります)。ただし、これはルートの始点が緯度、経度(0、0)にある場合にのみ取得されます。つまり、開始ベクトルは(sphereRadius、0)です。 、0)。以前のバージョン(画像1)では、開始点が0、0であっても良い結果が得られないため、解決策に向かっていると思いますが、このルートを取得するために実行する手順は少し「奇妙です」 " 多分? 次の画像では、開始点が(0、0)ではない場合に発生する問題のビューが表示されます。これは、開始点が(sphereRadius、0、0)のベクトルではなく、目的点を確認できるためです。 (正しく描かれています!)はルート上にありません。 マゼンタポイント(ルート上にあるもの)は、(-startLatitude、0、-startLongitude)の球の中心を中心に回転したルートの終点です。つまり、回転行列を計算してルート上のすべてのポイントに適用すると、実際のルートが得られる可能性がありますが、これを行うにはもっと良い方法があると思い始めます。 たぶん私は球の中心とルートポイントを通る平面を取得し、それを球と交差させて測地線を取得しようとする必要がありますか?しかし、どうやって? あまりにも冗長で、多分間違った英語で申し訳ありませんが、これは私の心を吹き飛ばしています! 編集: 以下のコードは問題なく動作します!みんなに感謝: public void setRouteStart(double srcLat, double srcLng, double destLat, destLng) { //all angles are in radians u = Choords.sphericalToNormalized3D(srcLat, srcLng); v = Choords.sphericalToNormalized3D(destLat, destLng); double cos = u.dotProduct(v); …

1
PC / Linuxでゲームメニュー/シェルオーバーレイを作成するためのアーキテクチャアプローチ?
私はカスタムデジタルテーブルトップインストール用のゲームのコレクションに取り組んでいます(Microsoft Surfaceテーブルと同様)。各ゲームは、フルスクリーンで実行される個別の実行可能ファイルになります。さらに、同時に実行するメニュー/シェルオーバーレイプログラムが必要です。メニュー/シェルを使用すると、ユーザーはゲームを一時停止したり、他のゲームに切り替えたり、ゲームの履歴を確認したりできます。 シェルのいくつかの重要な要件: 現在実行中のゲームに渡す前に、まずすべてのユーザー入力(主にマルチタッチ)をインターセプトします(たとえば、「一時停止」コマンドでポップアップすることを認識できるようにします)。 画面の任意の部分を表示でき、現在実行中の(おそらく一時停止されている)ゲームが下に表示されたまま、理想的には形状/サイズが動的で、ゲーム上でアニメーション化された入出力ドロワーエフェクトを作成できます。 現在、この問題に対するさまざまなアーキテクチャアプローチ(FrapsやDirectXオーバーレイなど)を調査していますが、これについて考えるいくつかの方法がないと思います。考慮すべき主なアプローチは何ですか? (テーブルは現在Windows PCで実行されていますが、代わりにLinuxボックスである可能性があることに注意してください。これにより、OSに依存しないソリューションが必要になるわけではありません。Windows固有のソリューションで満足します。しかし、 Linuxでこれを実現する方がはるかに簡単な場合は、Linuxに切り替えてLinux固有のソリューションを使用することを検討します。)

2
2D環境で「粘液拡散」効果を表示するにはどうすればよいですか?
このような粘液拡散の例を次に示します。物質は発生源の周りに広がります(この例では、発生源はエイリアンの主要な建物です)。 ゲームはスタークラフトで、紫色の物質はクリープと呼ばれています。 トップダウンの2D環境で、この種の物質拡散はどのように達成されるのでしょうか?物質の進行を再計算し、フレームごとにその場で効果を再生成するのか、それとも大量のタイルやその他のコレクションを使用するのか?

1
ゲームでのビデオ再生-フォーマットとデコード
ゲームビデオのデコードに利用できる無料/非制限的なオープンソースソリューション(GPLではない)は何ですか? 要件は簡単です。 比較的使いやすいC API エンコードされたファイルはかなり小さくなければなりません 任意の形式からビデオを変換するアプリケーションが必要です(Windowsにインストールされているコーデック、または同等量の内部的にデコードされた形式)。 デコードはかなり迅速に行われる必要があります ボーナスポイントは、人気のある/積極的にサポートおよび開発されているファイル形式に移動します
8 video 

1
XNAでウィンドウのサイズ変更中にストレッチを停止するにはどうすればよいですか?
ウィンドウモードのXNAゲームでは、ユーザーがウィンドウのサイズを変更すると、ゲームがウィンドウの更新を停止し、ユーザーがマウスを離してサイズ変更が完了するまで、最後に描画されたフレームが引き伸ばされて変形します。 サイズ変更イベント中にゲームを「通常」に実行し続け、フレームを更新し、画面を再描画する方法はありますか? ハードウェア管理リソースが継続的に作成および破棄されるため、サイズ変更中にレンダーループを維持することは不可能または推奨されない可能性があることを理解していますが、醜いストレッチを停止する方法はありますか?理想的には、左上に既存のフレームを拡大縮小せずに残すか、それが不可能な場合は黒い画面にします。
8 xna  xna-4.0  .net 


3
具体的な操作でバイナリの文字/アイテムの操作を行うにはどうすればよいですか?
次の問題があります。 アイテムは多くの状態を持つことができます: NORMAL = 0000000 DRY = 0000001 HOT = 0000010 BURNING = 0000100 WET = 0001000 COLD = 0010000 FROZEN = 0100000 POISONED= 1000000 アイテムは同時にいくつかの状態を持つことができますが、すべてではありません 同時にドライとウェットになることは不可能です。 ウェットアイテムをコールドすると、冷凍に変わります。 ウェットアイテムをホットにすると、通常に変わります アイテムはバーニングとポイズンにすることができます 等。 バイナリフラグを状態に設定し、ANDを使用してさまざまな状態を組み合わせたり、可能かどうかを事前に確認したり、別のステータスに変更したりしました。 新しい状態ごとにすべての状態をチェックするスイッチがなくても、この問題を効率的に解決するための具体的なアプローチはありますか? 2つの異なる状態をチェックすることは比較的簡単ですが、3番目の状態が存在する場合、それを行うのは簡単ではありません。

4
D3DXSaveSurfaceToFileを使用せずに、DirectX 9の画面をメモリの未加工ビットマップにキャプチャする方法
OpenGLでこのようなことができることを知っています glReadBuffer( GL_FRONT ); glReadPixels( 0, 0, _width, _height, GL_RGB, GL_UNSIGNED_BYTE, _buffer ); そして、かなり高速です。_bufferに生のビットマップを取得します。DirectXでこれを実行しようとすると、D3DDeviceオブジェクトがあると仮定すると、次のようなことができます if (SUCCEEDED(D3DDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackbuffer))) { HResult hr = D3DXSaveSurfaceToFileA(filename, D3DXIFF_BMP, pBackbuffer, NULL, NULL); しかし、D3DXSaveSurfaceToFileはかなり遅く、キャプチャをディスクに書き込む必要がないので、これを行うためのより高速な方法があるかどうか疑問に思っていました。 編集:私はDirectXアプリケーションのみを対象としています。実際にはDX9アプリ。私はプレゼントへのフックを介してこれを行っています。(必要に応じて迂回を使用しています)、すべてのフレームでこれを実行しています。BMP PNG JPEGなどの特定のビットマップ形式は必要ありません(または必要ありません)。RGB24の色空間は問題ありません。YUV480pとして取得する方が良いでしょうが、絶対に必要というわけではありません。非常に役立つ回答をありがとうございました

2
Unity3DがVirtualBoxでクラッシュするのはなぜですか?
LinuxのVirtual Boxソフトウェアを使用して、Windowsの仮想インスタンスでUnity3Dを実行しています。DirectXのサポートでゲスト追加をインストールしました。Windows XP SP3 32ビット、およびWindows 7 64ビットを使用してみました。私のホストはUbuntu 12.04 64ビットです。 Unityを両方にインストールして登録しました。正常にロードされ、VirtualBoxインスタンス全体がクラッシュします(警告なしでコンピューターがシャットダウンするのと同じです)。

1
OpenGL:トンネル効果の終わりに光
「トンネルの終わりの光」効果の実装を知っている人はいますか?外側が完全に明るく、徐々に見えやすくなる場所はどこですか? 逆も当てはまる可能性があります。この場合、トンネルの内側は、あなたが入って徐々に見え始めるまで、非常に暗いです。 任意の実装/アルゴリズムは、効果、または効果の実際の名前にさえ役立ちます ありがとう

2
物理シミュレーションのタイムステップスキーム
物理シミュレーションのステップに使用される操作は、最も一般的です。 速度と位置を統合する 衝突の検出と解決 連絡先の解決(高度な場合) 少し前に私はスタンフォード大学からこの文書に出くわしました。 衝突の検出と解決 速度を統合する 連絡先の解決 位置を統合 スタッキングの問題に対する強力なソリューションを可能にするため、興味深いものです。それで不思議に思いました... 単純なものでも複雑なものでも、もしあれば、代替スキームは何ですか?それらの利点、欠点、およびパフォーマンスの考慮事項は何ですか?

1
OpenGLを備えたSDL2 —奇妙な結果、何が問題なのですか?
アプリをiOSに移植しているため、SDL1.2からSDL2にアップグレードする必要があります(これまでのところ、OS Xデスクトップアプリとしてのみテストしています)。ただし、SDL2でコードを実行すると、下の2番目の画像に示すように、奇妙な結果が得られます(最初の画像は、SDLを使用した場合の外観です)。これを引き起こす単一のチェンジセットはこれです、そこに明らかに問題があると思いますか、それともSDL2には知らないOpenGLのニュアンスがありますか?私のSDLはHGの最新のものに基づいています。 更新: 同じプロジェクトのiOSポートに関する別の質問がここにあります。 更新2:これもSDLニュースグループにあります:http : //thread.gmane.org/gmane.comp.lib.sdl/58026 更新3:ポータブルOpenGLにRegalを使用してみましたが、3番目のスクリーンショットはそれほど良くない結果です。 #include <OpenGL/gl.h> #include <OpenGL/glu.h> と #include "GL/Regal.h" #include "GL/RegalGLU.h"
8 opengl  sdl  macos  porting 

2
複数のプリミティブのジオメトリシェーダー
複数のプリミティブを処理できるジオメトリシェーダーを作成するにはどうすればよいですか?たとえば、三角形のジオメトリシェーダーを作成するときは、次のようにレイアウトを定義します。 layout(triangles) in; layout(triangle_strip, max_vertices=3) out; しかし、このシェーダーを使用すると、線や点が表示されません。だから追加: layout(triangles) in; layout(triangle_strip, max_vertices=3) out; layout(lines) in; layout(line_strip, max_vertices=2) out; シェーダーはコンパイルして実行しますが、ライン(または最後に定義されたプリミティブが何であれ)のみをレンダリングします。 それでは、複数のタイプのプリミティブを処理する単一のジオメトリシェーダーをどのように定義しますか?またはそれは不可能であり、各タイプを描画する前に複数のシェーダープログラムを作成してシェーダープログラムを変更する必要がありますか

1
「ステンシル化された」スプライトを描画してそれらを光らせる
現在、私のゲームでは、XNAのSpriteBatchを使用して何もレンダリングしていません(Farseer Physicのデバッグビューを使用しています)。 XNAのみを使用します。私の2番目の質問は、これらのステンシルスプライトを描画したら、「ステンシル」ラインに次のようなグロー効果をどのように与えるのでしょうか。 私はこれまでにこのようなことをしたことがないので、それは私にとって非常に混乱する経験です。ポインタはありますか?
8 xna  c#  rendering  lighting 

1
glReadBuffer / glReadPixelsを使用すると、Intelカードで黒い画像が返されるのはなぜですか?
私はこのコードを持っています glReadBuffer( GL_FRONT ); glReadPixels( 0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, buffer ); これは、私が試したすべてのNvidiaおよびAMD GPUで完全に機能しますが、試したほとんどすべてのIntelビルトインビデオでは失敗します。それは実際には非常に古い945GMEで動作しますが、他のすべてでは失敗します。スクリーンショットを取得する代わりに、実際には黒い画面が表示されます。 それが役に立てば、私はDoom3エンジンを使用しており、そのコードは組み込みのスクリーンキャプチャコードから派生しています。ちなみに、元のゲームでもインテルデバイスでの画面キャプチャはできません。私の推測では、彼らは標準を正しく実装していません。これの回避策はありますか?
8 opengl 

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