トップページgamedev
1001コメント397KB

DXライブラリ 総合スレッド 2008

■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。2008/10/25(土) 17:37:53ID:BCFbbKco
Cを習得した程度のスキルでも、
GUIのゲームを比較的容易に作成する事を可能にする、
「DXライブラリ」に関するスレッドです。

DXライブラリの詳細ついては
http://homepage2.nifty.com/natupaji/DxLib/
を参照して頂きたい。

DXライブラリに関するテクニックなどの情報交換などを行う事で、
多くのDXライブラリユーザのスキルの向上に役立てたら幸いです。

過去スレ:DXライブラリ 総合スレッド
      http://pc11.2ch.net/test/read.cgi/gamedev/1197468399/
0013名前は開発中のものです。2008/10/25(土) 23:54:35ID:ZbA2BxSK
たまたま来てスレ立てとな!
0014名前は開発中のものです。2008/10/25(土) 23:56:47ID:4olZVcWC
シルバーガンとかレイストームみたいな奴を手っ取り早く作りたい!
……って時には結構強いよね、3D版。

ポリゴンモデルを用意できるかどうかは別として。
0015名前は開発中のものです。2008/10/27(月) 14:23:21ID:Jt+1Mejf
>>12
クリックできないとは?
うちもFirefox3だけど問題ないが
0016名前は開発中のものです。2008/10/27(月) 15:24:06ID:nBdNvLmf
DXライブラリの参考になるサイトも一通りテンプレにいれたらいいのに
0017名前は開発中のものです。2008/10/27(月) 22:20:31ID:nZeh8WoA
DXライブラリで、超単純な当たり判定ってどんなのがある?

画像が重なった瞬間消すだけでもいいんだけど、どうすればいいかよくわからん
0018名前は開発中のものです。2008/10/27(月) 22:24:13ID:OObvFpvs
DXライブラリで、ってのがよく分からんが、ごく普通の当たり判定じゃダメなのか。
最も単純って言うと、

 if ( x1 == x2 && y1 == y2 )

とか?
0019名前は開発中のものです。2008/10/27(月) 22:48:15ID:zN//f5BC
矩形の当たり判定が基本でしょ
0020名前は開発中のものです。2008/10/27(月) 23:21:07ID:nBdNvLmf
円の当たり判定が一番簡単じゃない?
普通にピタゴラスの定理使えばいいだけ
0021182008/10/27(月) 23:28:42ID:OObvFpvs
ぶっちゃけどれも基本だよな。
0022名前は開発中のものです。2008/10/27(月) 23:42:59ID:zN//f5BC
円の当たり判定はベクトル使うと異常に綺麗に書けるよね
0023名前は開発中のものです。2008/10/27(月) 23:52:30ID:nBdNvLmf
>>22
ピタゴラスの定理より簡単になるの?
0024名前は開発中のものです。2008/10/28(火) 09:43:23ID:/xky1qOF
通過しちゃったやつも当たったと判定しなきゃならんこともあるし
0025名前は開発中のものです。2008/10/28(火) 10:06:09ID:jGlZfuVr
ベクトル使うと当たり判定が菱形にならないか?
0026名前は開発中のものです。2008/10/28(火) 11:15:02ID:Ot+vqO8g
>>24
あるあるw 処理時間の関係でどうしてもなるよな。あれが厄介
0027名前は開発中のものです。2008/10/28(火) 19:25:08ID:Ot+vqO8g
http://www.nicovideo.jp/watch/sm5018275
DXライブラリ3Dの動画発見した
0028名前は開発中のものです。2008/10/28(火) 21:25:44ID:mug6SHfM
ニコニコでDXライブラリで検索したら16件ほど出てくるのね
0029名前は開発中のものです。2008/10/29(水) 04:50:01ID:yue3f1oW
>>26
あれは線と線の交差を計算するだけ
0030名前は開発中のものです。2008/10/29(水) 04:51:17ID:HeG9A7jn
>>29 kwsk
0031名前は開発中のものです。2008/10/29(水) 05:21:45ID:yue3f1oW
>>30
移動前と後の座標間を結ぶ線を引く。線を引くといっても直進なら2つの座標が直線を表す式になる。
直線1本を座標変換によってX軸と一致すると仮定する。
検査対象のオブジェクトのY座標が全てプラスまたは全てマイナスなら交差していない。

検査対象が1本の直線だとしよう。
直線は2つの座標で表されるので、その座標がプラスとマイナス座標の組み合わせなら交差していることになる。
数学では交点を求めるが、交差のみ検査するなら、Y座標だけ調べればいい。
二つの座標を(x1,y1)と(x2,y2)として、y1×y2がプラスなら交差なし、マイナスなら交差ありになる。
ポリゴンは線の集合なので、ポリゴンを構成する全ての直線についてこの計算をするもよし、
正の座標と負の座標それぞれの数を数えるもよし。

座標変換については高校数学で習うけど、ゆとり教育の今は大学まで進まないと習わないだろうね。
コンピューターグラフィックとかシミュレーションやるなら絶対必要な数学なんだけど、
大学生になってから学び始めても理解できるわけがない。
ようするに日本人は優秀なプログラマにはなれない。
0032名前は開発中のものです。2008/10/29(水) 08:48:56ID:46mBxw3n
論理飛躍しすぎだろjk
0033名前は開発中のものです。2008/10/29(水) 15:25:49ID:S9yFdqtr
>>31
>Y座標だけ調べればいい。

という意味がわからん・・。
x軸と一致するように回転した線分の定義域x0の範囲を
x01< x0 <x02
としたら、この範囲の中でyの掛け算結果がマイナスになれば交差とわかるけど。
もし交点がこのx0の範囲じゃないところで交差していたらどうするの?
直線と直線の交差ならこれでいけるけど、
使いたいときってほとんど線分と線分じゃない?
0034名前は開発中のものです。2008/10/29(水) 15:36:57ID:HeG9A7jn
>>33
横レスすみません。直線と線分って定義上違うんですか?
直線と長方形という意味でしょうか?
0035名前は開発中のものです。2008/10/29(水) 15:41:55ID:p+8U8df2
>>34
直線の長さは無限大。(線分には端が存在するが、直線には端が存在しない)
だから、二本の直線は必ず交差する

注1 並行である場合を除く
注2 2Dの場合に限定
0036名前は開発中のものです。2008/10/29(水) 15:45:07ID:HeG9A7jn
>>35
詳しい説明ありがとうございました。なるほどそういう違いがあるんですね。
0037名前は開発中のものです。2008/10/31(金) 03:09:52ID:wPwg2eVl
結局>>31の方法で線分の交差は判定できるの?
0038312008/10/31(金) 06:44:39ID:SBgHi4S/
直線と言ってしまったのは悪かった。
まあ確かに>>33の言うとおり、x座標の範囲も見ないと実際は分からないけど、
直線とみなさないとy座標だけでは上にあるとも下にあるとも言えないから。

両方を直線とみなせば並行じゃない場合必ず交差する。
でも、平行じゃない直線が取るx座標、y座標は無限となるでしょ。
y座標のみ見るというのは、点として見ているから交差しない。
僕が言いたかったのは、基本的には数学の計算を利用するけど、交点まで求める必要はないということ。

計算手順としては、座標変換後、それぞれのx座標のみについて基準の線分の範囲内にあるかどうかを見て、
次に>>31で説明したようにy座標のみを見れば大体判断できる。
x座標が範囲の内と外をまたぐ線はあいまいだけど、
基準線の交差する側の端点を基準にしてx成分とy成分の比率を見れば交差するかどうかが分かる。

ちなみにこの計算方法はキャノンが特許申請してるが
常識なので却下するべき。
http://www.j-tokkyo.com/2003/G06T/JP2003-085568.shtml
0039名前は開発中のものです。2008/10/31(金) 07:17:25ID:2oP1KQG/
こんなのが特許なら俺のソースは特許500個くらいあるな。
0040名前は開発中のものです。2008/10/31(金) 07:37:16ID:ypJM5WNC
>>31
あんた詳しいな。いろいろと。差し支えなければ職業とか聞きたい。
0041名前は開発中のものです。2008/10/31(金) 20:29:02ID:2jgW7Qyq
この休みはゲーム作るか……
0042名前は開発中のものです。2008/11/01(土) 15:44:46ID:NPyLG5nz
ポリゴンもそうだが球の当たり判定でいくのが一番簡単
中心と半径だけで計算できる。
0043名前は開発中のものです。2008/11/02(日) 08:06:57ID:lCIgFzJ9
何気なく質問した当たり判定だけどピンキリだって事だな
0044名前は開発中のものです。2008/11/02(日) 11:25:09ID:N/BXqZR7
で、DXライブラリに当たり判定してくれる関数はないの?
0045名前は開発中のものです。2008/11/02(日) 12:31:49ID:5aCVFStd
3D版にはあるね。
本家の隠し関数の中にあるかどうかまでは知らない。
0046名前は開発中のものです。2008/11/02(日) 15:48:59ID:HThmNcwB
>44
DXライブラリって、そういう系統の関数は用意しないという設計思想のよーな。
0047名前は開発中のものです。2008/11/02(日) 19:05:58ID:tamTTJ4k
DXライブラリの2Dの方は2Dだし別に衝突判定とか用意しなくていいと思う。
初心者なら四角か球同士の判定を自分で実装することの勉強にもなるし2Dは
高校の数学程度で十分自力で実装可能。
3Dならそれだけで分厚い本があったり研究者がいたりするくらいだから面倒だけど。
0048名前は開発中のものです。2008/11/02(日) 19:10:46ID:R+WQmTm1
3DでもAABBや球の辺り判定なら2Dと変わらないよ
2Dでも面倒なことするなら面倒
0049名前は開発中のものです。2008/11/07(金) 09:51:29ID:D/J6e6ls
3DのAABBは、スキンメッシュだと非常に面倒
0050名前は開発中のものです。2008/11/07(金) 17:21:25ID:F7VY1GkH
あー、ブロッコリー食いたくなってきた。スレチガイかもしれませんがあれってどうやって食べるの?
0051名前は開発中のものです。2008/11/07(金) 17:24:04ID:F7VY1GkH
すみません。板間違えてました。野菜板で聞いてみますノシ
0052名前は開発中のものです。2008/11/07(金) 17:32:26ID:AIGNp4++
ちょwww
0053名前は開発中のものです。2008/11/08(土) 04:58:31ID:AWLKZdyA
DXライブラリのスレは勘違いでいいから賑わって欲しい・・w
0054名前は開発中のものです。2008/11/08(土) 14:28:00ID:zrv99/58
WMPの視覚エフェクトをまねたいんだけど
リアルタイムの画像処理はDXライブラリじゃ難しい?
0055名前は開発中のものです。2008/11/08(土) 14:45:42ID:cVyljR6E
>>54
DXライブラリを詳しくわからないのだけど、
DXライブラリってテクスチャつかえますよね?
レンダリングターゲットをテクスチャに設定して
そこに視覚エフェクトを描画。
それを、通常レンダリングターゲットにもどして
そのテクスチャを描画してみては?
視覚エフェクトのアルゴリズムがわかれば可能だと思います。


0056名前は開発中のものです。2008/11/08(土) 15:49:01ID:eTLcPw0w
特定のキー以外を取得したいのですが、
例えばエンターキー以外が押されている場合を取得するのはどうやればいいのでしょうか?

if (CheckHitKey(KEY_INPUT_0) == 1)
{
flgOn = true;
}
if (CheckHitKey(KEY_INPUT_1) == 1)
{
flgOn = true;
}
if (CheckHitKey(KEY_INPUT_2) == 1)
{
flgOn = true;
}
....
if (CheckHitKey(KEY_INPUT_RETURN ) == 1)
{
flgOn = false;
}
のようにして、一つずつどのキーが押されているかを判定して、
その押されたくないキーの時だけフラグをONにしないと言う方法を考えたのですが、
大量に判定(255個?)しないといけません。
それに書く量も多いです。
何か良い方法はないでしょうか?
0057名前は開発中のものです。2008/11/08(土) 16:18:22ID:QvZXcY8M
>56
普通に考えればそうなるんじゃないかなあ。
タイピングを必要とするソフトなんだろうか。
0058名前は開発中のものです。2008/11/08(土) 16:22:15ID:mEomuEol
>>56
KEY_INPUT_○○を全部一つの配列に入れとけばループで処理できる
KEY_INPUT_RETURNが来たときだけ別にすればいい
0059名前は開発中のものです。2008/11/08(土) 16:30:21ID:L3IthcNy
flgOn = false;
if (CheckHitKey(KEY_INPUT_RETURN) == 0)
{
flgOn = true;
}

じゃだめなの?
0060名前は開発中のものです。2008/11/08(土) 16:31:40ID:L3IthcNy
あーごめん、だめだ。 エンター押されてない かつ ほかのキーが押されてる だったね
0061名前は開発中のものです。2008/11/08(土) 16:31:51ID:jD220VQN
>>56
CheckHitKeyAll( void )を使って、キーボードの状態を監視しておいて、
何か押されたとき、CheckHitKey(KEY_INPUT_RETURN)で、
エンターが押されているかどうか判別する。
エンターが押されていなければ、エンター以外の何かが押されたことになる。
0062名前は開発中のものです。2008/11/08(土) 17:05:01ID:cnhuR5Wy
CheckHitKeyAll(void) だとマウスボタンとゲームパッドも反応するので
CheckHitKeyAll(DX_CHECKINPUT_KEY) で。

……これでもパッドが反応するんでコードチェックしたらバグだった。

DxInput.cpp:
 >// ジョイパッドのチェック
 >if( CheckType & DX_CHECKINPUT_KEY )  // DX_CHECKINPUT_PAD のはず

気になるならバグ報告して修正を依頼してください。
0063名前は開発中のものです。2008/11/08(土) 17:08:47ID:eTLcPw0w
みなさんありがとうございます。
一応タイピングのゲームです。

ループ処理をヒントに、
bool flgOn = false;
for (int i = 0; i < 256; i++ )
{
if (i != KEY_INPUT_RETURN)
{
if (CheckHitKey(i) == 1)
{
flgOn = true;
}
}
}
という風な処理にしたら、一応望み通りの動きができました。
でもバグ有りそうな予感がします。
CheckHitKeyAllを使えばもう少しスマートに書ける……のかな?
0064名前は開発中のものです。2008/11/08(土) 17:24:48ID:QvZXcY8M
タイピングゲームって言っても、使わないキーはあるだろうから
そのあたりを省いた方がいいかも
0065名前は開発中のものです。2008/11/09(日) 13:19:18ID:YyCrr7f5
KEYリテラルはビットフラグを利用してると思うから
&を使えばシンプルにすっきり書けるはずだよ。
0066名前は開発中のものです。2008/11/09(日) 15:04:32ID:wPDrFVAu
だれかDXライブラリで作ったすごいゲーム等紹介してください
0067名前は開発中のものです。2008/11/09(日) 15:37:16ID:d71QR9Rf
>>66がすごいと思うかは知らんが、
公式で紹介されてない所だと夜光蛾4とかDiadraEmptyとか。
同人系は「DXライブラリでここまで作れる」っていう良い例が多いな。
0068名前は開発中のものです。2008/11/09(日) 16:53:27ID:HksuFgRc
DiadraEmptyすげえな。
個人的にはモノリスフィア。
0069名前は開発中のものです。2008/11/09(日) 17:01:59ID:p4NI5+2s
>>66
四聖龍神録は?半オープンソースだし。
0070名前は開発中のものです。2008/11/09(日) 18:19:57ID:/7amOdfc
DXライブラリってDirectXのラッパーなんだから2Dならなんでもいけるだろ
0071542008/11/10(月) 00:04:21ID:fweGd5hJ
>>55
描画先変更できたのかーー!
こいつは便利だ

他にも見落としてる便利な関数あるかもと思って久しぶりに本家リファレンスページ見たら
”ドット単位で画像にアクセスしたい関係”ってのが追加されてて便利すぎフヒヒきゃっほう!!!11


もうひとつ質問です。DrawPolygon3Dかなにかで3D平面を、空気遠近法で表示させたいのですが
似非でもいいのでいい方法ないでしょうか
0072名前は開発中のものです。2008/11/10(月) 17:51:27ID:22QGh1G7
DrawPolygon3DのZ値を変えれば距離が変わるよ。
本家のリファレンスみたらわかるはず。
0073名前は開発中のものです。2008/11/11(火) 01:35:00ID:g6Sl8AVb
>>66
あとはゲームではないが
ウディタ(WOLFRPGエディタ)もそうだ。
0074名前は開発中のものです。2008/11/11(火) 16:04:15ID:VHeofJsH
8時から11階から目薬の企画実行移します。場所は↑のとこで。
参加者は今のとこ私の他は3人です。その後焼き鳥でも食べに行きましょう。
0075名前は開発中のものです。2008/11/11(火) 19:37:44ID:ktqf9Hz0
最近のグラボは、古いDirectXにマトモに対応しておらず
DXライブラリもその煽りを食らってるって聞いたんだけど、どうなん?
0076名前は開発中のものです。2008/11/12(水) 06:22:06ID:yL4++M3C
そうなの?
9600GT,8800GTS,6600GTの3つ使ってるけどどれも不具合出たこと無いよ。

それよりVistaでたまにおかしなことになる・・。
同じコードで動かしてもXPとVistaじゃ違う挙動することが。

一つ一つのサンプル動かしても全然違わないんだけど、
スゲー大きなプログラムを動かしてみると違いが出てくることがある。
どうしてなんだろ・・。
DX管理人さんはそんなことないって言ってるから
自分のプログラムが悪いだけかもしれんが・・。
みんなそういうこと無い?
0077名前は開発中のものです。2008/11/12(水) 08:00:35ID:10ZLablI
>>76
VISTAに最初からはいってるのはDirectX10だからね。それも中途半端な。
MSの中途半端な対応のせいでゲーム開発者はみんな迷惑してる。
DirectX9とか新しいDirectX10とかを入れてみると改善すると思う。
0078名前は開発中のものです。2008/11/12(水) 08:10:38ID:wRCT4Vg2
>>76
ビデオドライバ類が関係しているとかないかな
0079752008/11/12(水) 18:00:22ID:IPCAcIHc
グラボじゃなくてVistaってことかもしれん。
自分は持ってないんで確認できないまま適当に書いた、すまん。
0080762008/11/12(水) 20:17:02ID:yL4++M3C
DirectX10の影響はいろいろ聞くね。
今度出るwindows7だっけ?あれはどうなるんだろう・・。

>>75

VistaとXPデュアルブートするといいよ。
作ったゲーム色んな環境で試してみれる
0081名前は開発中のものです。2008/11/12(水) 20:59:00ID:IPCAcIHc
>80

2000 orz
0082名前は開発中のものです。2008/11/12(水) 22:09:52ID:10ZLablI
Windows7でMSコケたらDirectX終わってLinux+OpenGLが盛んになる予感
0083名前は開発中のものです。2008/11/13(木) 01:05:13ID:mdnPfmFM
ビスタって結局なんだったんだ・・。
なんかうちの周りだと、PCに詳しくない奴が買ってるOSってイメージがある。
そのまま終わっていくのかビスタ。
0084名前は開発中のものです。2008/11/13(木) 07:38:57ID:lJxFlB+u
諸刃の剣素人には(ry ってやつじゃない?
0085名前は開発中のものです。2008/11/13(木) 19:45:16ID:EnpEGfrm
>>83
ネットできりゃそれでいいってやつが買ってる印象だな
あとはofficeでも使えりゃ困らないしな
0086名前は開発中のものです。2008/11/13(木) 23:48:34ID:mdnPfmFM
レンダリング処理やエンコードとかしても、ビスタは遅くてしかたないよ・・。
0087名前は開発中のものです。2008/11/14(金) 00:26:08ID:5PrZBKJs
>>80
今時デュアルブートって流行らないんじゃない?
VPCとかさ。
0088名前は開発中のものです。2008/11/14(金) 01:06:10ID:71kfvXp8
今の最新技術は知らんけど、VirtualPC、VMWareは
グラフィックボード使ってなくて、CPU依存
0089名前は開発中のものです。2008/11/14(金) 01:26:37ID:ZojnRlhq
デュアルブートって流行ってるからとかでやるもんじゃないだろ
0090名前は開発中のものです。2008/11/14(金) 01:28:06ID:5PrZBKJs
どこから突っ込めばいいのか…
0091名前は開発中のものです。2008/11/14(金) 01:28:54ID:BF+CzcYi
>>90
つ*
0092名前は開発中のものです。2008/11/14(金) 13:57:39ID:foiTr96E
800*600のサイズでウインドウモードにしたいんだが、
SetGraphModeとChangeWindowModeを同時に使うと、
かなりの確率でOSごと落ちるorz
0093名前は開発中のものです。2008/11/14(金) 14:22:12ID:foiTr96E
DxLib_Initの後にChangeWindowMode置いたらフリーズしなくなった
サーセンwwwフヒヒwwwww
0094名前は開発中のものです。2008/11/14(金) 14:48:29ID:ZojnRlhq
>>93
初期化の前にウィンドウモードにした方が処理が早いよ
0095名前は開発中のものです。2008/11/14(金) 14:50:12ID:foiTr96E
初期化(DxLib_Init)の前にSetGraphModeとChangeWindowMode書くと、
うちの環境ではなぜかフリーズするんです
0096名前は開発中のものです。2008/11/15(土) 19:53:04ID:MzdFlqka
質問させてください

ゲームの速度をどのPCでも一定になるようにするために、
ScreenFlipを使う前と後の時間差を利用してる方法が本にあったのですが、
そもそもScreenFlip一回の時間はどのように決まっているのでしょうか?
0097名前は開発中のものです。2008/11/15(土) 20:12:06ID:56rIt8Hu
リフレッシュレート。

画面のプロパティ→設定→詳細→モニタ で、リフレッシュレートが確認できる。
つってもこれは俺のPC(windows2000)だから他の環境だとちょっと違うかも。
0098名前は開発中のものです。2008/11/15(土) 20:17:30ID:56rIt8Hu
補足。

ScreenFlipがリフレッシュレート通りになるのは
デフォルトで垂直同期信号待ちをしてるからであって、

「SetWaitVSyncFlag  ScreenFlip関数実行時にCRTの垂直同期信号待ちをするかのフラグセット 」

で、垂直同期信号待ちを切った場合は関係ない。

また、条件は知らないが特定の環境(うちの場合はサブのノートPC)では
垂直同期信号待ち設定にしていても、ScreenFlipで垂直同期信号待ちしてくれない場合が
ある事を確認済み。
0099名前は開発中のものです。2008/11/15(土) 20:27:43ID:MzdFlqka
>>97-98
返事ありがとう。

リフレッシュレート自体はわかったんですが
後半よくわからなかったのでちょっと調べてみます・・・。
0100名前は開発中のものです。2008/11/15(土) 20:51:40ID:56rIt8Hu
>ScreenFlipを使う前と後の時間差を利用してる方法

ってのがどんなのか判らないけど、
ScreenFlipの垂直同期信号待ちを利用した方法だとすると
前述したようにリフレッシュレートに依存するから
「どのPCでも一定の速度」にはならないよ。

リフレッシュレートを60にしてるPCと70にしてるPCではスピードが違う。

まぁそれを踏まえた上でいちばん簡単で代表的な速度を一定にする方法なんだけどね。
(つまり、リフレッシュレートが60の場合を前提としてゲームを作り、
 60以外にしてる人は60にしてからプレイしてください、となるw)
0101名前は開発中のものです。2008/11/15(土) 21:13:47ID:56rIt8Hu
垂直信号同期待ちについて、おおざっぱに説明してみようか。
俺も聞きかじりの知識だが。

最近はテレビにしろディスプレイにしろ、液晶が主流で「薄型」になってるが
もしブラウン管(分厚い)のテレビなりディスプレイがあるなら、画面の前で手を振ってみるといい。
残像がぶつ切りに、ストップモーションのように見えるはずだ。

これはどういう事かというと、画面が60分の1秒に一回、点滅してるからそう見えるんだ。
(厳密には60分の1秒に画面半分)
つまり、画面が光ってる時に「手の影が見えて」、画面が消えてる時には「見えない」から
手の動きがぶつ切りに見えるわけだ。

そうやって点滅してるのに、ずっと光ってるように見えるのは残像のせい。

もっとも「眼(瞳孔)」の方は反射で動いてるから、画面が光ってる時には瞳孔が小さくなり
画面が消えてる時は瞳孔が大きくなってたりするはず。
だから画面に近づいたり、暗い部屋で画面を見たりすると極端に眼が疲れる。
0102名前は開発中のものです。2008/11/15(土) 21:24:13ID:56rIt8Hu
さて、画面が点滅してる、と言ったが、画面全体がぱっとついたり消えたりしてるわけじゃない。
ブラウン管ってのは、奥から電子ビームを画面に向けて照射して、その部分のみを光らせてるわけだから
実際に光ってるのは1点のみ。(もっとも一度照射されるとしばらくは持続するらしいが)
その電子ビームの照準が、画面の左上から始まって、右端まで動き、
一段さがってまた左端から始まって右まで動き、を繰り返し、画面の右下まで進む。
つまり
┏━━━┓
┃□ぬ□┃
┃□る□┃ みたいな画面が表示されてると、それは実際は
┃□ぽ□┃
┗━━━┛

┏━━━┓
┃□ぬ□┃
┃■■■┃
┃■■■┃
┗━━━┛
┏━━━┓
┃■■■┃
┃□る□┃
┃■■■┃
┗━━━┛
┏━━━┓
┃■■■┃
┃■■■┃
┃□ぽ□┃
┗━━━┛
という感じで高速に書き換えられてるという事。
0103名前は開発中のものです。2008/11/15(土) 21:30:19ID:56rIt8Hu
ここでゲームの話になるわけだが、ゲームのキャラクターは画面上をあちこちに動く事になる。
もしこの「動く」のが前述した「画面を書き換えてるタイミング」だったらどうなる?
┏━━━┓
┃ぬ□□┃
┃る□□┃ この状態から
┃ぽ□□┃
┗━━━┛
┏━━━┓
┃□□ぬ┃
┃□□る┃ この状態からにまで移動しようとすると
┃□□ぽ┃
┗━━━┛
┏━━━┓
┃ぬ□□┃
┃■■■┃
┃■■■┃
┗━━━┛
┏━━━┓
┃■■■┃
┃□る□┃
┃■■■┃
┗━━━┛
┏━━━┓
┃■■■┃
┃■■■┃という感じになり、
┃□□ぽ┃
┗━━━┛
┏━━━┓
┃ぬ□□┃
┃□る□┃ 人間の目にはこう映ってしまう。この現象をティアリングと呼ぶ。
┃□□ぽ┃
┗━━━┛
0104名前は開発中のものです。2008/11/15(土) 21:38:19ID:zVe3F0+t
>>100
「ScreenFlipを使う前と後の時間差を利用してる方法」ってのを普通に解釈したらリフレッシュレートに依存せずに一定になるよ。
ScreenFlipの待ち時間に関係なく、1フレーム(1ループ)の差時間から移動距離を割り出せばok。
ただし、ゲーム画面がアクティブでなくても実際に時間は経過してるので、ゲームに戻るとその分進む(進んだ)ことになる。
これを回避するなら、ゲーム内で独自にインクリメントカウントを設置し、そこから移動距離を割り出せばok。
ゲームプログラミング独特の考え方だね。
0105名前は開発中のものです。2008/11/15(土) 21:40:57ID:zVe3F0+t
>>101
ブラウン管テレビは29.97fpsだよ。
0106名前は開発中のものです。2008/11/15(土) 21:41:23ID:56rIt8Hu
このティアリング(ちらつき)をさせないためにはどうすればいいか?

これが「垂直同期信号待ち」であって、つまりは
ディスプレイが画面全体の書き換えが終わるまで、
次の描画処理をしないで待ってるってわけだ。

これがScreenFlipではデフォルトで行われてる。
だからScreenFlipを使うと速度が一定に保たれる……のだが、

「画面の点滅は60分の1秒」と言ったが前述したが、これが要するにリフレッシュレートの事。
つまりこの速度をPC側で自由に変更できたりする。

リフレッシュレート60の場合はScreenFlipは60分の1秒経つまで待つわけだが、
リフレッシュレート70の場合は70分の1秒しか待ってくれない。
その分ゲーム速度は速くなってしまうわけだ。
(もしプログラム処理自体が重くて、70分の1秒で終わらなかったら
 70分の2秒、つまり35分の1秒かかるわけで、逆に遅くなる)

0107名前は開発中のものです。2008/11/15(土) 21:47:42ID:56rIt8Hu
移動距離を割り出すという方法は知ってるし理屈も解るけど、
当たり判定もそれ相応の処理にしなくてはいけないし、
そうなるとリプレイ記録&再生をどうやればいいのかわからなくなる。
そこらへんはどうやってるのかな。

ってこれはDXライブラリと関係ないか。
0108名前は開発中のものです。2008/11/15(土) 21:57:26ID:zVe3F0+t
当たり判定もリプレイ記録も問題ないよ。
でもScreenFlipの待ち時間を基準にするなんて誰もしないと思うから
あたかもScreenFlipを使うとスピードがリフレッシュレート依存になるみたいな解説はやめたほうがいいと思うよ。
0109名前は開発中のものです。2008/11/15(土) 22:29:29ID:PnDW3j7Q
画面を書き換えたときに時間を取得し、前回取得した時間と比較して、
1ループが17ミリ秒(60FPS)になるまでウェイトをかけてやればいい
これが一番簡単で確実
0110名前は開発中のものです。2008/11/15(土) 22:34:05ID:RlpGwAN3
リフレッシュレートが60のときはScreenFlip依存でいいんじゃね
それ以外はタイマで
0111名前は開発中のものです。2008/11/15(土) 23:12:07ID:56rIt8Hu
>でもScreenFlipの待ち時間を基準にするなんて誰もしないと思うから

いや、俺してたし、してるしw
0112名前は開発中のものです。2008/11/15(土) 23:32:40ID:zVe3F0+t
>>111
その話をしてるのは君だけど、実際にそれを採用してる人はいないって事だよ。

もしかして君は採用もしてるの?
だとしたら自分が長々と説明したデメリットが解消できてないよね。
それを解消したくて質問したいならそれなりの場所でそれなりの質問方法を取ればいいと思うよ。
もしそうじゃないなら誰も採用しない方法を解説されてもややこしくなるだけだから…。
■ このスレッドは過去ログ倉庫に格納されています