ページ 11

Dxlibの描画関数の引数がint型へ変換される警告がでる。

Posted: 2011年6月30日(木) 00:43
by LisetteLander

コード:

#include <math.h>
#include "DxLib.h"
#define PI 3.1415926

int Key[256]; // キーが押されているフレーム数を格納する

int gpUpdateKey(){
        char tmpKey[256]; // 現在のキーの入力状態を格納する
        GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
        for( int i=0; i<256; i++ ){ 
                if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
                        Key[i]++;     // 加算
                } else {              // 押されていなければ
                        Key[i] = 0;   // 0にする
                }
        }
        return 0;
}


int ProcessLoop(){
	if(ScreenFlip()!=0)return -1;
	if(ProcessMessage()!=0)return -1;
	if(ClearDrawScreen()!=0)return -1;
	if(gpUpdateKey()!=0)return-1;
	return 0;
}

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定




        double D_x=320,D_y=240,x=320,y=240,angle=0,speed=1,angle_tmp=0,chspeed=3;//初期値デフォ x,y tmp x,y
		int ini_state=1;

        while(ProcessLoop()==0){
				switch(ini_state){
					case 1:

						int Handle[3],b_ground,barrel[100];     // 画像格納用ハンドル
						LoadDivGraph( "画像/弾01.png", 3, 3, 1, 14, 16, Handle ); // 3つに画像を分割してロード
						b_ground = LoadGraph("画像/エフェクト/メニュー背景.png");

						ini_state=2;//case文で初回にだけ読み込みたいファイルをwhile文の中に埋め込む。
						break;

					case 2:
	




//計算フェーズ
                x += cos( angle ) * speed;      // x座標を更新
                y += sin( angle ) * speed;      // y座標を更新

				if( Key[KEY_INPUT_D]!=0)	angle_tmp -=1.0/(PI*2.0);
				if( Key[KEY_INPUT_A]!=0)	angle_tmp +=1.0/(PI*2.0);//弾の発射角度
//

				if( Key[KEY_INPUT_LEFT]!=0)	D_x-=chspeed;
				if( Key[KEY_INPUT_RIGHT]!=0)D_x+=chspeed;

				//発射地点の座標角度
				if( Key[KEY_INPUT_Z] == 1 ){//zが押されていたら変数の中身を変更
                        x = D_x;        //初期座標にセット
                        y = D_y;
                        speed = 1;
						angle=angle_tmp;
				}


//描画フェーズ

	DrawRotaGraph( 320, 240, 1.0, 0, b_ground, TRUE );//背景を描画
    DrawRotaGraph( x, y, 1.0, angle+PI/2, Handle[0], TRUE );//弾を描画
	DrawRotaGraph( D_x, D_y, 1.0, angle_tmp+PI/2, Handle[0], TRUE );//弾発射位置を描画

				/*描画は新しいものを古い物の上から描画していく*/
				break;





			default:
				printfDx("不明なfunc_state\n");
				break;

				}
		}

		DxLib_End(); // DXライブラリ終了処理
        return 0;
}
↑のコードを実行すると、↓の警告がでます。
描画の行が指定されたのですが、解決方法が思い浮かびません。
描画する座標を渡したいだけなので切り捨ててもまったく結果も変わらないと思うのですが、どうしても気になります。
どうしたらいいですか?
1>.\main.cpp(84) : warning C4244: '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。
1>.\main.cpp(84) : warning C4244: '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。
1>.\main.cpp(85) : warning C4244: '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。
1>.\main.cpp(85) : warning C4244: '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。

Re: Dxlibの描画関数の引数がint型へ変換される警告がでる。

Posted: 2011年6月30日(木) 00:46
by LisetteLander
ちなみにbarrel変数はあとで複数個の弾を撃ちたいと思って用意した変数です。
まったく使ってません。

Re: Dxlibの描画関数の引数がint型へ変換される警告がでる。

Posted: 2011年6月30日(木) 00:56
by softya(ソフト屋)
DrawRotaGraph()の第1、2パラメータはint型なのでdouble D_x=320,D_y=240,x=320,y=240などの値を引数にした場合はdouble→int型の型変換が起こり小数部が消滅します。
1>.\main.cpp(84) : warning C4244: '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。
1>.\main.cpp(84) : warning C4244: '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。
1>.\main.cpp(85) : warning C4244: '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。
1>.\main.cpp(85) : warning C4244: '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。
はすべて、それに対するコンパイラーの警告です。

Re: Dxlibの描画関数の引数がint型へ変換される警告がでる。

Posted: 2011年6月30日(木) 07:19
by naohiro19

コード:

DrawRotaGraph( static_cast<int>(x), static_cast<int>(y), 1.0, angle+PI/2, Handle[0], TRUE );
にすると警告が出なくなります。
もしくは

コード:

DrawRotaGraph( (int)x, (int)y, 1.0, angle+PI/2, Handle[0], TRUE );
のようにすれば第1引数、第2引数をint型にキャストする必要があります。(どちらも同じです)

Re: Dxlibの描画関数の引数がint型へ変換される警告がでる。

Posted: 2011年6月30日(木) 08:27
by LisetteLander
ありがとうございます。
警告はでなくなりました。