「現在の時刻」を取得するということで
GetNowCount() & INT_MAX;
と記載されているソースをよく見かけますが
現在時刻はGetNowCount()で事足りるわけでは無いのでしょうか?
& INT_MAXってなんの意味があるのでしょう。
皆さん、defineで設定しているわけでは無いんで、
これもDXライブラリで設定されているということでしょうか。
教えてください。
「現在の時刻」を取得
Re: 「現在の時刻」を取得
調べた結果、INT_MAXは
その名のごとく、intの最大値を表してる、ということでした。
DXライブラリでもなんでも無かった様です。
知りませんでした。
でも、付属させてる意味はわからずにいます。
例えば、
Time = GetNowCount() & INT_MAX;
と
Time = GetNowCount() ;
で、なにが違うのでしょうか。
ちなみに、自分はC++でプログラムしてますが
「&」を使ったことありません。
& INT_MAXを付けることによって、どういう意味合いの処理になるのか
教えて下さい。
その名のごとく、intの最大値を表してる、ということでした。
DXライブラリでもなんでも無かった様です。
知りませんでした。
でも、付属させてる意味はわからずにいます。
例えば、
Time = GetNowCount() & INT_MAX;
と
Time = GetNowCount() ;
で、なにが違うのでしょうか。
ちなみに、自分はC++でプログラムしてますが
「&」を使ったことありません。
& INT_MAXを付けることによって、どういう意味合いの処理になるのか
教えて下さい。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 「現在の時刻」を取得
&は基本の演算子に出てくるので、覚えておいたほうが良い演算子です。
ビット演算でAND演算を行います。
GetNowCount() & INT_MAX;
だと上位の桁の切り捨てが出来ますが、私も意図は分かりません。
もともと戻り値がintですからね。
この書き方の初出を調べてみないとなんとも言えないかなと思います。
ビット演算でAND演算を行います。
GetNowCount() & INT_MAX;
だと上位の桁の切り捨てが出来ますが、私も意図は分かりません。
もともと戻り値がintですからね。
この書き方の初出を調べてみないとなんとも言えないかなと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 「現在の時刻」を取得
中置記法の&はビット積演算子です。オーバーロードされていなければ、ビット単位での積を取った値が返ります。
例えば、10進法での1と、10進法での2のビット積を取ると、10進法で0になります。
1は2進法で01
2は2進法で10
ビット単位で積を取ると、
右から順に、
1x0=0
0x1=0
よって結果は、00になります。
2進法での00は、10進法に直すと0です。
私はDXライブラリに詳しくないので、GetNowCountの結果とINT_MAXのビット積を取る目的はわかりません。
GetNowCountの結果がマイナスである可能性があるのかもしれません。
もし結果がプラスであれば、INT_MAXとのビット積の値は全く変わらずそのままのはずです。
マイナスだった場合、INT_MAXとのビット積を取ると、結果が変わってきます。
ただ、これで得られる結果がなんの役に立つのか知りません。
例えば(-1 & INT_MAX)とすると、INT_MAXの数が返ります。
(-2 & INT_MAX)とすると、INT_MAX-1の数が返ります。
何かの本に書いてあったものをみんなが意味もわからず真似しているだけ、のような気がします。
例えば、10進法での1と、10進法での2のビット積を取ると、10進法で0になります。
1は2進法で01
2は2進法で10
ビット単位で積を取ると、
右から順に、
1x0=0
0x1=0
よって結果は、00になります。
2進法での00は、10進法に直すと0です。
私はDXライブラリに詳しくないので、GetNowCountの結果とINT_MAXのビット積を取る目的はわかりません。
GetNowCountの結果がマイナスである可能性があるのかもしれません。
もし結果がプラスであれば、INT_MAXとのビット積の値は全く変わらずそのままのはずです。
マイナスだった場合、INT_MAXとのビット積を取ると、結果が変わってきます。
ただ、これで得られる結果がなんの役に立つのか知りません。
例えば(-1 & INT_MAX)とすると、INT_MAXの数が返ります。
(-2 & INT_MAX)とすると、INT_MAX-1の数が返ります。
何かの本に書いてあったものをみんなが意味もわからず真似しているだけ、のような気がします。
✜ で C ご ✜
: す + 注 :
¦ か + 文 ¦
: ? Is the は :
✜ order C++? ✜
: す + 注 :
¦ か + 文 ¦
: ? Is the は :
✜ order C++? ✜
糸冬
――――――――
制作・著作 NHK
――――――――
制作・著作 NHK
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 「現在の時刻」を取得
DXライブラリのアップデートの記録にGetNowCountの戻り値がマイナスになるバグを直したとありますね。
と言うことは、内部でGetNowCount() & INT_MAXしていると思いますので、こちらで対応する必要はないと思います。
なお、INT_MAXを超えるのはWindows起動から起動したままで24日後です。
と言うことは、内部でGetNowCount() & INT_MAXしていると思いますので、こちらで対応する必要はないと思います。
なお、INT_MAXを超えるのはWindows起動から起動したままで24日後です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 「現在の時刻」を取得
皆様、大変理解出来ました、
ありがとうございます。
ただ、GetNowCount()について、新たな疑問が。。
DXライブラリで作ったゲームを実行すると、
窓が出てそこにゲームが描画されているわけですが(以後、ゲーム窓)、
その時にマウスなりでディスクトップやブラウザなどを選択しますと
ゲーム窓のゲームは停止状態になるじゃないですか?
でも、GetNowCount()の中の時間は動いてますよね?
例えば、ゲーム中の時間制限を表すカウントを
GetNowCount()で1秒を測りながら処理していると、
ゲーム窓以外を選択していて、ゲーム窓に選択を戻したら
時間がワープするんですよ。カウントが。
えっと、伝わるでしょうか、これ。。。
ユーザーが、ゲーム窓以外を選択して、ゲーム窓が停止?している状態のときに
GetNowCount()の経過時間も止める方法は無いのでしょうか?
それとも、そもそもカウントを数えるのに、リアル時間のGetNowCount()を利用することが間違いで、
制限時間のカウントなどは、フレーム数で動かした方がいいのでしょうか?
教えて下さい。
ありがとうございます。
ただ、GetNowCount()について、新たな疑問が。。
DXライブラリで作ったゲームを実行すると、
窓が出てそこにゲームが描画されているわけですが(以後、ゲーム窓)、
その時にマウスなりでディスクトップやブラウザなどを選択しますと
ゲーム窓のゲームは停止状態になるじゃないですか?
でも、GetNowCount()の中の時間は動いてますよね?
例えば、ゲーム中の時間制限を表すカウントを
GetNowCount()で1秒を測りながら処理していると、
ゲーム窓以外を選択していて、ゲーム窓に選択を戻したら
時間がワープするんですよ。カウントが。
えっと、伝わるでしょうか、これ。。。
ユーザーが、ゲーム窓以外を選択して、ゲーム窓が停止?している状態のときに
GetNowCount()の経過時間も止める方法は無いのでしょうか?
それとも、そもそもカウントを数えるのに、リアル時間のGetNowCount()を利用することが間違いで、
制限時間のカウントなどは、フレーム数で動かした方がいいのでしょうか?
教えて下さい。
Re: 「現在の時刻」を取得
ありませんカイジ さんが書きました:ユーザーが、ゲーム窓以外を選択して、ゲーム窓が停止?している状態のときに
GetNowCount()の経過時間も止める方法は無いのでしょうか?
GetNowCount関数はあくまで、パソコンが起動してからの時間を返す関数ですから。
ユーザーの動作うんぬんは関係がありません。
written by へにっくす
Re: 「現在の時刻」を取得
その
>時間制限
というのが, リアル時間の話なのか,ゲーム内時間(?)の話なのか を先に決めるべきではないでしょうか.
リアル時間なのであれば,現状の動作が正解なのだろうし,
ゲーム内時間なのであれば処理回数カウンタ的なのでやれば良いように思います.
>時間制限
というのが, リアル時間の話なのか,ゲーム内時間(?)の話なのか を先に決めるべきではないでしょうか.
リアル時間なのであれば,現状の動作が正解なのだろうし,
ゲーム内時間なのであれば処理回数カウンタ的なのでやれば良いように思います.
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 「現在の時刻」を取得
そういう事態の場合ProcessMessage()から戻ってこないと思いますので、ProcessMessage()突入前後の時間を求めておけば補正できると思います。厳密に言えば誤差がありますが相当な精度が必要ない限り害はないはずです。
【補足】間違っているかもしれないので、必ず動作確認を。
【補足】間違っているかもしれないので、必ず動作確認を。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 「現在の時刻」を取得
目的によると思いますが、私ならゲームロジック内のタイミング制御などにGetNowCountは使いません。カイジ さんが書きました: それとも、そもそもカウントを数えるのに、リアル時間のGetNowCount()を利用することが間違いで、
制限時間のカウントなどは、フレーム数で動かした方がいいのでしょうか?
カウンタークラスのようなものを自作して、そいつにまかせるようにしています。
主題とは違いますが、DXライブラリにはウィンドウが非アクティブな状態でも処理をつづけるための関数があります。カイジ さんが書きました: その時にマウスなりでディスクトップやブラウザなどを選択しますと
ゲーム窓のゲームは停止状態になるじゃないですか?
SetAlwaysRunFlag
http://homepage2.nifty.com/natupaji/DxL ... tml#R15N22
(ただし、この関数を使ってもウィンドウ枠をドラッグしている間は処理は止まります)