トップページ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/
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
その話をしてるのは君だけど、実際にそれを採用してる人はいないって事だよ。

もしかして君は採用もしてるの?
だとしたら自分が長々と説明したデメリットが解消できてないよね。
それを解消したくて質問したいならそれなりの場所でそれなりの質問方法を取ればいいと思うよ。
もしそうじゃないなら誰も採用しない方法を解説されてもややこしくなるだけだから…。
0113名前は開発中のものです。2008/11/15(土) 23:41:52ID:56rIt8Hu
ティアリングが嫌だから切り替え方式にしてるます。
最初はゲーム起動時に測って自動切換えにしてたけど
それもやめて結局手動切り替えに……。
0114名前は開発中のものです。2008/11/15(土) 23:43:35ID:56rIt8Hu
切り替えってのはリフレッシュレート依存方法と、タイマでウェイトかける方法の二つね。
移動距離算出方法はやった事ないです。
0115名前は開発中のものです。2008/11/16(日) 00:40:12ID:H38ODQJJ
ティアリングとスピードは関係ないでしょう。
とりあえずDXライブラリを使うならScreenFlip()で垂直同期を待てば良いと思うよ。
スピードの話はまた別の話。

>>113
ゲーム起動時に何を測るの?
それと、切り替える必要性が見えないんだけど・・・?
0116名前は開発中のものです。2008/11/16(日) 01:43:29ID:Hwka3oLK
>>115
>ゲーム起動時に何を測るの?

ScreenFlipを一秒間繰り返して、その回数で判断。
>>98で書いたけど、垂直同期信号待ちをしてるはずなのに
ScreenFlipで待ってくれない場合があるから、
FPS値が異常に高かったらそうだと判断して
タイマー値によるウェイトかけるようにしてた。

>それと、切り替える必要性が見えないんだけど・・・?

それはどっちを基準にして?

ScreenFlipを基本として考えるなら、リフレッシュレートが変更された場合や
上で書いた垂直同期信号待ちしてくれない環境の時に異状スピードになってしまう。

タイマ値でウェイトかける場合は、やっぱりティアリングが気になるし、
1フレームごとに点滅するエフェクトとかがきちんと点滅しなくなる。
0117名前は開発中のものです。2008/11/16(日) 02:40:28ID:H38ODQJJ
>>116
えっと、だからね、ScreenFlipとティアリングは関係あるけど、
それらとウェイトは関係ないって事だよ。

ゲーム起動時にScreenFlipの待ち時間からリフレッシュレートを判断してるようだけど、
それも結局ScreenFlip基準でタイマー取る方式だよね。
てことは例えば60Hzを基準にウェイトをかけるって事だよね。
だとしたらはじめからリフレッシュレートのウェイトなんかに頼らずに、
マルチメディアタイマーででも1/60sを基準にコードを書けばいいでしょ?
だから起動時に測る必要もないし、リフレッシュレートの変更やVsyncを待たない場合は考慮しなくていいの。
繰り返すけど、タイマーでウェイトかけてもScreenFlipを使うならティアリングはないよ。
0118名前は開発中のものです。2008/11/16(日) 03:40:07ID:Hwka3oLK
何か齟齬がある気がする。

タイマでウェイトかける場合は、ScreenFlipのVsync待ちはOFFにしてあるんだけど、
それでもティアリングは発生しない?

んじゃ発生してる俺のプログラムは何か間違ってるのか。

理屈上、1/60sを基準にウェイトかけるようにすれば
ゲームスピードは一定になるが、タイミング次第で
ティアリングが発生しない状態か、
あるいはティアリングが発生し続ける状態が
維持されるものだと思っていたのだが。

0119名前は開発中のものです。2008/11/16(日) 04:22:31ID:H38ODQJJ
Vsync待ち、かつ、タイマーで制御するんだよ。
これを前提に最初から読み返してみて。
0120名前は開発中のものです。2008/11/16(日) 14:59:43ID:Yf+kFgNP
ScreenFlipもやって、1/60secも待って、ってやらないと一定にならないし、ちらつきも解消されないよ。
0121名前は開発中のものです。2008/11/16(日) 17:43:53ID:fHnaEgZY
タイマー待ちを使うんならVsync待ち無しのScreenFlipじゃないと
ティアリングは発生しないけど動きが凄いガクつくぞ
ADVみたいに動きの少ないゲームならそれでも良いと思うけど、
STGやACTでは見るに耐えない
0122名前は開発中のものです。2008/11/16(日) 18:33:07ID:H38ODQJJ
60Hzに合わせれば60Hzの環境なら結局タイマーでウェイトしないから問題ないよ。
75Hzの環境なら60fpsに制限されるから多少はガクつくけどこれはトレードだね。
ちなみに3Dモノとか海外のゲームはfpsを出来るだけあげて垂直同期しないっていうのが主流みたい。

>>121みたいにfps制限はするわ垂直同期しないわっていうのは愚の骨頂。
ティアリングするわfps制限されてるわでひどいもんですわ。
0123名前は開発中のものです。2008/11/16(日) 21:17:57ID:gVsDrcFZ
>>102-103
ガッ
0124名前は開発中のものです。2008/11/16(日) 21:57:20ID:fHnaEgZY
>>122
なんでそんなに相手を見下したような態度なの?

>60Hzに合わせれば60Hzの環境なら結局タイマーでウェイトしないから問題ないよ。
それはわかってるよ
だから最初にリフレッシュレート測って垂直同期主体にするかタイマー同期にするか判断するんでしょ?
121はあくまでfpsとリフレッシュレートが一致していない場合の話

>75Hzの環境なら60fpsに制限されるから多少はガクつくけどこれはトレードだね。
ここで122の言うとおり垂直同期とるかとらないかはプレイヤーの好みの問題
オプションで選択できるようにすべきだと思う

>ちなみに3Dモノとか海外のゲームはfpsを出来るだけあげて垂直同期しないっていうのが主流みたい。
そうだね。3Dモノは可変fpsと相性良いよね。

>>121みたいにfps制限はするわ垂直同期しないわっていうのは愚の骨頂。
垂直同期をとらないことで手軽に入力に対するレイテンシを下げることができるし、
リプレイを取る目的でfpsを固定しなければならない場合もあるんだから、
短絡的に愚の骨頂というのはどうだろう

122的には60fps固定+垂直同期してない東方緋想天は愚の骨頂?
俺はそうは思わないけど・・・
0125名前は開発中のものです。2008/11/16(日) 22:50:57ID:5RilDqvE
2Dシューティングを過去いくつか作ってきましたが、
リプレイ周りの実装も含めて、やっぱりFPSは60に固定でロジックを組みますよ。
オプションで「Vsync待ちをするかタイマーか」を選択させてます。
124さんもリプレイの話をしているから、そういう前提で言ってるのだと思うのですが。
0126名前は開発中のものです。2008/11/16(日) 23:07:43ID:xtMr6+ch
リプレイって別にFPS固定必要ないような
入力があったキーとその時の経過フレーム数があればいいんだし
0127名前は開発中のものです。2008/11/16(日) 23:30:59ID:0yDeWpwc
おまいら もちつけよ.
0128名前は開発中のものです。2008/11/17(月) 01:36:47ID:GetktCW+
>>124
何そのゲーム。>東方なんたら
最悪だね〜。

>>126
だよねぇ。
0129名前は開発中のものです。2008/11/17(月) 03:32:51ID:qWlXMT4E
なんだ釣りか
■ このスレッドは過去ログ倉庫に格納されています