ページ 11

変数の型について

Posted: 2010年5月14日(金) 17:13
by bb
10章の「敵を表示させてみよう」で
void graph_enemy(){
int i;
for(i=0;i<ENEMY_MAX;i++){
if(enemy.flag==1){
DrawRotaGraphF(enemy.x+FIELD_X,enemy.y+FIELD_Y,1.0f,0.0f,img_enemy[0][enemy.img],TRUE);
}
}
}
とありますがenemy.x,enemy.yは型がdoubleでの宣言ですが
DrawRotaGraphの引数の型はintですよね?
ここで「intにdoubleが使われてデータを失う危険があります」とビルド中出ます。
立ち上げて動くには動くのですがこれでいいのでしょうか?
VC++2008ではなく2010でやって変換がうまくいかなかったので自分でヘッダとかソース追加してやってるんですが関係ありますか?

Re:変数の型について

Posted: 2010年5月14日(金) 17:21
by softya
DrawRotaGraphの引数の型はintですが、DrawRotaGraphFの引数の型はfloatです。
名前が微妙に違いますので注意してください。

Dxlib.hより抜粋。

extern int DrawRotaGraph( int x, int y, double ExRate, double Angle, int GrHandle, int TransFlag, int TurnFlag = FALSE ) ; // グラフィックの回転描画
extern int DrawRotaGraphF( float xf, float yf, double ExRate, double Angle, int GrHandle, int TransFlag, int TurnFlag = FALSE ) ; // グラフィックの回転描画

もしオリジナルのヘッダを作っているなら、原因を調べて元のヘッダを使えるようにしないと今後が面倒だと思います。 画像

Re:変数の型について

Posted: 2010年5月14日(金) 17:27
by Dixq (管理人)
警告を消す章が少し先にあります。
しかしdoubleを全部floatにした方が早いです…。
Directxを使うと計算過程すら両者が同じ精度になると知らなかったからこうしてあるんですよね;

Re:変数の型について

Posted: 2010年5月14日(金) 19:14
by bb
ありがとうございます。
参考にしながら別のゲーム(STG)をつくってますので
とりあえずdoubleをintにして座標計算はすべて整数型で処理してみようと思います。
ありがとうございました。

Re:変数の型について

Posted: 2010年5月14日(金) 21:13
by Dixq (管理人)
いや、それはまずいです。

softyaさんが仰っているように、DrawRotaGraphF関数の引数はfloat型であってint型ではありません。
警告はとりあえず無視でも大丈夫です。
これも上と重なりますが、気になるようなら37章を参考にするか、全てfloat型にして下さい。

int a=0;

a += 0.9;
a += 0.9;
a += 0.9;
a += 0.9;
a += 0.9;

の計算結果がどうなるかを考えて頂ければ整数型で座標管理をしてはいけない理由がお解りいただけると思います。