こんにちは。
また、お世話になります。
龍神録で、キャラなどの描画にDrawGraphでなくてDrawRotaGraphが用いられているのですが、これには理由があるのでしょうか?
実行速度的に、DrawGraph(*1)よりDrawRotaGraphの方が良いのですかね。
(*1)
DrawGraphの場合、画像を(x,y)を(画像の左上の位置でなく)中心とする位置に表示する必要があると思われます。
中心に表示するためには、キャラなどの描画をする際にGetGraphSizeで画像の大きさを取得し、幅・高さの半分を引けば実装可能だと思われます。
よろしくお願いします。
龍神録で、DrawGraphでなくDrawRotaGraphを用いている
Re:龍神録で、DrawGraphでなくDrawRotaGraphを用いている
>>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は画像の中心であってると思います。
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は画像の中心であってると思います。
Re:龍神録で、DrawGraphでなくDrawRotaGraphを用いている
ご返信ありがとうございます。
確かに、その通りですね。
問題は、このどちらを使うべきか(速度的に優れているのか)ということですが……。
(DrawRotaGraphの引数のx,yについて、型がdoubleだと勘違いしてましたので、上記質問の内容を訂正しました。申し訳ございません。)
更に、見直すと色々と補足不足でした。
まず、龍神録のようなSTGにおけるキャラの表示に関する問題ということを言わなければなりませんでした。
STGですので、画像表示はキャラの位置(x,y)を中心に行われなければなりません。(もしかして別に方法がある……?)
そのため、DrawGraph関数を用いる場合には中心に表示するようにする必要がある、ということです。
確かに、その通りですね。
問題は、このどちらを使うべきか(速度的に優れているのか)ということですが……。
(DrawRotaGraphの引数のx,yについて、型がdoubleだと勘違いしてましたので、上記質問の内容を訂正しました。申し訳ございません。)
更に、見直すと色々と補足不足でした。
まず、龍神録のようなSTGにおけるキャラの表示に関する問題ということを言わなければなりませんでした。
STGですので、画像表示はキャラの位置(x,y)を中心に行われなければなりません。(もしかして別に方法がある……?)
そのため、DrawGraph関数を用いる場合には中心に表示するようにする必要がある、ということです。
Re:龍神録で、DrawGraphでなくDrawRotaGraphを用いている
DrawGraphとDrawRotaGraphを用いる場合の比較用のものを書いてみました。
キーボードのAを押すことで、DrawGraphもしくはDrawRotaGraphを2万回繰り返すものです。
これの作成にあたり、http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=1437を参考にさせていただきました。
私の環境では、DrawGraphの方が早く動作しました。
DrawGraphが7000前後、DrawRotaGraphが8500前後でした。
(※実行にあたり、別途"0.png"が必要です。)
キーボードの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を用いている
画像の表示位置の指定方法に関しては、中心だろうが左上だろうが関係無くありませんか?
どうしても中心位置で指定したいならば、関数を自作すればよいだけだと思いますが…
例えば…
どうしても中心位置で指定したいならば、関数を自作すればよいだけだと思いますが…
例えば…
int DrawGraphEx(int centerX, int centerY, int width, int height, int GrHandle, int TransFlag) { DrawGraph(centerX - width / 2, centerY - height / 2, GrHandle, TransFlag); }
Re:龍神録で、DrawGraphでなくDrawRotaGraphを用いている
私が回転も拡大もしない画像でよくRota関数を使っているのは
・簡単に中心に描画出来る
・実行速度もDrawGraphよりそんなに遅くならない
・エフェクト関連でこの先拡大縮小することがあれば対応しやすい
という理由からです。
自作関数で中心を示せるかもしれませんが、省ける手間は省こうという感じで。
実行速度もそこまで計算したわけではありませんでしたが、
そんなに遅くならないようです。
サーフェイスを一ピクセルずつ扱ったライブラリを作ったりしましたが、
拡大回転処理があってここまで処理時間が遅くならないのは信じられない位速いです・・。
ただしもちろん余分な処理をしている分Rotaの方が遅いのは仕方ないと思います。
・簡単に中心に描画出来る
・実行速度もDrawGraphよりそんなに遅くならない
・エフェクト関連でこの先拡大縮小することがあれば対応しやすい
という理由からです。
自作関数で中心を示せるかもしれませんが、省ける手間は省こうという感じで。
実行速度もそこまで計算したわけではありませんでしたが、
そんなに遅くならないようです。
サーフェイスを一ピクセルずつ扱ったライブラリを作ったりしましたが、
拡大回転処理があってここまで処理時間が遅くならないのは信じられない位速いです・・。
ただしもちろん余分な処理をしている分Rotaの方が遅いのは仕方ないと思います。
Re:龍神録で、DrawGraphでなくDrawRotaGraphを用いている
>バグさん
STGでは中心でないと見た目がおかしくなってしまう気がするのですが……。
そういう画像を作れば対処できないこともないですが、スマートでない気がします。
確かに、そういう関数を作ればいいだけですが、それなら何故Dixqさんは遅いRotaを採用したのか、ということでした。
>Dixqさん
なるほど、分かりました。
確かに簡単に作れはしますね。
ありがとうございます。
STGでは中心でないと見た目がおかしくなってしまう気がするのですが……。
そういう画像を作れば対処できないこともないですが、スマートでない気がします。
確かに、そういう関数を作ればいいだけですが、それなら何故Dixqさんは遅いRotaを採用したのか、ということでした。
>Dixqさん
なるほど、分かりました。
確かに簡単に作れはしますね。
ありがとうございます。