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

DXライブラリ 総合スレッド その3

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

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

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

過去スレ:DXライブラリ 総合スレッド
      http://pc11.2ch.net/test/read.cgi/gamedev/1197468399/
     DXライブラリ 総合スレッド 2008
      http://pc11.2ch.net/test/read.cgi/gamedev/1224923873/
0454名前は開発中のものです。2009/06/13(土) 13:01:19ID:khmiiTOM
>>453
C++は多値返せないよ

戻り値のとり得る値が増減する、とエスパーすると、

関数の戻り値っていうのは、関数本来の意味を参照すると、
関数の作用そのもの、すなわち関数が実装する機能そのもの。
(わからないならSchemeやHaskellとか関数型プログラミング言語を一度触ってくれ)

これが変更されるということは、すなわち関数の機能が変わったか、設計の錬度が全く足りてない
(どんな機能を実装するかすらあやふやだった)かどちらか。
どちらにせよその変更は、その関数を使用するコード全体に波及する。

だから
>あとでhoge()の返値を増やしたら予期せぬ動作をする可能性が高い
この指摘はずれてる。
繰り返しになるけど、戻り値の変更はそれを使用するコード全体に波及するから、
予期せぬ動作をする可能性が高い、じゃなくて、予期せぬ動作をしないようにコード
を変更しないといけない。
0455名前は開発中のものです。2009/06/13(土) 15:58:30ID:MRDz7JnU
>>453
実装の修正は何度もやるとして
インターフェースや振る舞いはなかなか変えないもんだ

というか、戻り値の意味が2通りを超える時は
関数名も変えざるを得ない気がするが
0456名前は開発中のものです。2009/06/15(月) 23:58:33ID:FuxW1Dfe
Windows 7 のペイントでpng保存しても
透明色指定しても透明にならない
bmp2pngが必要
0457名前は開発中のものです。2009/06/16(火) 01:46:16ID:H4jkoMGr
文字列を画面の中央に表示したいけど
何かいい方法あるかな?
x座標を調整するの面倒だ
0458名前は開発中のものです。2009/06/16(火) 02:10:16ID:1CAlzcIC
>457
自分は使ったことないんで分からないけど、

 GetDrawStringWidth
 GetDrawFormatStringWidth

というのはどう?
で、長さを調べてxを調整して、文字列を出力するところまでを1つの関数にしちゃうの。
0459名前は開発中のものです。2009/06/16(火) 02:19:38ID:qN6akUYZ
ドラクエみたいに停止してるキャラに足踏みさせるいい方法ないかな?
countを0と1でオンオフしてSleep(300)とかで歩行と同じように調整はできたんだけど、
歩き出しが時々ぎこちないので悩んでます。sleepじゃなくていい方法が思いつかない
0460名前は開発中のものです。2009/06/16(火) 02:28:14ID:H4jkoMGr
>>458
フォントを変えないならいける
CreateFontToHandleで作ったフォントデータだと駄目っぽい

>>459
countを範囲でオンオフ切り替えてみては
if(count%40<20)//ドロー
else //ドロー2
count++;
0461名前は開発中のものです。2009/06/16(火) 02:34:01ID:wxVXqeT5
>>460
GetDrawStringWidthToHandleがあるじゃん
0462名前は開発中のものです。2009/06/16(火) 02:36:09ID:H4jkoMGr
>>461
うわ・・・恥ずかしい・・ごめんなさい
ありがとねん
0463名前は開発中のものです。2009/06/16(火) 03:45:39ID:1CAlzcIC
>459
そもそもSleep使ったら何も出来なくなるんじゃ?
0464名前は開発中のものです。2009/06/16(火) 08:51:37ID:mvp6g5dM
歩行絵+右足踏み出し絵と左踏み出し絵を描けばいいだけじゃね?
0465名前は開発中のものです。2009/06/16(火) 09:09:09ID:q6YxOHAd
while(ProcessMessage()!=-1){
ClearDrawScreen();

if(count<20) 右足が前に出てるキャラ表示
if(count>=20&&count<40)左足が前に出てるキャラ表示
ScreenFlip();
WaitTimer(10);
count++;
if(count==40)count=0;

}

うーんよくわからん
0466名前は開発中のものです。2009/06/16(火) 09:54:16ID:1CAlzcIC
>465
基本的な考え方はそれでいいと思うよ。
あとせっかく答えてくれた>460の答えも読んどいた方がいいんじゃね?
0467名前は開発中のものです。2009/06/16(火) 10:06:16ID:yTy6SiIo
>>465
基準FPS値決めて、フレーム数と秒が変換できるようにしてみるといい
あとWaitTimer(10)とかいうのはジョークだよね?w
04684662009/06/16(火) 10:16:47ID:1CAlzcIC
とりあえず>466の日本語がおかしいってのはスルーしてくれると嬉しい。

>>467
おや、見逃してたw
もしかして>463(俺)の発言を勘違いしちゃったのかな……? だとしたらちょっと責任感が。
0469名前は開発中のものです。2009/06/16(火) 12:57:31ID:zt3Tshey
>>467
たぶんWaitTimer等の関数を使わないと高速足踏みに見えると感じて、
こういう手段で自然に見えるようにしたんじゃないかな。
一秒でひとつの動作をループさせる必要はないからこれはあまり良くないと思うけど。
0470名前は開発中のものです。2009/06/16(火) 13:19:46ID:1CAlzcIC
>469
count値20ごとに表示を変えてるみたいだし、それは大丈夫なんじゃないかしら?
0471名前は開発中のものです。2009/06/16(火) 14:04:12ID:KbLsp5Ay
ScreenFlipで垂直同期信号待ちが行われているかどうかで変わってくるような。
0472名前は開発中のものです。2009/06/16(火) 14:17:30ID:MjcTUWQv
WaitTimer使う位なら count<20 の値を増やした方がよくね
0473名前は開発中のものです。2009/06/16(火) 16:03:45ID:rewLOGjy
時分割で状態変移したいのなら、コルーチン使ってみては?
と上級者ぶってみるわ
04744592009/06/16(火) 18:26:00ID:qN6akUYZ
いろいろ意見ありがとう。
WaitやSleepは使わずにFPSとかFrameやらを使って試行錯誤してみます。
countを0と1でオンオフにしてたけど>>465のようにフレームカウントにしてやってみます。
0475名前は開発中のものです。2009/06/16(火) 18:35:39ID:1CAlzcIC
別人だったんか!
0476名前は開発中のものです。2009/06/16(火) 23:35:34ID:8GILQKQT
リフレッシュレートの概念がわからないと変なの書いちゃうぞ
レートは60ヘルツかも100ヘルツかもしれないし
65とか75とか微妙な数値になることもある
DXライブラリの教本にあるように書かないと、動作環境が変わった時に同じように動く保証がない

俺が以前に見た酷い例
FPSが60切ると点数がどんどん減る意味不明なゲーム
しかもどんなアルゴリズムか知らんが、FPS60でも点数が減りっぱなし
ああいう「自分の環境しか見ない」人間は駄目だな
0477名前は開発中のものです。2009/06/16(火) 23:40:46ID:fYBFrBfu
ゲーム機のゲームってその辺固定だからなにも考えなくていいんだよなー。
0478名前は開発中のものです。2009/06/16(火) 23:56:34ID:1CAlzcIC
>>476
と言っても、個人レベルの開発でどこまで他の環境を考えられるやら。

定番のアルゴリズムとかは書けるかもしれないけど、それだけじゃ意味ないし。
結局のところ「知らね」って言いきるしかできない。
0479名前は開発中のものです。2009/06/16(火) 23:59:57ID:+nd9Tj3k
俺今作ってるゲームはリフレッシュレート無視しちゃってる。
ティアリングが気になるんだよなぁ。

他人が作ったゲームは60FPS超えるやつとかあるけど
ティアリングあまり気にならないんだよな。どうやってんだろ。
0480名前は開発中のものです。2009/06/17(水) 00:27:22ID:gsrBiXQc
>>469
WaitTimer(10); 入れるとCPU使用率が下がる ただそれだけw
0481名前は開発中のものです。2009/06/17(水) 00:32:32ID:s0zhQi6M
>>479
君みたいな人が駄目らしいよ
自分の環境しか見ない人間は駄目なんだってさ

ていうかさ、FPSが60切ると点数がどんどん下がるゲームかどうか
ソースもアルゴリズムも考えずにどうやって判別したのかねwプッw
偉いなぁこの人wプレイしただけでバグの原因分かっちゃうって>>476は神だねwプッw
0482名前は開発中のものです。2009/06/17(水) 03:56:59ID:moXGEW/H
環境を合わせる方法としては
1,Sleepを使ってFPSを30ほどに落としてやる。
2,時間と同期をとる。
くらいしか思いつかない。
0483名前は開発中のものです。2009/06/17(水) 07:52:50ID:zFwmddUq
関係ないけど、テクスチャに描画する場合ってZバッファ効かないんだね
0484名前は開発中のものです。2009/06/17(水) 08:55:08ID:Sg+3JQO3
リフレッシュレートをAPIを使ってある固定値に設定する
0485名前は開発中のものです。2009/06/17(水) 15:01:39ID:v4ECr6VG
セガの新人教育の本の人いわく、
作りやすいのは固定フレーム、性能を活かしやすいのは可変フレーム。


自分は面倒なので、60固定前提でやってるんだが
 (1)タイマ(ミリ秒)を取得して1フレームの規定時間(16msec)が過ぎるまで待つ
 (2)モニタのVSYNCを待つ
 (3)モニタのリフレッシュレートを変更する
の3パターン用意して、あとはユーザに適当に選んでもらおうかなと。

まずいかな?
0486名前は開発中のものです。2009/06/17(水) 18:17:49ID:V4BAg+VP
ScreenFlip使えばFPS保たれるんじゃないの
0487名前は開発中のものです。2009/06/17(水) 18:47:03ID:A2Hqv0+b
>ScreenFlip使えばFPS保たれるんじゃないの

・環境(グラボの設定)によっては垂直同期信号待ちがOFFになってる場合があるのでFPSは保たれない。

・垂直同期信号待ちがONだとして、FPS保てる状態でも、
 モニタのリフレッシュレートを60にしてたり70にしてたりってのはユーザーの好き好きなので、
 作り手の望んだとおりのFPSになってくれるとは限らない。
0488名前は開発中のものです。2009/06/17(水) 20:28:42ID:00woQzQy
めんどくさいからゲーム機のゲーム作ろうぜ
0489名前は開発中のものです。2009/06/17(水) 20:53:25ID:00woQzQy
http://www.gbadev.org/
http://www.pqrs.org/tekezo/gba/index.html.ja
http://omoshiro-joho.com/tech-center/cgi-bin/wiki/index.php?Linux%A4%C7GBA%A5%B2%A1%BC%A5%E0%B3%AB%C8%AF
http://nocash.emubase.de/gbatek.htm
http://belogic.com/gba/directsound.shtml
0490名前は開発中のものです。2009/06/18(木) 01:52:47ID:lg5GVuaj
>>481は得点表示も見れないようです
0491名前は開発中のものです。2009/06/18(木) 04:16:26ID:eqFlz8O1
勝手にリフレッシュレート60に切り替える命令とかあればいいのに
0492名前は開発中のものです。2009/06/18(木) 04:54:12ID:U/ILN7Qk
>>491
一応あるっしょ。
0493名前は開発中のものです。2009/06/18(木) 05:03:47ID:4gTcdCic
別に少々速度違ってもいいじゃない
0494名前は開発中のものです。2009/06/18(木) 05:07:59ID:U/ILN7Qk
>493
アクションゲームのゲーム速度2割アップとか結構きついですぜ
0495名前は開発中のものです。2009/06/18(木) 07:25:22ID:8Inai5Jq
DXライブラリ3Dってどうなったの?
開発中止?
0496名前は開発中のものです。2009/06/18(木) 09:48:52ID:obCaTvEe
60FPSのゲームを70FPSとか、とんでもないぜw
0497名前は開発中のものです。2009/06/18(木) 16:23:14ID:FAWLSPyh
たまに弾幕シューティングが75FPSになったりするけど、
気づくのはいつもしばらくプレイしてからだった
0498名前は開発中のものです。2009/06/18(木) 16:53:46ID:U/ILN7Qk
>497
気付かぬうちに難易度が上がってたり、タイミングが変わってミスを誘発させたりするって
ちょっと怖いよな。
0499名前は開発中のものです。2009/06/18(木) 17:10:57ID:4gTcdCic
一般的に表示上のFPSが上がるとゲーム速度も上がるものなの?

ってことは2次元アクションでいえば1フレーム毎の移動量が固定なのか。
自分自身も楽だからそういう作り方をしているけど…

例えばあるゲームで
60FPSだと重いのでコンフィグで30FPSに変更って場合は
ゲーム速度そのものは変わらないものだと思っていた。
0500名前は開発中のものです。2009/06/18(木) 17:35:08ID:u8KJWVMz
>>499
時間で処理、描画だけFPSで更新なら変わらないよ。
全体をFPS60処理だと60より上に上がらないようにしてるのが一般的かなぁ。
ツールで簡単に上げれたり、処理間に合わないとFPS下がって全体の速度も低下する。
0501名前は開発中のものです。2009/06/18(木) 17:56:28ID:U/ILN7Qk
>499
フレームではなく時間単位で処理してるなら
ゲーム速度云々の話題にすらならんと思うよ。
0502名前は開発中のものです。2009/06/18(木) 21:48:15ID:3XyNBKLr
しかし時間単位で処理すると確実にティアリングが発生するので画質面で劣るという
0503名前は開発中のものです。2009/06/18(木) 21:57:55ID:y4gPpvjp
そんなの関係なくバッドノウハウ使わない限り起きるだろw
0504名前は開発中のものです。2009/06/18(木) 22:12:42ID:4gTcdCic
発想を逆転させるんだ
ユーザーをゲームに合わしちまえばいいんだ
0505名前は開発中のものです。2009/06/18(木) 23:01:35ID:7QIAxIr+
まともにゲーム作ったことある人手あげて〜?
0506名前は開発中のものです。2009/06/18(木) 23:19:36ID:cOrVzTjy
>>502

違うんじゃない?
モニタのリフレッシュレートが60だろうが70だろうが時間単位で処理するからこそ
スピード一定でティアリングも発生しないようにできるんでしょ。

垂直同期信号が切ってあるなら、そもそもティアリングは発生してあたりまえだろうし。
0507名前は開発中のものです。2009/06/18(木) 23:47:20ID:3XyNBKLr
モニタの画面更新のタイミングを無視してメモリ上の画面データを書き換えると言うことだから
1画面分のデータの構築途中でそのメモリイメージが画面に表示されて画面上部と下部でフレームがずれるということだから
ティアリングが発生するということじゃないの
0508名前は開発中のものです。2009/06/18(木) 23:58:10ID:cOrVzTjy
「モニタの画面更新のタイミングを無視する」なら、時間単位で処理する意味ないでしょ?

なぜ時間単位で処理する必要があるかって言ったら、
垂直同期信号待ちをして、ティアリングを起こさないようにしたいけど、
ユーザーのモニタのリフレシュレートが60なのか70なのかが判らない、からでしょ?
0509名前は開発中のものです。2009/06/19(金) 00:03:49ID:Wkij18nv
間違えた。逆だった。
実際の画面の更新途中でメモリ上の画面データが更新された場合に、描画済み画素と未描画画素でフレームがずれるためティアリングが発生する、だった。
要するにAPIでリフレッシュレートを60に設定して60前提で作ればよい。60に対応してないモニタを使ってるやつのことは知らない。
0510名前は開発中のものです。2009/06/19(金) 00:08:11ID:AlkmRsbh
なんか「時間単位で処理」と「フレーム単位で処理」の認識が逆になってる気がするw
0511名前は開発中のものです。2009/06/19(金) 00:12:38ID:s7w0uGNM
>509
FPS指定APIは過信してはいけない
上のほうにあるようにドライバ側の設定が優先される
0512名前は開発中のものです。2009/06/19(金) 00:22:34ID:Wkij18nv
じゃあPC環境は糞
0513名前は開発中のものです。2009/06/19(金) 00:47:10ID:pN8o6lEn
>509
「60以外は知らん」と言いきっちゃうのも、それはそれでアリな気がする
0514名前は開発中のものです。2009/06/19(金) 02:05:59ID:7uKPrG8o
最近は液晶が殆どだしそれもありだな
0515名前は開発中のものです。2009/06/19(金) 03:38:42ID:AlkmRsbh
液晶がどう関係するのか。
0516名前は開発中のものです。2009/06/19(金) 08:04:02ID:huFKHnzQ
一般的な普及価格帯のやつは選択肢が60Hzや59Hzしかない
0517名前は開発中のものです。2009/06/19(金) 09:00:27ID:Dq7L9OoN
>>516
20世紀へお帰り下さい
0518名前は開発中のものです。2009/06/19(金) 09:40:02ID:4AnMu6gm
自己中心的なハード理論を押し付けるもんじゃない
動作環境をテキストに書いたら、それを満たすあらゆる環境で同じように動いてもらわないと困る
デフォルトで不具合が出る可能性があるなら、設定で変えられるようにしなきゃ駄目
なるべくたくさんの環境でテストするのも大事
0519名前は開発中のものです。2009/06/19(金) 12:28:29ID:8D0wDPEb
難しいことしなくても、垂直同期かウェイトかはオプションで選べようにすれば問題ないだろ
0520名前は開発中のものです。2009/06/19(金) 12:57:07ID:ciGq9GNb
全くその通りだと思うんだが、
そういう選択式になってるゲームってほとんどみないよな?

普通はどうやってんだろ、ってのが話題の焦点じゃないかな。
0521名前は開発中のものです。2009/06/19(金) 15:25:14ID:pN8o6lEn
>>517
実際、60Hz固定のモニタも多いんじゃね?
0522名前は開発中のものです。2009/06/19(金) 16:07:46ID:L4Ogxl+D
他に話題ねーのかよ
飽きた
0523名前は開発中のものです。2009/06/19(金) 16:47:37ID:8D0wDPEb
何か話したい話題があるなら自分から振れと
0524名前は開発中のものです。2009/06/19(金) 23:33:13ID:Dq7L9OoN
>>521
だから帰れってww
0525名前は開発中のものです。2009/06/19(金) 23:50:46ID:L4Ogxl+D
んー
じゃぁDxLibの今後

俺はもう少し発展してくれてもいいと思う、3Dを強化して欲しいね
0526名前は開発中のものです。2009/06/20(土) 00:41:17ID:ynTX3CaL
無理じゃね
3D強化するなら作り直しレベルだろ
0527名前は開発中のものです。2009/06/20(土) 00:42:51ID:FZJG9pXN
デスクリムゾンレベルなら作れるw
0528名前は開発中のものです。2009/06/20(土) 00:53:36ID:gQS8hglY
上からくるぞっ!気をつけろ!
0529名前は開発中のものです。2009/06/20(土) 01:03:05ID:X3CDDO5o
>>526
いま3D機能作ってるって公式掲示板で言ってたけど・・・
意外とみんなチェックしてないんだな
0530名前は開発中のものです。2009/06/20(土) 01:08:17ID:ppcvkMn4
>>529
なん…だと?
0531名前は開発中のものです。2009/06/20(土) 01:49:27ID:FZJG9pXN
俺のクリムゾンは下からくる設定で作るわ
0532名前は開発中のものです。2009/06/20(土) 02:34:40ID:gQS8hglY
せっかくだから俺はこの赤い扉を選ぶぜ!!
0533名前は開発中のものです。2009/06/21(日) 02:15:20ID:dtFx8GuN
Platinumっていうマップエディタで、15*20マスのマップを作って
csv形式で出力して、読み込んで描画したいんだけど上手くいきません

#include "DxLib.h"

int WINAPI...
{
if( DxLib_Init() == -1 ) return -1 ;

int mapchip[256];
char mapdata[15][20];
int filehandle;

LoadDivGraph("a.bmp",256,16,16,16,16,mapchip);
f = FileRead_open("a.csv");
FileRead_gets(mapdata,num,filehandle);

このあとfor文でFileRead_getsで読み込んだ1行を15回くりかえして
mapchipに入れていきたいんだけど・・・
FileRead_getsのnumに何を入れていいのかが??状態。
リファレンス読んでもメモリ領域のサイズて書いてあるけど・・・

日本語おかしくてスマン
0534名前は開発中のものです。2009/06/21(日) 02:35:09ID:ffHKmVPn
numはメモリ領域のサイズってリファレンスに書いてあるじゃん。

てか、a.csvの内容はどんな感じになってんの?
0535名前は開発中のものです。2009/06/21(日) 02:48:44ID:aQAsxkjf
>>533
int mapdata[15][20],mapwidth= 0, mapheight= 0, mapchipwidth, mapchipheight, bitcount;
int filehandle;
char buf[1024];
filehandle = FileRead_open("a.csv");
if (filehandle==0){エラー処理}
int gyoucount = 0,retucount = 0, iVal,layercount;
while((FileRead_eof(filehandle) == 0)&&( gyoucount < mapheight+1 ))
{
FileRead_gets(buf, 1023, filehandle);
if (gyoucount == 0){
sscanf_s(buf, "%d,%d,%d,%d,%d,%d", &mapwidth, &mapheight, &mapchipwidth, &mapchipheight, &layercount, &bitcount);
}else{
while(retucount<mapwidth){
char *next_token;
if (retucount==0){
iVal=atoi(strtok_s(buf, ",",&next_token));
}else{
iVal=atoi(strtok_s(NULL, ",",&next_token));
}
mapdata[gyoucount-1][retucount] = iVal;
retucount++;
}}
gyoucount++;
retucount = 0;
}
FileRead_close(filehandle);
if( ( gyoucount != mapheight+1 ) || ( retucount != 0 ) ){エラー処理}
0536名前は開発中のものです。2009/06/21(日) 02:49:49ID:dtFx8GuN
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1
1 1 1 1 1 0 0 0 0 0 0 0 1 1 3 3 0 0 0 0
1 1 1 1 1 1 0 0 0 0 0 0 0 0 3 3 0 0 0 0
1 1 1 1 1 1 1 0 0 0 0 0 3 3 3 0 0 0 0 0
1 1 1 1 1 1 1 0 0 0 3 3 3 3 3 3 0 0 0 0
0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 0 2 2 0 0
0 0 2 2 2 2 2 2 0 0 0 0 3 3 0 2 2 0 0 0
0 0 0 0 0 2 2 2 0 0 0 0 2 2 2 2 0 0 0 0
0 0 0 0 0 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0が草原で1が川で2が森で3が山です
1行ずつ読み込んでchar chip[ ][ ]に入れて
その番号をint型の数字に変換してmapchip[ ]で描画させたいんですが・・orz

ごめん、メモリ領域のサイズってどうやって調べるの?
0537名前は開発中のものです。2009/06/21(日) 04:17:54ID:jkwbtsZu
コーディングしたのはおまいさんだろ?
0538名前は開発中のものです。2009/06/21(日) 08:29:25ID:vb/GsENJ
FileRead_gets(mapdata,sizeof(mapdata),filehandle);
0539名前は開発中のものです。2009/06/21(日) 09:37:49ID:SurdRKYg
>>507
遅れたけど正確にはダブルバッファリングしてるからティアリングはおきないよ。
データの構築中に画面に表示される事は無い。
あと垂直同期を待ちつつタイマーで調整する事も可能。
具体的にはタイマーでfpsを調整すれば、ゲームが基準にするのはタイマーじゃなく、
一定間隔が保障されてるフレームを基準にすればおk
0540名前は開発中のものです。2009/06/21(日) 13:35:35ID:QJhUeuVR
マップの縦横が固定長なら
ifstream+For2重ループで読み込んでしまえば良い
都合のいいことに半角スペース無視ってくれるからね

c++知らなければスルーしてよし
0541名前は開発中のものです。2009/06/21(日) 13:59:11ID:E25maqZD
垂直同期を待つってことは動作速度がリフレッシュレート固定になるってことじゃないの?
最期の2行の意味をくわしく。
0542名前は開発中のものです。2009/06/21(日) 14:24:01ID:ZO5ct3aw
可変レートの場合、
60の時は、前回の1/60秒後の世界を描くし50の時は1/50秒後の世界を描くんだろう。
0543名前は開発中のものです。2009/06/21(日) 14:40:01ID:/SjwP+Lm
ググってると公式サイトのリファレンスに載ってない関数が時々出てくるんですけど、
そういうのが載ってる詳細なリファレンスは無いんですか?
0544名前は開発中のものです。2009/06/21(日) 15:01:10ID:E25maqZD
擬似コードでいいからプログラムで説明してくんない?
下記に追記する形で。

while(1){
  main_loop();
  flip();
}
0545名前は開発中のものです。2009/06/21(日) 15:55:05ID:gvSWV/Tl
1秒間に100ドット移動させたい時。

  :
ScreelFlip()
時間計測A(ミリ秒)
  :
ScreenFlip()
時間計測B(ミリ秒)
  :
移動距離算出 100 * ( B-A ) / 1000
  :
ScreenFlip()
時間計測〜

って感じ?
0546名前は開発中のものです。2009/06/21(日) 17:22:04ID:nC5CYBlY
ぼくのイメージではこんなだけど合ってる?

垂直同期が取れるなら

while(1){
  main_loop();
    sleep until 垂直同期60hz;
  flip();
}

取れないなら

A = GetTickCount();
while(1){
  main_loop();
  B = GetTickCount();
  sleep(17 - ((B - A) % 17)); //1tick = 0.001秒, 17tick = 1/60秒と仮定
  flip();
  A = B;
}

ただ、こうするとsleepしてる時間が無駄だから…
0547名前は開発中のものです。2009/06/21(日) 17:24:40ID:nC5CYBlY
無駄を減らすために

main_loop()の処理時間が十分に短いなら

A = GetTickCount();
while(1){
  do {
    main_loop();
    B = GetTickCount();
  } while (B-A < 17);
  flip();
  A = B;
}

あるいはタイマーを使うか…

A = GetTickCount();
while(1){
  main_loop();
  B = GetTickCount();
  SetTimer(17 - ((B - A) % 17), flip());
  A = B;
}

それとも描画と計算は別スレッドにするか…
0548名前は開発中のものです。2009/06/21(日) 20:10:23ID:SurdRKYg
>>541
そうとは限らないよ。
まずfps制限と描画を完全にわけて考える。
fps制限は60に設定したとする。
int nowtime = GetNowCount();
static int oldtime = 0;
static int frametime = 1000 / 60;

int diftime = nowtime - oldtime;

while(1)
{
if(diftime >= frametime)
{
oldtime = nowtime;
break;
}
else
{
Sleep(1);
nowtime = GetNowCount();
diftime = nowtime - oldtime;
}
}
これで垂直同期しようがしまいが60で固定された。
1ループで1フレーム1/60秒が保障されたので、1秒で100ドットキャラを進ませたいのなら、60フレームで100ドット進ませればおk
5秒後に何かをしたいときも、5秒をタイマーで計測するんじゃなくて300フレーム後に行えばおk
だから>>539で「ゲームが基準にするのはタイマーじゃなく、一定間隔が保障されてるフレームを基準にすればおk」と書いた。
ただ、これだとスペック不足によって60fpsが出ない場合や、リフレッシュレートが60以外でかつ垂直同期を待った場合中途半端な同期によって60fpsが出ない場合(これは垂直同期を待たない事で解決出来る)、
フレームがゲームスピードの基準になっているのでゲームスピードが遅くなってしまう。(処理落ち)
これはこれでおkならそのままでいいが、ゲームスピードだけは死守するのならフレームスキップ(コマ落ち)が必要になる。
この方法も色々あるので今回は割愛。
0549名前は開発中のものです。2009/06/21(日) 20:20:31ID:E25maqZD
結局ティアリング発生するじゃん
0550名前は開発中のものです。2009/06/21(日) 20:27:19ID:SurdRKYg
せっかく説明したのになにその全然読んでないようなレスは。
ティアリングの話がしたいの?
>垂直同期を待つってことは動作速度がリフレッシュレート固定になるってことじゃないの?
これを解決したいの?
どっちなの?
てか548を読んで解決出来なかったの?
質問しといてなんなの。
0551名前は開発中のものです。2009/06/21(日) 20:38:53ID:E25maqZD
ティアリングを発生させずにどんなリフレッシュレートのモニタでも同じ処理速度で動作させる方法があるかを聞いてる。
0552名前は開発中のものです。2009/06/21(日) 20:52:15ID:dtFx8GuN
14歳からのゲームプログラミング読めよ
書いてあるよ
0553名前は開発中のものです。2009/06/21(日) 20:52:45ID:n8mlBebR
>>551

>>539に書いてあんじゃん
SurdRKYgがかわいそすぎる、援護するぜ

んでぐぐったらすぐにわかりやすいのでてきたぞ
ちょっとは自分で調べろ
ttp://spitfire.client.jp/program/fps.html
■ このスレッドは過去ログ倉庫に格納されています