ページ 11

画像を斜めに移動する

Posted: 2011年11月26日(土) 14:41
by net921
ある角度にした画像をメモリに対して垂直に画像移動させたいのですがどうしてもうまくいきません。
実行してみるとわかると思いますが画像の動きが変です。
どうしたらよいでしょうか?
移動するための座標の計算は原点から直線ABの任意の点pまで動かしたい場合はx=cosθ*op , y=tanθ*x とやって求めています。
画像

コード:

#include "DxLib.h"
#include<Windows.h>
#include<math.h>
#include  <stdio.h>
#define PI	3.1415926535897932384626433832795f

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
			 LPSTR lpCmdLine, int nCmdShow )
{
	int JHandle;
	double x,y,s=0 ,r=30; 
    float fx,fy;
	
	//ウインドウモードで起動
	ChangeWindowMode( TRUE ) ;

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

	//裏画面を描画対称にする
	SetDrawScreen(DX_SCREEN_BACK); 

    // BMP画像のメモリへの読みこみ
	JHandle = LoadGraph( "horizon.png" ) ;
	
		while( ProcessMessage() == 0 )
	{

	   x=cos(r * PI / 180.0)*s;
	   y=tan(r * PI / 180.0)*cos(r * PI / 180.0)*s;
	   fx = (float)x;
	   fy = (float)y;

	   // 画面のクリア
	   ClearDrawScreen() ;
	   //補間処理
	   SetDrawMode( DX_DRAWMODE_BILINEAR );

	   DrawRotaGraph( 300+fx , 100-fy , 1.0 , r * PI / 180.0 , JHandle , TRUE , FALSE ) ;

	   s++;
	   Sleep(10);

	   ScreenFlip(); //画面入れ替え
	}

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

	return 0 ;			// ソフトの終了
}
horizonの画像
画像

Re: 画像を斜めに移動する

Posted: 2011年11月26日(土) 14:56
by naohiro19
ゲームにおいて書いてはいけない4つの処理にもある通り Wait 系や Sleep系を使うのはご法度です。

Re: 画像を斜めに移動する

Posted: 2011年11月26日(土) 15:54
by net921
ソースを訂正しました。

コード:

#include "DxLib.h"
#include<math.h>
#include  <stdio.h>
#define PI	3.1415926535897932384626433832795f

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
			 LPSTR lpCmdLine, int nCmdShow )
{
	int JHandle;
	double x,y,s=0 ,r=90; 
    float fx,fy;
	
	//ウインドウモードで起動
	ChangeWindowMode( TRUE ) ;

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

	//裏画面を描画対称にする
	SetDrawScreen(DX_SCREEN_BACK); 

    // 画像のメモリへの読みこみ
	JHandle = LoadGraph( "horizon.ping" ) ;
	
		while( ProcessMessage() == 0 )
	{

	   //姿勢表示処理
	   x=cos(r * PI / 180.0)*s;
	   y=sin(r * PI / 180.0)*s;
	   fx = (float)x;
	   fy = (float)y;

	   // 画面のクリア
	   ClearDrawScreen() ;
	   //補間処理
	   SetDrawMode( DX_DRAWMODE_BILINEAR );
	   //姿勢表示
	   DrawRotaGraph( 300+fx , 100-fy , 1.0 , r * PI / 180.0 , JHandle , TRUE , FALSE ) ;

	   s++;


	   ScreenFlip(); //画面入れ替え
	}

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

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

Re: 画像を斜めに移動する

Posted: 2011年11月26日(土) 16:33
by softya(ソフト屋)
この場合だと
x=sin(r * PI / 180.0)*s;
y=cos(r * PI / 180.0)*s;
とすれば望む動きになるのでは?

Re: 画像を斜めに移動する

Posted: 2011年11月26日(土) 16:50
by net921
残念ながら実際にやってみるとだめなんです。
微妙に流れている感じがします。
どうにかならないのでしょうか?
90度になったときぜんぜん違うほうに移動します。

Re: 画像を斜めに移動する

Posted: 2011年11月26日(土) 16:58
by softya(ソフト屋)
変ですね。
私の所では、90度の時ちゃんと画像上の上の方向、つまり→の方向に移動していますが。
私の書いたコードに書き換えましたよね?sinとcosが入れ替わっているんですが。

Re: 画像を斜めに移動する

Posted: 2011年11月26日(土) 17:02
by net921
あら。
ホントです。
見間違えました。
解決しました。
ありがとうございます。
いや~すごいですね。
僕がどこかで計算を間違えたようです。

Re: 画像を斜めに移動する

Posted: 2011年11月26日(土) 17:04
by softya(ソフト屋)
解決マークをお願いしますね。
あと、ちゃんと動くコードを最後に貼っておいて下さい。
同じ事でん悩んだ人のためにコードを残すのが、ここルールですので。

Re: 画像を斜めに移動する

Posted: 2011年11月26日(土) 17:09
by net921
完成したソースです。

コード:

#include "DxLib.h"
#include<math.h>
#include  <stdio.h>
#define PI	3.1415926535897932384626433832795f

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
			 LPSTR lpCmdLine, int nCmdShow )
{
	int JHandle;
	double x,y,s=0 ,r=60; //rは角度の設定
    float fx,fy;
	
	//ウインドウモードで起動
	ChangeWindowMode( TRUE ) ;

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

	//裏画面を描画対称にする
	SetDrawScreen(DX_SCREEN_BACK); 

    // 画像のメモリへの読みこみ
	JHandle = LoadGraph( "ここに画像" ) ;
	
		while( ProcessMessage() == 0 )
	{

	   //姿勢表示処理
	   x=sin(r * PI / 180.0)*s;
	   y=cos(r * PI / 180.0)*s;
	   fx = (float)x;
	   fy = (float)y;

	   // 画面のクリア
	   ClearDrawScreen() ;
	   //補間処理
	   SetDrawMode( DX_DRAWMODE_BILINEAR );
	   //画像表示
	   DrawRotaGraph( 300+fx , 100-fy , 1.0 , r * PI / 180.0 , JHandle , TRUE , FALSE ) ;

	   s++;


	   ScreenFlip(); //画面入れ替え
	}

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

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