「現在の時刻」を取得

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
カイジ

「現在の時刻」を取得

#1

投稿記事 by カイジ » 9年前

「現在の時刻」を取得するということで
GetNowCount() & INT_MAX;
と記載されているソースをよく見かけますが
現在時刻はGetNowCount()で事足りるわけでは無いのでしょうか?
& INT_MAXってなんの意味があるのでしょう。
皆さん、defineで設定しているわけでは無いんで、
これもDXライブラリで設定されているということでしょうか。

教えてください。

カイジ

Re: 「現在の時刻」を取得

#2

投稿記事 by カイジ » 9年前

調べた結果、INT_MAXは
その名のごとく、intの最大値を表してる、ということでした。
DXライブラリでもなんでも無かった様です。
知りませんでした。

でも、付属させてる意味はわからずにいます。
例えば、
Time = GetNowCount() & INT_MAX;

Time = GetNowCount() ;
で、なにが違うのでしょうか。

ちなみに、自分はC++でプログラムしてますが
「&」を使ったことありません。
& INT_MAXを付けることによって、どういう意味合いの処理になるのか
教えて下さい。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 「現在の時刻」を取得

#3

投稿記事 by softya(ソフト屋) » 9年前

&は基本の演算子に出てくるので、覚えておいたほうが良い演算子です。
ビット演算でAND演算を行います。
GetNowCount() & INT_MAX;
だと上位の桁の切り捨てが出来ますが、私も意図は分かりません。
もともと戻り値がintですからね。
この書き方の初出を調べてみないとなんとも言えないかなと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
nullptr
記事: 239
登録日時: 12年前

Re: 「現在の時刻」を取得

#4

投稿記事 by nullptr » 9年前

中置記法の&はビット積演算子です。オーバーロードされていなければ、ビット単位での積を取った値が返ります。

例えば、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++? ✜
     糸冬   
  ――――――――
  制作・著作 NHK
 
 

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 「現在の時刻」を取得

#5

投稿記事 by softya(ソフト屋) » 9年前

DXライブラリのアップデートの記録にGetNowCountの戻り値がマイナスになるバグを直したとありますね。
と言うことは、内部でGetNowCount() & INT_MAXしていると思いますので、こちらで対応する必要はないと思います。
なお、INT_MAXを超えるのはWindows起動から起動したままで24日後です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

カイジ

Re: 「現在の時刻」を取得

#6

投稿記事 by カイジ » 9年前

皆様、大変理解出来ました、
ありがとうございます。

ただ、GetNowCount()について、新たな疑問が。。
DXライブラリで作ったゲームを実行すると、
窓が出てそこにゲームが描画されているわけですが(以後、ゲーム窓)、
その時にマウスなりでディスクトップやブラウザなどを選択しますと
ゲーム窓のゲームは停止状態になるじゃないですか?
でも、GetNowCount()の中の時間は動いてますよね?

例えば、ゲーム中の時間制限を表すカウントを
GetNowCount()で1秒を測りながら処理していると、
ゲーム窓以外を選択していて、ゲーム窓に選択を戻したら
時間がワープするんですよ。カウントが。
えっと、伝わるでしょうか、これ。。。

ユーザーが、ゲーム窓以外を選択して、ゲーム窓が停止?している状態のときに
GetNowCount()の経過時間も止める方法は無いのでしょうか?
それとも、そもそもカウントを数えるのに、リアル時間のGetNowCount()を利用することが間違いで、
制限時間のカウントなどは、フレーム数で動かした方がいいのでしょうか?

教えて下さい。

アバター
へにっくす
記事: 634
登録日時: 11年前
住所: 東京都

Re: 「現在の時刻」を取得

#7

投稿記事 by へにっくす » 9年前

カイジ さんが書きました:ユーザーが、ゲーム窓以外を選択して、ゲーム窓が停止?している状態のときに
GetNowCount()の経過時間も止める方法は無いのでしょうか?
ありません
GetNowCount関数はあくまで、パソコンが起動してからの時間を返す関数ですから。
ユーザーの動作うんぬんは関係がありません。
written by へにっくす

アバター
usao
記事: 1887
登録日時: 11年前

Re: 「現在の時刻」を取得

#8

投稿記事 by usao » 9年前

その
>時間制限
というのが, リアル時間の話なのか,ゲーム内時間(?)の話なのか を先に決めるべきではないでしょうか.

リアル時間なのであれば,現状の動作が正解なのだろうし,
ゲーム内時間なのであれば処理回数カウンタ的なのでやれば良いように思います.

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 「現在の時刻」を取得

#9

投稿記事 by softya(ソフト屋) » 9年前

そういう事態の場合ProcessMessage()から戻ってこないと思いますので、ProcessMessage()突入前後の時間を求めておけば補正できると思います。厳密に言えば誤差がありますが相当な精度が必要ない限り害はないはずです。
【補足】間違っているかもしれないので、必ず動作確認を。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
Ketty
記事: 102
登録日時: 10年前

Re: 「現在の時刻」を取得

#10

投稿記事 by Ketty » 9年前

カイジ さんが書きました: それとも、そもそもカウントを数えるのに、リアル時間のGetNowCount()を利用することが間違いで、
制限時間のカウントなどは、フレーム数で動かした方がいいのでしょうか?
目的によると思いますが、私ならゲームロジック内のタイミング制御などにGetNowCountは使いません。
カウンタークラスのようなものを自作して、そいつにまかせるようにしています。
カイジ さんが書きました: その時にマウスなりでディスクトップやブラウザなどを選択しますと
ゲーム窓のゲームは停止状態になるじゃないですか?
主題とは違いますが、DXライブラリにはウィンドウが非アクティブな状態でも処理をつづけるための関数があります。
SetAlwaysRunFlag
http://homepage2.nifty.com/natupaji/DxL ... tml#R15N22
(ただし、この関数を使ってもウィンドウ枠をドラッグしている間は処理は止まります)

閉鎖

“C言語何でも質問掲示板” へ戻る