龍神録で、DrawGraphでなくDrawRotaGraphを用いている

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

龍神録で、DrawGraphでなくDrawRotaGraphを用いている

#1

投稿記事 by 3T » 15年前

こんにちは。
また、お世話になります。

龍神録で、キャラなどの描画にDrawGraphでなくてDrawRotaGraphが用いられているのですが、これには理由があるのでしょうか?
実行速度的に、DrawGraph(*1)よりDrawRotaGraphの方が良いのですかね。


(*1)
DrawGraphの場合、画像を(x,y)を(画像の左上の位置でなく)中心とする位置に表示する必要があると思われます。
中心に表示するためには、キャラなどの描画をする際にGetGraphSizeで画像の大きさを取得し、幅・高さの半分を引けば実装可能だと思われます。



よろしくお願いします。

DVDM

Re:龍神録で、DrawGraphでなくDrawRotaGraphを用いている

#2

投稿記事 by DVDM » 15年前

>>3Tさん
DrawGraph と DrawRotaGraphをDxLibのリファレンスから引っ張ってきました。

int DrawGraph( int x, int y, int GrHandle, int TransFlag ) ;
x , y   : グラフィックを描画する領域の左上頂点の座標
参考URL:http://homepage2.nifty.com/natupaji/DxL ... .html#R3N7


int DrawRotaGraph( int x, int y, double ExtRate, double Angle, int GrHandle , int TransFlag , int TurnFlag ) ;
x , y   : グラフィックを描画する領域の中心座標
参考URL:http://homepage2.nifty.com/natupaji/DxL ... html#R3N10


DrawRotaGraphの方には回転や拡大縮小まで引数で指定できるようです。

実際使ったわけではありませんが、リファレンスを見るとx, yは3Tさんの仰る通り
DrawGraphでは画像の左上、DrawRotaGraphは画像の中心であってると思います。

3T

Re:龍神録で、DrawGraphでなくDrawRotaGraphを用いている

#3

投稿記事 by 3T » 15年前

ご返信ありがとうございます。
確かに、その通りですね。
問題は、このどちらを使うべきか(速度的に優れているのか)ということですが……。


(DrawRotaGraphの引数のx,yについて、型がdoubleだと勘違いしてましたので、上記質問の内容を訂正しました。申し訳ございません。)
更に、見直すと色々と補足不足でした。
まず、龍神録のようなSTGにおけるキャラの表示に関する問題ということを言わなければなりませんでした。
STGですので、画像表示はキャラの位置(x,y)を中心に行われなければなりません。(もしかして別に方法がある……?)
そのため、DrawGraph関数を用いる場合には中心に表示するようにする必要がある、ということです。

3T

Re:龍神録で、DrawGraphでなくDrawRotaGraphを用いている

#4

投稿記事 by 3T » 15年前

DrawGraphとDrawRotaGraphを用いる場合の比較用のものを書いてみました。
キーボードのAを押すことで、DrawGraphもしくはDrawRotaGraphを2万回繰り返すものです。
これの作成にあたり、http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=1437を参考にさせていただきました。



私の環境では、DrawGraphの方が早く動作しました。
DrawGraphが7000前後、DrawRotaGraphが8500前後でした。


(※実行にあたり、別途"0.png"が必要です。)
#include "DxLib.h"

char Key[256];
LONGLONG	StartTime, EndTime;
const	int	DRAW_TIMES	=	20000;
int	GHandle;

typedef int XY;
XY	x = 0, y = 0;

void	Draw()
{
	StartTime = GetNowHiPerformanceCount() ; // 現在経過時間を得る
	for(int i=0;i<DRAW_TIMES;i++){
		// 用いる関数の設定。コメントアウトで。
		int w,h; GetGraphSize(GHandle, &w, &h); DrawGraph( x-w/2 , y-h/2 , GHandle , TRUE ) ;	// DrawGraph
//		DrawRotaGraph( x , y , 1.0f , 0.00 , GHandle , TRUE ) ;		// DrawRotaGraph
	}
	EndTime = GetNowHiPerformanceCount() - StartTime;
}

// プログラムは WinMain から始まります
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
						LPSTR lpCmdLine, int nCmdShow )
{
	// ===前処理===
	ChangeWindowMode(true);

	if( DxLib_Init() == -1 )		// DXライブラリ初期化処理
	{
		return -1 ;			// エラーが起きたら直ちに終了
	}

	SetDrawScreen( DX_SCREEN_BACK );
	// ============


	// 計測する
	GHandle	=	LoadGraph("0.png");


	int tmp;
    while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll(Key) ){
		ClearDrawScreen();

		DrawFormatString( 0, 40, GetColor( 255 , 255 , 255 ), " タイム %d ", EndTime) ;

		// Draw()関数を、Aを押したときのみ呼び出す仕組み
		if ( Key[KEY_INPUT_A] )
			++tmp;
		else
			tmp	=	0;

		if ( tmp == 1 )
			Draw();



		ScreenFlip();
    }


	DxLib_End() ;				// DXライブラリ使用の終了処理

	return 0 ;				// ソフトの終了 
}

バグ

Re:龍神録で、DrawGraphでなくDrawRotaGraphを用いている

#5

投稿記事 by バグ » 15年前

画像の表示位置の指定方法に関しては、中心だろうが左上だろうが関係無くありませんか?
どうしても中心位置で指定したいならば、関数を自作すればよいだけだと思いますが…

例えば…
int DrawGraphEx(int centerX, int centerY, int width, int height, int GrHandle, int TransFlag)
{
    DrawGraph(centerX - width / 2, centerY - height / 2, GrHandle, TransFlag);
}

Dixq (管理人)

Re:龍神録で、DrawGraphでなくDrawRotaGraphを用いている

#6

投稿記事 by Dixq (管理人) » 15年前

私が回転も拡大もしない画像でよくRota関数を使っているのは

・簡単に中心に描画出来る
・実行速度もDrawGraphよりそんなに遅くならない
・エフェクト関連でこの先拡大縮小することがあれば対応しやすい

という理由からです。
自作関数で中心を示せるかもしれませんが、省ける手間は省こうという感じで。
実行速度もそこまで計算したわけではありませんでしたが、
そんなに遅くならないようです。
サーフェイスを一ピクセルずつ扱ったライブラリを作ったりしましたが、
拡大回転処理があってここまで処理時間が遅くならないのは信じられない位速いです・・。

ただしもちろん余分な処理をしている分Rotaの方が遅いのは仕方ないと思います。

3T

Re:龍神録で、DrawGraphでなくDrawRotaGraphを用いている

#7

投稿記事 by 3T » 15年前

>バグさん

STGでは中心でないと見た目がおかしくなってしまう気がするのですが……。
そういう画像を作れば対処できないこともないですが、スマートでない気がします。

確かに、そういう関数を作ればいいだけですが、それなら何故Dixqさんは遅いRotaを採用したのか、ということでした。



>Dixqさん

なるほど、分かりました。
確かに簡単に作れはしますね。

ありがとうございます。


閉鎖

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