画像を斜めに移動する

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

画像を斜めに移動する

#1

投稿記事 by net921 » 13年前

ある角度にした画像をメモリに対して垂直に画像移動させたいのですがどうしてもうまくいきません。
実行してみるとわかると思いますが画像の動きが変です。
どうしたらよいでしょうか?
移動するための座標の計算は原点から直線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の画像
画像

naohiro19
記事: 256
登録日時: 14年前
住所: 愛知県

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

#2

投稿記事 by naohiro19 » 13年前

ゲームにおいて書いてはいけない4つの処理にもある通り Wait 系や Sleep系を使うのはご法度です。

net921

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

#3

投稿記事 by net921 » 13年前

ソースを訂正しました。

コード:

#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 ;			// ソフトの終了
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#4

投稿記事 by softya(ソフト屋) » 13年前

この場合だと
x=sin(r * PI / 180.0)*s;
y=cos(r * PI / 180.0)*s;
とすれば望む動きになるのでは?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#5

投稿記事 by net921 » 13年前

残念ながら実際にやってみるとだめなんです。
微妙に流れている感じがします。
どうにかならないのでしょうか?
90度になったときぜんぜん違うほうに移動します。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#6

投稿記事 by softya(ソフト屋) » 13年前

変ですね。
私の所では、90度の時ちゃんと画像上の上の方向、つまり→の方向に移動していますが。
私の書いたコードに書き換えましたよね?sinとcosが入れ替わっているんですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#7

投稿記事 by net921 » 13年前

あら。
ホントです。
見間違えました。
解決しました。
ありがとうございます。
いや~すごいですね。
僕がどこかで計算を間違えたようです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#8

投稿記事 by softya(ソフト屋) » 13年前

解決マークをお願いしますね。
あと、ちゃんと動くコードを最後に貼っておいて下さい。
同じ事でん悩んだ人のためにコードを残すのが、ここルールですので。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

net921
記事: 70
登録日時: 13年前

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

#9

投稿記事 by net921 » 13年前

完成したソースです。

コード:

#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 ;			// ソフトの終了
}

閉鎖

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