皆さん初めましてC-TA-Kと申します
環境はwindows vista 32bit
visual C++ 2008
DxLibraryを使用しています。
本題に入りますが今回私はボールを速度は一定のまま様々な角度で移動させたいと思い、
次のようなプログラムを書きました。
#include "DxLib.h"
#include "Math.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;
SetDrawScreen( DX_SCREEN_BACK );
char Key[256];
int blue = GetColor( 0, 0, 255 );
int bal_speed = 1; //ボールのスピード
int bal_r = 8; //ボールの半径
double bal_x = 320; //ボールの初期x座標
double bal_y = 240; //ボールの初期y座標
double bal_ang = 190; //ボールの角度(度) ここの角度を自由に変えてください
double bal_rad = bal_ang * 3.14159 / 180; //ボールの角度(ラジアン)
while(ProcessMessage() == 0 && ClearDrawScreen() == 0 && GetHitKeyStateAll( Key ) == 0 && Key[KEY_INPUT_ESCAPE] == 0)
{
bal_x += cos( bal_rad ) * bal_speed;
bal_y += sin( bal_rad ) * bal_speed;
DrawCircle( (int)bal_x, (int)bal_y, bal_r, blue, FALSE );
ScreenFlip();
}
DxLib_End();
return 0;
}
ですがこれだとボールがやたらとガクガクしてしまいます。おそらくはdouble型によって計算された値を
描画時に切り捨ててしまっていることが関係していることは分かるのですが、これに対する対策がいまいち思いつきません。
思い切って描画前に四捨五入などもしたのですが、そうすると細かい角度調整(5度ずらす等)ができなくなってしまい、あまり好ましくない結果となってしまいました。どうか皆様のご助力をいただけないでしょうか。
いろいろな角度でボールを射出したいのですが・・・
Re:いろいろな角度でボールを射出したいのですが・・・
double型をすぺてfloat型にして、sinはsinf cosはcosfを利用するようにして、
それから、DrawCircleをやめて、ボール画像を作り、DrawRotaGraphFで表示すると
ガクガクしにくくなると思います。
それから、DrawCircleをやめて、ボール画像を作り、DrawRotaGraphFで表示すると
ガクガクしにくくなると思います。
Re:いろいろな角度でボールを射出したいのですが・・・
それはお察しの通り、最終的に座標がint型になっている為です。
DrawCircleにはありませんが、画像を描画する関数には実数を受け付ける関数があります。
例えば公式には
DrawGraph
関数しかありませんが、DxLib.hのヘッダファイルの中を見ると、
DrawGraphF
という関数があり、float型を渡せます。
DrawRotaGraphなども同じです。
で、これだけでは綺麗に描画出来ません。
ピクセル間を補間して描画する必要があります。
といっても、簡単、
SetDrawMode( DX_DRAWMODE_BILINEAR ) ;
これを書いてから描画すればバイリニアで描画してくれます。
書き終わったら
SetDrawMode( DX_DRAWMODE_NEAREST );
を書いて下さい。線形補間をしない元の描画に戻ります。
RPGとかだとよくわかりませんが、STGだと補間描画がしてあるかしてないかは良く解りますよね。
DrawCircleにはありませんが、画像を描画する関数には実数を受け付ける関数があります。
例えば公式には
DrawGraph
関数しかありませんが、DxLib.hのヘッダファイルの中を見ると、
DrawGraphF
という関数があり、float型を渡せます。
DrawRotaGraphなども同じです。
で、これだけでは綺麗に描画出来ません。
ピクセル間を補間して描画する必要があります。
といっても、簡単、
SetDrawMode( DX_DRAWMODE_BILINEAR ) ;
これを書いてから描画すればバイリニアで描画してくれます。
書き終わったら
SetDrawMode( DX_DRAWMODE_NEAREST );
を書いて下さい。線形補間をしない元の描画に戻ります。
RPGとかだとよくわかりませんが、STGだと補間描画がしてあるかしてないかは良く解りますよね。
Re:いろいろな角度でボールを射出したいのですが・・・
Tororo様、Dixq様、お二方とも本当にありがとうございます。
おっしゃられたとおり、float型になおし、DrawRotaGraphFで描画前に、
SetDrawMode( DX_DRAWMODE_BILINEAR ) ; でピクセル間を補間し、
その後にSetDrawMode( DX_DRAWMODE_NEAREST ); で戻す処理を入れました。
そしてコンパイルしたところ見事解決致しました。
ずっと悩んでいたことなのでとても清々しい気持ちです。
再度になりますが本当にありがとうございました。
おっしゃられたとおり、float型になおし、DrawRotaGraphFで描画前に、
SetDrawMode( DX_DRAWMODE_BILINEAR ) ; でピクセル間を補間し、
その後にSetDrawMode( DX_DRAWMODE_NEAREST ); で戻す処理を入れました。
そしてコンパイルしたところ見事解決致しました。
ずっと悩んでいたことなのでとても清々しい気持ちです。
再度になりますが本当にありがとうございました。
Re:いろいろな角度でボールを射出したいのですが・・・
>その後にSetDrawMode( DX_DRAWMODE_NEAREST ); で戻す処理を入れました。
特殊な事がない限り、
最初にSetDrawMode( DX_DRAWMODE_BILINEAR ) ;で設定して放っておけばいいと思いますよ。
(投稿後に名前を修正)
特殊な事がない限り、
最初にSetDrawMode( DX_DRAWMODE_BILINEAR ) ;で設定して放っておけばいいと思いますよ。
(投稿後に名前を修正)
