シューティングのようなものを製作途中なのですが
自機を敵に向けるプログラムで詰まりました。
さまざまなサイトをみて、いじくっていたら敵の方向は向くようになったのですが
「 '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。」
というエラーがでるようになり解決方法がわからなくなりました。
VC++2008 DXライブラリを使用し、OSは7です。
素人故、汚い書き方で見苦しいと思いますが、なにとぞお願いします。
#include <math.h>
#include "DxLib.h"
#define PI 3.141592654
char Key[256];
struct uni{
int image[5];
double x,y;
double rad;
int HP;
};
struct enemys{
int image[5];
double x,y;
int HP;
};
struct zyoukyou {
int map;
};
void dainyuu(struct uni *mainuni,struct enemys *ene){
mainuni->x=300;
mainuni->y=600;
mainuni->image[0]=LoadGraph("usvmm1.png");
ene->image[0]=LoadGraph("ene1.png");
ene->image[1]=LoadGraph("ene2.png");
ene->x=300;
ene->y=100;
}
int attack(){
return 0;
}
void enemy(struct enemys *ene,struct uni *mainuni){
DrawRotaGraph(ene->x, ene->y,1.0,PI/180, ene->image[0], TRUE );//ここをエラーが指しています
}
void move(struct uni *mainuni,struct enemys *ene){
if((mainuni->x>-30)){
if( CheckHitKey( KEY_INPUT_A ) == 1 ){
mainuni->x=mainuni->x-3;
}
}
if((mainuni->y<570)){
if( CheckHitKey( KEY_INPUT_S ) == 1 ){
mainuni->y=mainuni->y+3;
}
}
if((mainuni->x<770)){
if( CheckHitKey( KEY_INPUT_D ) == 1 ){
mainuni->x=mainuni->x+3;
}
}
if((mainuni->y>-30)){
if( CheckHitKey( KEY_INPUT_W ) == 1 ){
mainuni->y=mainuni->y-3;
}
}
mainuni->rad=atan2(ene->y-mainuni->y,ene->x-mainuni->x);
DrawRotaGraph(mainuni->x, mainuni->y,1.0,mainuni->rad+PI/2, mainuni->image[0], TRUE ); //エラーはここを指しています
}
int map(int mapimg){
DrawGraph(0,0,mapimg,TRUE);
return 0;
}
int battle(){
int mapimg;
mapimg=LoadGraph("usmap1.png");
struct uni mainuni;
struct enemys ene;
dainyuu(&mainuni,&ene);
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
// attack();
map(mapimg);
move(&mainuni,&ene);
enemy(&ene,&mainuni);
ScreenFlip();
}
return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
SetGraphMode( 800 , 600 , 32 ) ;
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //初期化処理
SetDrawScreen( DX_SCREEN_BACK ); //裏画面に設定
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){
//↑メッセージ処理 ↑画面をクリア ↑キーボード入力状態取得 ↑ESCが押されていない
//int story();
battle();
ScreenFlip();
}
DxLib_End();
return 0;
}
自機を敵に向けるプログラムについて
Re: 自機を敵に向けるプログラムについて
これはエラーではなく警告だと思うのですが、コンパイラの警告レベルが高かったりするとエラーになるんでしょうか。
すいません、このあたりはあまり詳しくなかったりします。
原因としては、不動小数点の変数を整数でわっているということです。
具体的にどんなことがおこるかというと、
上記のコードは、不動少数で定義しているので、49.5となるように思えますが、
PCからしたら少数と整数の割り算なので、実際に実行してみると49という数値になってしまいます。
では、どう対処したらいいか
この割る数は少数であると、上記のようにPCに教えてあげれば解決すると思います。
49.5になると想定してたのに実際に入るのは49だったみたいなのは、
2Dのゲームだとそこまで目立たないですが、3dや制度を追求しているプログラムだと致命的になったりします。
ご要望の答えと間違っていたらごめんなさい。
すいません、このあたりはあまり詳しくなかったりします。
原因としては、不動小数点の変数を整数でわっているということです。
具体的にどんなことがおこるかというと、
上記のコードは、不動少数で定義しているので、49.5となるように思えますが、
PCからしたら少数と整数の割り算なので、実際に実行してみると49という数値になってしまいます。
では、どう対処したらいいか
float temp = 99 / 2.0f;
// or
float temp = 99 / static_cast< float >( 2 );
/*
↓実際のコードだとこんな感じ?
DrawRotaGraph(ene->x, ene->y,1.0,PI/180.0f, ene->image[0], TRUE );//ここをエラーが指しています
*/
49.5になると想定してたのに実際に入るのは49だったみたいなのは、
2Dのゲームだとそこまで目立たないですが、3dや制度を追求しているプログラムだと致命的になったりします。
ご要望の答えと間違っていたらごめんなさい。
Re: 自機を敵に向けるプログラムについて
error C3872: '0x3000': この文字を識別子で使用することはできません
というエラーが出ておりませんでしょうか?
上のソースを検索してみた感じ全角の空白が存在していると思います。
> 「 '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。」
これはエラーではなく警告です。
対処法としては私が思いつく限り三つです。
[その1:構造体内の型を int にする]
DrawRotaGraph(ene->x, ene->y ・・・
この ene->x, ene->y は、double 型です。
struct uni 及び struct enemys の x, y を int 型にすれば、とりあえずこの警告を消すことは可能です。
しかし、int 型なので、小数点の計算をしたい場合は一工夫必要です。
[その2:キャストする]
キャストを使用する事で、一時的に型を変更することが可能です。
DrawRotaGraph((int)ene->x, (int)ene->y ・・・
これで、一時的に int 型として扱う事が出来ます。
[その3:無視する(警告を出さないようにする)]
警告は、エラーではないため実行する事が可能です。
コレを利用して無視すると言う選択肢も有りです。
無視してよいかどうかはその時々で変わると思いますので一概に全てを無視していいとは言えません。
ただ、鬱陶しいのであれば以下の記述を追記する事で警告を消すことは可能です。
今回の警告は「warning C4244: '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。」なので
#pragma warning(disable : 4244)
と記述することで今回の警告を消す事が出来ます。
というエラーが出ておりませんでしょうか?
上のソースを検索してみた感じ全角の空白が存在していると思います。
> 「 '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。」
これはエラーではなく警告です。
対処法としては私が思いつく限り三つです。
[その1:構造体内の型を int にする]
DrawRotaGraph(ene->x, ene->y ・・・
この ene->x, ene->y は、double 型です。
struct uni 及び struct enemys の x, y を int 型にすれば、とりあえずこの警告を消すことは可能です。
しかし、int 型なので、小数点の計算をしたい場合は一工夫必要です。
[その2:キャストする]
キャストを使用する事で、一時的に型を変更することが可能です。
DrawRotaGraph((int)ene->x, (int)ene->y ・・・
これで、一時的に int 型として扱う事が出来ます。
[その3:無視する(警告を出さないようにする)]
警告は、エラーではないため実行する事が可能です。
コレを利用して無視すると言う選択肢も有りです。
無視してよいかどうかはその時々で変わると思いますので一概に全てを無視していいとは言えません。
ただ、鬱陶しいのであれば以下の記述を追記する事で警告を消すことは可能です。
今回の警告は「warning C4244: '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。」なので
#pragma warning(disable : 4244)
と記述することで今回の警告を消す事が出来ます。