ページ 11

クラスのメンバ関数にDrawGraph関数を使うと機能しない

Posted: 2014年9月03日(水) 10:46
by comet
はじめまして。cometという者です。
DxLibでキャラクターを動かすプログラムを作っていた所、
キャラクターをクラス化した途端うまく行かなくなりました。

具体的には、上記のコードでたいしてエラーメッセージもなく(double型 から int型の代入の警告くらい)
実行されるのですが、ウィンドウに何も表示されません。
DrawRotaGraphだけでなくDrawGraphでも、座標値を変数でなく値を決め打ちしても同じです。

どこが間違っているのでしょうか?
(UnitのメンバDrawに問題があるとは思うのですが・・・どうでしょうか?)

コード:

#include "DxLib.h"
#include"math.h"
#define PI 3.141592654

int im1;
int im2;


class Unit{
	int place_x,place_y,angle;
	bool team;
public:
	Unit(int x,int y,int a,bool t);
	void Draw();
	
};

Unit::Unit(int x,int y,int a,bool t){
	place_x=x;
	place_y=y;
	angle=a;
	team=t;
};
	
void Unit::Draw(){
	int gx,gy;
	double d=angle*PI/180;
	gx=place_x+cos(PI*3/4-d);
	gy=place_y+sin(PI*3/4-d);
	if(team){
		DrawRotaGraph(gx,gy,1,d,im1,true,false);
	}
	else{
		DrawRotaGraph(gx,gy,1,d,im2,true,false);
	}
};

void m(){
	Unit aka1(100,100,180,true);
	Unit ao1(200,200,0,false);
	aka1.Draw();
	ao1.Draw();
}

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); 
		int im1=LoadGraph("unit1.png");
		int im2=LoadGraph("unit2.png");
        while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
			
			if(	CheckHitKey(KEY_INPUT_ESCAPE)  ){
				break;
			}
			m();
			
			
			ScreenFlip();
        }
        
        DxLib_End(); 
        return 0;
} 

Re: クラスのメンバ関数にDrawGraph関数を使うと機能しない

Posted: 2014年9月03日(水) 10:47
by みけCAT
グローバル変数のim1, im2に値を代入していないのが間違いだと思います。

Re: クラスのメンバ関数にDrawGraph関数を使うと機能しない

Posted: 2014年9月03日(水) 14:03
by comet
みけCATさん
迅速な返信有難うございます。
WinMain関数で画像ハンドルを代入しなおしていますが、
指摘の通りグローバル変数の宣言時にLoadGraph関数でハンドルを代入するように
直してみましたが、やはり画像が表示されません。

ともあれ、助言ありがとうございました。

Re: クラスのメンバ関数にDrawGraph関数を使うと機能しない

Posted: 2014年9月03日(水) 14:41
by softya(ソフト屋)
DxLib_Init()後にしかLoadGraph()は動作しませんので、ダメだと思います。
みけCATさんは、ローカルとグローバルのim1,im2があるのでローカルにしか代入してませんよ。と言いたかっただけです。
ローカルとグローバルのim1,im2は名前は同じですが別物の変数です。

Re: クラスのメンバ関数にDrawGraph関数を使うと機能しない

Posted: 2014年9月03日(水) 15:23
by Ketty
上記で、みけCATさんやsoftyaさんがおっしゃっているとおり、

5~6行目で

コード:

int im1;
int im2;
とint型のグローバル変数を宣言していますが、

47~48行目で

コード:

        int im1=LoadGraph("unit1.png"); // 代入のつもりだったのでしょうがintがついてるのでローカル変数を新たに宣言してます
        int im2=LoadGraph("unit2.png");
としているからです。

主題とは関係ありませんが、
メインループにScreenFlipが2回出現しています。1回にしましょう。
それから、DrawRotaGraphの第6、第7引数はいずれもint型(BOOL型のTRUE/FALSE)であるべきなのに、bool(true/false)を渡してしまってます。
最後に、m()についてですが、呼ばれるたびにaka1とao1というインスタンスが生まれては消えます。
なので、place_x,place_y,angle,teamといった値が活かされず、キャラクターの絵は動かないと思います。

Re: クラスのメンバ関数にDrawGraph関数を使うと機能しない

Posted: 2014年9月03日(水) 17:51
by comet
softyaさん
ありがとうございます。
ご指摘どおりDxLib_Initの位置に気をつけて、winmain関数内でグローバル変数im1,im2に
ハンドルを代入した所うまく機能しました。
グローバル変数のローカル変数についても勉強しなおしました。
みけcatさんもありがとうございました。

Re: クラスのメンバ関数にDrawGraph関数を使うと機能しない

Posted: 2014年9月03日(水) 18:19
by comet
Kettyさん
変数について詳しい説明ありがとうございます。
みけcatさんの指摘で僕も先ほど気づきました。
その他の指摘についても参考にさせていただきます。
おそらく今後手を加えていく中で、ぶつかるはずだった問題を
おかげさまで二つくらい回避できたかと思います^^;