トップページgamedev
981コメント424KB

ゲームプログラミング相談室【Part6】

■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。04/03/06 01:25ID:d2e/eEyg
ゲームプログラミング全般の質問スレッド。
扱う話題のダイナミックレンジはやや広め。包容力高め。
他の初心者質問スレとの棲み分けを探りつつ
これからもマターリと活用しておくれ。
 
■過去スレ
【Part2】http://pc.2ch.net/tech/kako/985/985540361.html
【Part3】http://pc.2ch.net/tech/kako/1002/10028/1002894129.html
【Part4】http://game.2ch.net/gamedev/kako/1005/10050/1005040025.html
【Part5】http://pc2.2ch.net/test/read.cgi/gamedev/1036410116/
■関連スレなど
>>2-5
0002名前は開発中のものです。04/03/06 01:26ID:d2e/eEyg
■関連スレ
【初心者歓迎】スレを立てる前にココで質問を【Part5】
http://pc2.2ch.net/test/read.cgi/gamedev/1078502309/
鬱だ氏のう DirectX (Part 12)
http://pc2.2ch.net/test/read.cgi/tech/1076651336/
初心者のためのゲームプログラミング
http://pc2.2ch.net/test/read.cgi/gamedev/1023119134/
ズブの初心者がゲーム作れるまで勉強するスレ
http://pc2.2ch.net/test/read.cgi/gamedev/1005132370/
0003名前は開発中のものです。04/03/06 14:28ID:dSl4ykZE
       。 ◇◎。o.:O☆οo.
       。:゜ ◎::O☆∧_∧☆。∂:o゜
       /。○。 ∂(*゚ー゚ )O◇。☆
     /  ◎| ̄ ̄∪ ̄∪ ̄ ̄ ̄|:◎:
    /    ☆。|..  新スレおめ  .|☆
  ▼       。○..io.。◇.☆____| 。.:
∠▲―――――☆ :∂io☆ ゜◎∂:.
0004名前は開発中のものです。04/03/06 16:00ID:IZnhr4O3
windowsでアクションRPGを作ろうとしています。
2Dで作りたいのですが、その場合の最適な方法を教えて
下さい。
DirectXのスプライトやテクスチャを使うよりひょっとして
GDIを使った方が早いとか・・その辺どうなのでしょうか?
プログラミングに関してわりと初心者なので、ご助言よろしく
お願します。
0005名前は開発中のものです。04/03/06 16:08ID:XiMT98gx
>>4
DirectXとC/C++で作る。
描画まわりを自分で組むのは面倒だし、
よくわからないので誰かのライブラリを使わせてもらう。
誰のライブラリを使うかは自分で探す。

これでとりあえずゲームを作れる環境は整う。
0006名前は開発中のものです。04/03/06 16:32ID:qxY/Wlgs
GDI使え
0007名前は開発中のものです。04/03/06 17:05ID:KI9N5j4B
>>4
2Dなら、GDI(DIBSection)の方が開発はやりやすい。
描画性能に関しては、少なくとも「画面への描画速度」は問題ない
場合が多い(内部への描画処理については、単純にメモリを読み書き
るDIBectionの方が有利な可能性もある)。また、スプライトは32
ビットフルカラーなどピクセル単位の処理を容易にできるシステム
でやる分には、ピクセルをすべて自力で処理しても大丈夫だろうね。

ただし「滑らかな画面更新」を重視するのなら、DirectXで全画面
占有タイプにした方が有利なことは有利かもしれない(開発の労力
は一気に増すがw)。
0008名前は開発中のものです。04/03/06 17:36ID:hsXyG1/u
web上でゲームを公開しようと思っているのですが、
javaかflashだと重さを考えたらflashのほうがいいですか?
0009名前は開発中のものです。04/03/06 20:59ID:IZnhr4O3
>>5-7
ご助言ありがとうございます。
とりあえずDirectGraphicsのテクスチャと
ヤネ氏のライブラリで速度を比べてみようかと
思います。(DirectX9.0には大分慣れたのですが、
Win32は、不慣れなので・・。)
0010名前は開発中のものです。04/03/10 19:48ID:jIa556UV
DirectXのスプライトとテクスチャってどう違うの?
描画速度に違いはあるのかしら?
0011名前は開発中のものです。04/03/10 23:17ID:7vMs+89m
スプライトは概念、テクスチャは実装。
0012名前は開発中のものです。04/03/10 23:32ID:V51Y5dwK
スプライトってのがD3DXSpriteのことを指してるなら、
それはテクスチャを含むDirect3Dのラッパーだよ。
で、ラッパーは常に元より遅い。
実際にどれくらい遅いかは知らん。

機能の違いは、2Dと3Dの違いだ。3Dは2Dを包含する。
0013名前は開発中のものです。04/03/11 12:01ID:jsiJP8hl
ただまぁ、Summer 2003でスプライトの速度は改善されたそうです。
↓にもちょっとした話が。
http://www.plustarnet.com/aspil/Programming/2d06.htm
0014名前は開発中のものです。04/03/13 03:10ID:hBBXuD4r
みなさん、浮動小数点数の型はどうやって決めていますか?
とりあえずは、思いつくのを列挙してみます。
ついでに、それぞれに個人的な意見を添えてみました。

1) 全部 double
+ルールとして単純。
+ゲームプログラム以外では、ほぼ常識?
-メモリ使用量が倍
-「浮動少数点」という言葉と直接繋がらないのが嫌。

2) 全部 float
+ルールとして単純。
+見た目が美しい。
+メモリにやさしい。
+ゲームプログラムではほぼ常識?
-精度が少なめ。
-環境によっては速度も double を下回る?

3) 目的別に typedef (float32,float64,fast_float,precise_float,...)
+移植性が高い。
+目的がコードに直接現れる。
+後で変更できる。
-どれだけ、どんな名前で定義したらいいのか?
-既存のインターフェースとやりとりするときに問題が?

とりあえず、3が正解っぽいなぁ、と思っています。
これら以外の選択肢があれば教えてほしいです。
また、意見のところの、「?」が付いてるもの(特に3のもの)について、
より確かな情報をいただけるとありがたいです。
0015名前は開発中のものです。04/03/13 03:16ID:5BV6NOnP
>>14
DirectXだからfloat
0016名前は開発中のものです。04/03/13 03:29ID:8/IMYlHX
DirectX9はfloat中心の方が速度的にイイ?
0017名前は開発中のものです。04/03/13 04:48ID:uJUWjvsQ
>>14
Cだけど整数型でやっている。3を3000としたりして。
0018名前は開発中のものです。04/03/13 05:30ID:gHL8rm2k
>>17
割り算よりシフトの方がいいらしよ
0019名前は開発中のものです。04/03/13 11:35ID:rbv/waoI
PS2なんかは単精度しかないんだっけか。

そのうちdoubleが標準になるんかねえ。
floatだと広大なフィールドをリニアに扱えんし。
0020名前は開発中のものです。04/03/13 18:14ID:PUoUaF4y
ファイヤーエムブレムとかタクティクスオウガみたいなシミュレーションRPGを作ってるんだけど
敵の思考を考えるのが難しい

プレイヤー側ユニットとの距離を調べる

一番近いユニットに近づく

攻撃できる距離だったら攻撃する

みたいな感じで組んでるんだけど

・障害物
・攻撃スキルの特性(2マス離れてても攻撃可、とか回復スキルとか)
・移動した後攻撃するか、攻撃したあと移動するか  etc...
そういう色々な要素が入ってくるとわけわからなくなる
素人は手を出さないほうがいいジャンルなんだろうか…

なにかコツとかあったら教えて下さい
0021名前は開発中のものです。04/03/13 18:26ID:2y9JGEPF
障害物とか地形の異動量とかがある場合の最短距離の求め方は、
A*サーチアルゴリズムとかを参考にすべし。
たとえば↓。探せばいっぱいあるはず。
http://gamdev.org/w/?%5B%5BAStarAlgorithmTutorial%5D%5D

どの行動を取れば一番いいかについては、可能な行動を全て列挙し、
それぞれに点数をつけ、一番点数の高かった行動を取らせるという方法が一般的。
この点数をつける評価関数を返ることによって、敵の強弱、特徴を出すことが出来る。

どうやって評価関数を作るかは、ゲーム内容による。一般的にこうすればよいとかいった
マニュアルは無い。行動の選択肢が非常に多くある場合、どう刈り取るかも問題となる。

というか、AIの日本語で書かれた入門資料ってあるのかな?

参考リンク:
http://ai-depot.com/
http://www.gameai.com/
http://www.aiwisdom.com/index.html
http://www.ai-junkie.com/ai-junkie.html
http://www-cs-students.stanford.edu/~amitp/gameprog.html#ai
0022名前は開発中のものです。04/03/13 18:35ID:PUoUaF4y
>>21
サンクスです

やはり難しそう・・・
やれるだけやってみます
いざとなったら要素削ってシンプルにするかな・・・
0023名前は開発中のものです。04/03/14 00:40ID:tW50q/qz
>>20
自分はFE風のを作った事があったが、その場合。

1:すべての移動できる位置、使用できるアイテムから、使用対象がいるか調べる。
 攻撃系なら敵、回復系なら味方。複数あるなら効果が一番高いものを選ぶ。
 攻撃系なら相手のHPを大きく減らせて(量ではなく%)、命中率がよく、
 逆に相手からはそれが低くなるもの、回復系の場合は回復%、命中が高いもの。
 同じアイテム、同じ対象に対して使用できる位置が複数あるなら、
 地形効果が高い場所から行動する。地形効果が同じなら歩数が一番少ない所から。
2:1の対象がいない、または攻撃すると逆に自分に及ぶ被害のほうが大きそうな時、
 移動のみを行い、強い味方によっていく、又は弱い敵によって行く。
 地形効果はもちろん高い所へ。

1はカウンタで全部調べればよいので簡単だったけど、
2は抽象的なので思うように動いてくれなくて難しかった。

作る順序としてはまずは1を作ってみるといいと思う。
全部調べるから速度的に大丈夫かと思うかもしれないけど
使用可能アイテム4つ、移動力10以上でも、遅くても2、3秒以内だったと思う。
0024名無しさん、君に決めた!04/03/14 03:50ID:izwc8dBb
>>17
それは浮動少数でなく固定少数ですな

普通は1024(=2^10)とか4096(=2^12)を1とするのが速度的にいいよ。
0025名前は開発中のものです。04/03/14 14:32ID:qzv+RJRF
2D時代は、2^8でずっとやってきたな。
ハードの制約だけど、その頃はこれが一番。
0026名前は開発中のものです。04/03/14 15:14ID:lOSTaqTt
今もスケーリングを普通にやってるなー
↓みたいな感じで

dest[0] = dest[0] + ((dest[0] - src[0]) * alpha / 256);
...
0027名前は開発中のものです。04/03/14 15:18ID:lOSTaqTt
src[0] - dest[0]の間違いか・・・

MMX命令よりもSSE命令で今は行うのが一般的なのかな?
0028名前は開発中のものです。04/03/15 10:22ID:xvHM+bhp
固定小数点をマクロにしとくと(・∀・)イイ

/* 固定小数点型 */
typedef signed long fix;


/* 整数⇔固定小数点 */
#define FIX_TO_INT( a ) (( a ) >> 16)
#define INT_TO_FIX( a ) (( a ) << 16)

/* 浮動小数点⇔固定小数点 */
#define FLOAT_TO_FIX( a ) (fix)(( a ) * 0xffff)
#define FIX_TO_FLOAT( a ) ((float)( a ) / (float)(0xffff))
0029名前は開発中のものです。04/03/15 12:11ID:TcRXwi1n
いっそクラスにする手もあり。
コンパイラを信じられる漢におすすめ。
0030名前は開発中のものです。04/03/15 13:23ID:p3AFlJa9
Windowsのメッセージループで質問なのだけど、GetMessage()を使うのと、
PeekMessage()を使うのはどちらが主流なのかな?
GetMessage()+SetTimer()はFPSが微妙に安定しないし、PeekMessage()だと
CPUを100%使いかねない。
個人的にはCPUを100%使ってしかもムダ使いというのはマルチタスクOSでの
プログラミングとしては礼儀違反と思うし、例えば落ちゲーとかブロック崩し
なんかでCPU100%てのは納得もいかない。
SetTimer()での安定の悪さを考えて、1msecでWM_TIMERを発生させたあとに
timeGetTime()で実際の時間を取得、ずれを調整するようにしてみた。
WM_TIMER自体が1〜20msecで発生しているようで、とても60fpsなゲームなんて
作れないなあと思った。
常識的な方法があるなら知りたい。
0031名前は開発中のものです。04/03/15 13:26ID:p3AFlJa9
あともう一つ。
よくベンチマークで、400fpsとかいう数値があったりするけれど、
あれって何? 画面自体はせいぜい120fpsでるかどうかでしょ。
オレのモニタは液晶だから60だけど、CRTでも80とかじゃない?
400って表示しているFPSじゃなくて、演算可能な理論値ってことなのかな?
0032名前は開発中のものです。04/03/15 13:33ID:BH49Bw7k
>CPUを100%使いかねない。
Sleep入れればいいじゃん。

>よくベンチマークで、400fpsとかいう数値があったりするけれど、
>あれって何? 画面自体はせいぜい120fpsでるかどうかでしょ。
blitやポリゴン描画なんかの処理とモニタに出力する処理はほぼ平行に行われるから
そういう「描画処理」自体はモニタの同期信号の周波数とは関係ない。
普通HBLANKを待つから最大fps=リフレッシュレートなことが多い、というだけ。
0033名前は開発中のものです。04/03/15 14:54ID:nFKOW0T2
>>30
GetMessageで。WindowsなどVブランクをシステムが管理している場合は
ゲームスピードをFPS基準にすべきではない。75Hzの人もいれば60Hzの
人もいるのでVブランクではなく時間を基準にすべし。WM_TIMERは200ms
程度の精度(実際は変動あり)しかないのでMultiMediaTimerを使うしかない
と思われる。

Vブランクに関係なく処理が終わったら画面更新という設計にしておいて、
アニメーションは時間単位で制御する方針で。

>>31
Vブランクを待たずに画面更新をした場合の1秒間のフレーム更新回数。
コンシューマゲームと違ってVSyncはシステムが管理しているので、描画
ラスターがどこにいるかは意識する必要がない。
0034名前は開発中のものです。04/03/15 15:05ID:BH49Bw7k
あと、タイマーの精度については↓こんな文書があるので参考にしましょう!

GetTickCount, timeGetTime等の精度について
http://www.emit.jp/prog/prog_t1.html
0035名前は開発中のものです。04/03/15 16:34ID:4yykzdEK
FF風のRPGのゲームを作るプログラムは何が最適かな?
2Dで作りたいんですが。
0036名前は開発中のものです。04/03/15 16:58ID:7lXda+Uw
FFのどれだよ
0037名前は開発中のものです。04/03/15 17:43ID:p3AFlJa9
>>32>>33
おー。レスありがと。30&31です。
そか、fps表示は理論値ってことだね。納得。

IDirectDraw7::WaitForVerticalBlankでVSYNC待ちをするよう
作っていた。そのあとでバックサーフェースからフロントサーフェースに
IDirectDrawSurface7::Bltで画面転送していたけれど、試しにVSYNC待ちを
削ってみても問題なく動作した。そういうものだったのか。
Blt後にGetScanLineでVライン位置を取ってみると1027〜1031くらいの
数値が出る(縦1024のモニタ)から、自動的にVSYNC待ちをしてたんだね。
無駄なことをしてたワ。

なるほど、Sleep()はtimeBeginPeriod()と使うと誤差が減るのか。
PeekMessage()+Sleep()を試してみるよ。サンクス!
0038名前は開発中のものです。04/03/15 18:25ID:L+ne9Ht6
VC.NET2003にて
デバッグモードだと普通に動いてるのに
リリースモードにするとエラります(;´д⊂)
このような状況に陥る可能性にはどんな物があるでしょうか
0039名前は開発中のものです。04/03/15 18:33ID:p3AFlJa9
>>38
メモリリーク。
あるいはライブラリとのデバッグ/リリースモードの不整合。
0040名前は開発中のものです。04/03/15 18:50ID:BH49Bw7k
加えて
・変数、配列の初期化ミス
・配列や確保したメモリの境界を越えたアクセスにより他の変数が壊れた
とかも。
いずれもデバッガじゃ追いにくいやつやね。
がんがれ。
0041名前は開発中のものです。04/03/15 19:08ID:JehxVOt7
半透明ポリゴンのZソートを高速に行う方法を教えてください。
検索をかけたのですが、アルゴリズムを見つけられませんでした。

今やってるやり方は、
3角形の重心を透視変換して計算したZ値 0.0〜1.0を
もとにクイックソートをつかって並び替えています。

この方法が一般的でしょうか?
■ このスレッドは過去ログ倉庫に格納されています