表示画像のキー入力に応じた座標変換について

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

表示画像のキー入力に応じた座標変換について

#1

投稿記事 by まさのり » 13年前

以下に、座標の計算部分のプログラムを記載しました。

このプログラムにおいて、現在 上下左右のキー入力に対応した座標の変換ができるようになっています。
(上キーを入力すると、y座標が1増えるなど。)

今回このプログラムで、上キーを入力した時に、「ジャンプ」のように
一度変化した座標の値を、もとの値まで徐々に戻すようなプログラムを作成したいと思っています。

一度、フラグをつかったものも作ってみましたが、うまく動作しませんでした。

以下のどの部分に、「ジャンプ」を描画するための 座標計算を入力すれば良いでしょうか。
また、どのような式を作成すればいいでしょうか。やはり、物理の公式などが有効ですか。

長くなりましたが、よろしければ どなたかお願いします。

コード:

#include "../include/GV.h"

void calc_ch()
{
	ch.cnt++;
	ch.img=(ch.cnt%24)/6;
}

void ch_move()
{
	int i,sayu_flag=0,joge_flag=0;
	double x,y,mx,my,naname=1;
	double move_x[4]={-4.0,4.0,0,0},move_y[4]={0,0,4.0,-4.0};//{左,右,下,上}のスピード
	int inputpad[4]; //4つのキーパッドを配列に格納
	inputpad[0]=CheckStatePad(configpad.left); inputpad[1]=CheckStatePad(configpad.right);
	inputpad[2]=CheckStatePad(configpad.down); inputpad[3]=CheckStatePad(configpad.up);

	if(CheckStatePad(configpad.left)>0)//左キーが押されていたら
	{
		ch.img+=4*2;//画像を左向きに
		if(CheckStatePad(configpad.up)>0)//上キー左キーが押されていたら
			ch.img+=4*2;//画像を左上向きに//左向き時に値が既に足されていることに注意
		if(CheckStatePad(configpad.down)>0)//下キー左キーが押されていたら
			ch.img+=4*4;//画像を左下向きに
	}
	else if(CheckStatePad(configpad.right)>0)//右キーが押されていたら
	{
		ch.img+=4*1;//画像を右向きに
		if(CheckStatePad(configpad.up)>0)//上キー右キーが押されていたら
			ch.img+=4*2;//画像を右上向きに//右向き時に値が既に足されていることに注意
		if(CheckStatePad(configpad.down)>0)//下キー右キーが押されていたら
			ch.img+=4*4;//画像を右下向きに
	}
	else if(CheckStatePad(configpad.up)>0)//上キーが押されていたら
		ch.img+=4*3;
	

	for(i=0;i<2;i++)//左右分
		if(inputpad[i]>0)//左右どちらかの入力があれば
			sayu_flag=1;//左右入力フラグを立てる

	for(i=2;i<4;i++)//上下分
		if(inputpad[i]>0)//上下どちらかの入力があれば
			joge_flag=1;//上下入力フラグを立てる

	if(sayu_flag==1 && joge_flag==1)//左右、上下両方の入力があれば斜めだと言う事
		naname=sqrt(2.0);//移動スピードを1/ルート2に

	for(int i=0;i<4;i++)
	{   //4方向分ループ
		if(inputpad[i]>0)
		{   //i方向のキーボード、パッドどちらかの入力があれば
			x=ch.x , y=ch.y;//今の座標をとりあえずx,yに格納
			mx=move_x[i];	my=move_y[i];//移動分をmx,myに代入
			if(CheckStatePad(configpad.slow)>0)
			{//低速移動なら
				mx=move_x[i]/3;	my=move_y[i]/3;//移動スピードを1/3に
			}
			x+=mx/naname , y+=my/naname;//今の座標と移動分を足す
			if(!(x<10 || x>FIELD_MAX_X-10 || y<5 || y>FIELD_MAX_Y-5)){//計算結果移動可能範囲内なら
				ch.x=x , ch.y=y;//実際に移動させる
			}
		}
	}
}

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

Re: 表示画像のキー入力に応じた座標変換について

#2

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

やはり物理の速度・加速度の世界になります。
まぁ、簡単に書けば
・移動速度の変数を持ち毎回y座標に移動速度を加算します。
・y座標が地面より下になったら地面の上にy座標を補正して移動速度は0にしします。
・重力の方向に移動速度は毎フレーム毎に一定値の加速度を加算します。
となります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

まさのり

Re: 表示画像のキー入力に応じた座標変換について

#3

投稿記事 by まさのり » 13年前

こうゆう感じでしょうか?

コード:

double x=0, y=0;
double vx = 1.0, vy = 2.0;
double g = 0.3;
while( ProcessMessage() == 0 )
{
    vy+=g;
    x+=vx;
    y+=vy;
}

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

Re: 表示画像のキー入力に応じた座標変換について

#4

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

そんな感じですが、初速の方向と重力加速度の方向が同じなのでどんどん加速してしまいます。初速に対して加速度はマイナスでなければいけません。
移動速度の初速がジャンプ力となります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

まさのり

Re: 表示画像のキー入力に応じた座標変換について

#5

投稿記事 by まさのり » 13年前

前回教えていただいた点をふまえて、プログラムを変更しました。
今回はy座標の移動スピードを定義した、move_y[4]に{0,0,0,vy}と代入し、

以下のループ文で、vy+=g
として、値が変動するように考えてみました。

しかし、gの値を無視し、vyの初期値のみにしたがって変動してしまいます。
どこを直せばよろしいでしょうか。

どなたか よろしくお願いします。

コード:


#include "../include/GV.h"

void calc_ch()
{
	ch.cnt++;
	ch.img=(ch.cnt%24)/6;
}

void ch_move()
{
	int i,sayu_flag=0,joge_flag=0;
	double x,y,mx,my,naname=1;
	
	double vy=-4.0,g=0.3;
	
	double move_x[4]={-4.0,4.0,0,0},move_y[4]={0,0,0,vy};//{左,右,下,上}のスピード

	int inputpad[4]; //4つのキーパッドを配列に格納
	inputpad[0]=CheckStatePad(configpad.left); inputpad[1]=CheckStatePad(configpad.right);
	inputpad[2]=CheckStatePad(configpad.down); inputpad[3]=CheckStatePad(configpad.up);

	if(CheckStatePad(configpad.left)>0)//左キーが押されていたら
	{
		ch.img+=4*2;//画像を左向きに
		if(CheckStatePad(configpad.up)>0)//上キー左キーが押されていたら
			ch.img+=4*2;//画像を左上向きに//左向き時に値が既に足されていることに注意
		if(CheckStatePad(configpad.down)>0)//下キー左キーが押されていたら
			ch.img+=4*4;//画像を左下向きに
	}
	else if(CheckStatePad(configpad.right)>0)//右キーが押されていたら
	{
		ch.img+=4*1;//画像を右向きに
		if(CheckStatePad(configpad.up)>0)//上キー右キーが押されていたら
			ch.img+=4*2;//画像を右上向きに//右向き時に値が既に足されていることに注意
		if(CheckStatePad(configpad.down)>0)//下キー右キーが押されていたら
			ch.img+=4*4;//画像を右下向きに
	}
	else if(CheckStatePad(configpad.up)>0)//上キーが押されていたら
			ch.img+=4*3;
	
	for(i=0;i<2;i++)//左右分
		if(inputpad[i]>0)//左右どちらかの入力があれば
			sayu_flag=1;//左右入力フラグを立てる

	for(i=2;i<4;i++)//上下分
		if(inputpad[i]>0)//上下どちらかの入力があれば
			joge_flag=1;//上下入力フラグを立てる

	if(sayu_flag==1 && joge_flag==1)//左右、上下両方の入力があれば斜めだと言う事
		naname=sqrt(2.0);//移動スピードを1/ルート2に

	for(int i=0;i<4;i++)
	{   //4方向分ループ
		if(inputpad[i]>0)
		{   //i方向のキーボード、パッドどちらかの入力があれば
			x=ch.x , y=ch.y;//今の座標をとりあえずx,yに格納

			vy+=g;

			mx=move_x[i];	my=move_y[i];//移動分をmx,myに代入
			if(CheckStatePad(configpad.slow)>0)
			{//低速移動なら
				mx=move_x[i]/3;	my=move_y[i]/3;//移動スピードを1/3に
			}
			x+=mx/naname , y+=my/naname;//今の座標と移動分を足す
			if(!(x<10 || x>FIELD_MAX_X-10 || y<5 || y>FIELD_MAX_Y-5)){//計算結果移動可能範囲内なら
				ch.x=x , ch.y=y;//実際に移動させる
			}
		}
	}
}

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

Re: 表示画像のキー入力に応じた座標変換について

#6

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

キー入力がないと vy+=g;など一連の処理が実行されないからです。
下への加速度処理は横への移動と違いキー入力と関係なく常に行う必要があります。
上への初速は上キーが押されていて、ジャンプしていない時に代入するようにして下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

まさのり

Re: 表示画像のキー入力に応じた座標変換について

#7

投稿記事 by まさのり » 13年前

以下のように変更しましたが、エラーが出て実行できませんでした。

とりあえず、まずキーの入力があった場合にvy=-4.0、ない場合にvy=0.0となるようにしましたが、
どうも、vyに値がはいってないような気がします。

どこが問題でしょうか。

コード:


#include "../include/GV.h"

void calc_ch()
{
	ch.cnt++;
	ch.img=(ch.cnt%24)/6;
}

void ch_move()
{
	int i,sayu_flag=0,joge_flag=0;
	double x,y,mx,my,naname=1;
	
	double vy;
	double g=0.3;
	
	double move_x[4]={-4.0,4.0,0,0},move_y[4]={0,0,0,vy};//{左,右,下,上}のスピード

	int inputpad[4]; //4つのキーパッドを配列に格納
	inputpad[0]=CheckStatePad(configpad.left); inputpad[1]=CheckStatePad(configpad.right);
	inputpad[2]=CheckStatePad(configpad.down); inputpad[3]=CheckStatePad(configpad.up);


	vy+=g;

	if(CheckStatePad(configpad.left)>0)//左キーが押されていたら
	{
		ch.img+=4*2;//画像を左向きに
		if(CheckStatePad(configpad.up)>0)//上キー左キーが押されていたら
			ch.img+=4*2;//画像を左上向きに//左向き時に値が既に足されていることに注意
		if(CheckStatePad(configpad.down)>0)//下キー左キーが押されていたら
			ch.img+=4*4;//画像を左下向きに
	}
	else if(CheckStatePad(configpad.right)>0)//右キーが押されていたら
	{
		ch.img+=4*1;//画像を右向きに
		if(CheckStatePad(configpad.up)>0)//上キー右キーが押されていたら
			ch.img+=4*2;//画像を右上向きに//右向き時に値が既に足されていることに注意
		if(CheckStatePad(configpad.down)>0)//下キー右キーが押されていたら
			ch.img+=4*4;//画像を右下向きに
	}
	else if(CheckStatePad(configpad.up)>0)//上キーが押されていたら
		ch.img+=4*3;

	for(i=0;i<2;i++)//左右分
		if(inputpad[i]>0)//左右どちらかの入力があれば
			sayu_flag=1;//左右入力フラグを立てる

	for(i=2;i<4;i++)//上下分
		if(inputpad[i]>0)//上下どちらかの入力があれば
			joge_flag=1;//上下入力フラグを立てる

	if(sayu_flag==1 && joge_flag==1)//左右、上下両方の入力があれば斜めだと言う事
		naname=sqrt(2.0);//移動スピードを1/ルート2に

	if(joge_flag==1)//上下入力があればvyに値を与える
		vy=-4.0;

	if(sayu_flag==0 && joge_flag==0)//入力がない場合
		vy=0.0;


	for(int i=0;i<4;i++)
	{   //4方向分ループ
		if(inputpad[i]>0)
		{   //i方向のキーボード、パッドどちらかの入力があれば
			x=ch.x , y=ch.y;//今の座標をとりあえずx,yに格納

			mx=move_x[i];	my=move_y[i];//移動分をmx,myに代入
			if(CheckStatePad(configpad.slow)>0)
			{//低速移動なら
				mx=move_x[i]/3;	my=move_y[i]/3;//移動スピードを1/3に
			}
			x+=mx/naname , y+=my/naname;//今の座標と移動分を足す
			if(!(x<25 || x>FIELD_MAX_X-25 || y<30 || y>FIELD_MAX_Y-30))
			{//計算結果移動可能範囲内なら
				ch.x=x , ch.y=y;//実際に移動させる
			}
		}
	}
}

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

Re: 表示画像のキー入力に応じた座標変換について

#8

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

色々と問題がありますので列挙します。
基本的な問題は変数の寿命とか処理の流れなどを、ちゃんと理解していないか、あいまいな理解のままプログラムを書いているのが原因だと思います。

> どうも、vyに値がはいってないような気がします。
これは、デバッガを使ってステップ実行して変数の変化を一度実感してみたほうが良いかも知れません。

1.vyがローカル変数なので関数を抜けると値が保持されませんし、初期値がありませんので動作が不定です。
記憶クラス指定子staticでずっと値を保持する必要と初期値を与える必要があります。

2.私が「vy+=g;など一連の」と書いたのですが、vy+=g;のみが変更されたため相変わらずキーを押し続けていないとジャンプしないはずです。
move_xとmove_yの処理は分離して下さい。

3.最初に書いたはずですが、地面に着地した時の処理がありません。
最初に私が書いた内容が全て網羅されているか確認してみて下さい。下に細かく書いた書き直し版を掲載します。
これをソースコードの何処が該当するかソースコードにコメントとして書き加えて下さい。

少し付け加えてあります。(1)から(4)の番号は実行の順番とは無関係です。
(1)移動速度の変数を持ち毎回y座標に移動速度を加算します。
(2)y座標が地面より下になったら地面の上にy座標を補正して移動速度は0にJUMPフラグを無効にします。
(3)重力の方向に移動速度は毎フレーム毎に一定値の加速度を加算します。
(4)JUMPフラグを無効なときに上キーを押されたら、JUMPフラグを有効にして移動速度に初速を与えます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

まさのり

Re: 表示画像のキー入力に応じた座標変換について

#9

投稿記事 by まさのり » 13年前

ジャンプの動作を行えるようになりました。
以下のプログラムでは、上キーが入力されたら、ジャンプのフラグをたて、
y方向の速度vyに値をいれて、
ch.y+=vy , vy+=g  の処理を行い、y座標が 地面よりも下になった場合、
y座標を補正し、ジャンプのフラグを0にしています。

これで、上キーをおした時にジャンプの処理を行うようになったのですが、
現在の状態だと、上キーを押した状態のままにすると 処理を終了せず
y座標が減り続けてしまいます。(vy=-5.0より)

上キーを押したままの状態であっても、
一連のジャンプの処理が終了するまでは、次のジャンプの処理を
受け付けなくしたいのですが、どうすればよいでしょうか。

よろしくおねがいします。

コード:


#include "../include/GV.h"

double vy=-5.0;

void calc_ch()
{
	ch.cnt++;
	ch.img=(ch.cnt%24)/6;
}

void ch_move()
{
	int i,sayu_flag=0,joge_flag=0,jump_flag=1;
	double x,y,mx,my,naname=1;
	
	double g=1;
	
	double move_x[4]={-5.0,5.0,0,0},move_y[4]={0,0,0,vy};//{左,右,下,上}のスピード

	int inputpad[4]; //4つのキーパッドを配列に格納
	inputpad[0]=CheckStatePad(configpad.left); inputpad[1]=CheckStatePad(configpad.right);
	inputpad[2]=CheckStatePad(configpad.down); inputpad[3]=CheckStatePad(configpad.up);


	if(CheckStatePad(configpad.left)>0)//左キーが押されていたら
	{
		ch.img+=4*2;//画像を左向きに
		if(CheckStatePad(configpad.up)>0 && jump_flag==0)//上キー左キーが押されていたら
		{	
			ch.img+=4*2;//画像を左上向きに//左向き時に値が既に足されていることに注意
		}
		if(CheckStatePad(configpad.down)>0)//下キー左キーが押されていたら
			ch.img+=4*4;//画像を左下向きに
	}
	else if(CheckStatePad(configpad.right)>0)//右キーが押されていたら
	{
		ch.img+=4*1;//画像を右向きに
		if(CheckStatePad(configpad.up)>0 && jump_flag==0)//上キー右キーが押されていたら
		{		
			ch.img+=4*2;//画像を右上向きに//右向き時に値が既に足されていることに注意
		}
		if(CheckStatePad(configpad.down)>0)//下キー右キーが押されていたら
			ch.img+=4*4;//画像を右下向きに
	}
	else if(CheckStatePad(configpad.up)>0 && jump_flag==0)//上キーが押されていたら
		ch.img+=4*3;
	for(i=0;i<2;i++)//左右分
		if(inputpad[i]>0)//左右どちらかの入力があれば
			sayu_flag=1;//左右入力フラグを立てる

		if(inputpad[3]>0)//上の入力があれば
		{
			vy=-5.0;
			jump_flag=1;//上入力フラグを立てる
		}

	if(sayu_flag==1 && joge_flag==1)//左右、上下両方の入力があれば斜めだと言う事
		naname=sqrt(2.0);//移動スピードを1/ルート2に

	if(jump_flag==1)
	{
		vy+=g;
		ch.y+=vy;

		if(ch.y>FIELD_MAX_Y-30)
		{
				ch.y=FIELD_MAX_Y-30;
				jump_flag=0;
		}
	}


	for(int i=0;i<4;i++)
	{   //4方向分ループ
		if(inputpad[i]>0)
		{   //i方向のキーボード、パッドどちらかの入力があれば
			x=ch.x , y=ch.y;//今の座標をとりあえずx,yに格納

			mx=move_x[i];	my=move_y[i];//移動分をmx,myに代入
			if(CheckStatePad(configpad.slow)>0)
			{//低速移動なら
				mx=move_x[i]/3;	my=move_y[i]/3;//移動スピードを1/3に
			}
			x+=mx/naname , y+=my/naname;//今の座標と移動分を足す
			if(!(x<25 || x>FIELD_MAX_X-25 || y<30 || y>FIELD_MAX_Y-30))
			{//計算結果移動可能範囲内なら
				ch.x=x , ch.y=y;//実際に移動させる
			}
		}
	}
}

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

Re: 表示画像のキー入力に応じた座標変換について

#10

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

私のお願いしたことが行われていない様です。
最初に私が書いた内容が全て網羅されているか確認してみて下さい。下に細かく書いた書き直し版を掲載します。
これをソースコードの何処が該当するかソースコードにコメントとして書き加えて下さい。

これを、まずお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: 表示画像のキー入力に応じた座標変換について

#11

投稿記事 by へにっくす » 13年前

まさのり さんが書きました:上キーを押したままの状態であっても、
一連のジャンプの処理が終了するまでは、次のジャンプの処理を
受け付けなくしたいのですが、どうすればよいでしょうか。
その前にsoftyaさんの書かれたことを実施してください。
次のように・・・

コード:

//(4)JUMPフラグを無効なときに上キーを押されたら、JUMPフラグを有効にして移動速度に初速を与えます。START
    else if(CheckStatePad(configpad.up)>0 && jump_flag==0)//上キーが押されていたら
        ch.img+=4*3;
…略…
//(4)JUMPフラグを無効なときに上キーを押されたら、JUMPフラグを有効にして移動速度に初速を与えます。END
(1)(2)(3)はどこかな?
ほんとに(4)はここでいいかな?
※もちろんおかしいと思えば、ソース修正もしてくださいね。
オフトピック
人からモノ教わる時は、言われたことをきちんとやることが大切ですよ。
written by へにっくす

まさのり

Re: 表示画像のキー入力に応じた座標変換について

#12

投稿記事 by まさのり » 13年前

大変申し訳ありません。
自分なりに考えてみました。

以下のような感じでしょうか。

コード:

#include "../include/GV.h"

double vy=-10.0,g=1;

void calc_ch()
{
	ch.cnt++;
	ch.img=(ch.cnt%24)/6;
}

void ch_move()
{
	int i,sayu_flag=0,joge_flag=0,jump_flag=0;
	double x,y,mx,my,naname=1;
	
	double move_x[4]={-5.0,5.0,0,0},move_y[4]={0,0,0,vy};//{左,右,下,上}のスピード

	int inputpad[4]; //4つのキーパッドを配列に格納
	inputpad[0]=CheckStatePad(configpad.left); inputpad[1]=CheckStatePad(configpad.right);
	inputpad[2]=CheckStatePad(configpad.down); inputpad[3]=CheckStatePad(configpad.up);

	vy+=g;                                //(3)重力の方向に移動速度は毎フレーム毎に加速度を加算
	ch.y+=vy;                             //(1)移動速度の変数を持ち毎回y座標に移動速度を加算

	if(CheckStatePad(configpad.left)>0)//左キーが押されていたら
	{
		ch.img+=4*2;//画像を左向きに
		if(CheckStatePad(configpad.up)>0)//上キー左キーが押されていたら
		{	
			ch.img+=4*2;//画像を左上向きに//左向き時に値が既に足されていることに注意
		}
		if(CheckStatePad(configpad.down)>0)//下キー左キーが押されていたら
			ch.img+=4*4;//画像を左下向きに
	}
	else if(CheckStatePad(configpad.right)>0)//右キーが押されていたら
	{
		ch.img+=4*1;//画像を右向きに
		if(CheckStatePad(configpad.up)>0)//上キー右キーが押されていたら
		{		
			ch.img+=4*2;//画像を右上向きに//右向き時に値が既に足されていることに注意
		}
		if(CheckStatePad(configpad.down)>0)//下キー右キーが押されていたら
			ch.img+=4*4;//画像を右下向きに
	}
	else if(CheckStatePad(configpad.up)>0)//上キーが押されていたら
		ch.img+=4*3;

	for(i=0;i<2;i++)//左右分
		if(inputpad[i]>0)//左右どちらかの入力があれば
			sayu_flag=1;//左右入力フラグを立てる

		if(inputpad[3]>0 && jump_flag==0)                       //(4)jumpフラグが無効かつ、上の入力があればフラグを有効にし、初速を与える
		{
			vy=-10.0;
			joge_flag=1;//上入力フラグを立てる
			jump_flag=1;//ジャンプ入力フラグを立てる
		}


	if(sayu_flag==1 && joge_flag==1)//左右、上下両方の入力があれば斜めだと言う事
		naname=sqrt(2.0);//移動スピードを1/ルート2に


	if(jump_flag==1)
	{
		if(ch.y>FIELD_MAX_Y-30)                        //(2)y座標が地面より下になったら
		{
				ch.y=FIELD_MAX_Y-30;                   //(2)地面の上にy座標を補正
				vy=0.0;                                //(2)移動速度を0に
				jump_flag=0;                           //(2)jumpフラグを無効に
		}
	}


	for(int i=0;i<4;i++)
	{   //4方向分ループ
		if(inputpad[i]>0)
		{   //i方向のキーボード、パッドどちらかの入力があれば
			x=ch.x , y=ch.y;//今の座標をとりあえずx,yに格納

			mx=move_x[i];	my=move_y[i];//移動分をmx,myに代入
			if(CheckStatePad(configpad.slow)>0)
			{//低速移動なら
				mx=move_x[i]/3;	my=move_y[i]/3;//移動スピードを1/3に
			}
			x+=mx/naname , y+=my/naname;//今の座標と移動分を足す
			if(!(x<25 || x>FIELD_MAX_X-25 || y<30 || y>FIELD_MAX_Y-30))
			{//計算結果移動可能範囲内なら
				ch.x=x , ch.y=y;//実際に移動させる
			}
		}
	}
}



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

Re: 表示画像のキー入力に応じた座標変換について

#13

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

気になる所。
・私のjump処理を入れたらmove_yと関連処理はいらないんじゃないかと思います。前にそう書いたと思うのですが。
こういうのはデバッガで確認すればすぐ分かります。何度も書いてますが今まで確認してませんよね?

・型がわからないんですが、ch.yはfloatかdoubleなんですよね? intだとちゃんとジャンプ出来ません。

・vyが0以外で始まるといきなりジャンプしてしまうのでは?

・(2)に関してはjumpしていなくても処理が必要です。あるいは、(3)の処理をjump中に限定するかどちらかです。

・inputpadとかconfigpad.upとか統一性のないのが気になります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

まさのり

Re: 表示画像のキー入力に応じた座標変換について

#14

投稿記事 by まさのり » 13年前

・デバッガで確認すればすぐ分かります。
 
 申し訳ありません、デバッガでの確認のやり方がわからなく
 教えていただけないでしょうか。単純なことをお聞きしてすみません。

・型がわからないんですが、ch.yはfloatかdoubleなんですよね? intだとちゃんとジャンプ出来ません。

 型はdoubleになっています。

・vyが0以外で始まるといきなりジャンプしてしまうのでは?

 その通りでした。初期値は0に直しました。

・(2)に関してはjumpしていなくても処理が必要です。あるいは、(3)の処理をjump中に限定するかどちらかです。

 以下のプログラムのようなことで大丈夫でしょうか。

・inputpadとかconfigpad.upとか統一性のないのが気になります。

 configpadのみに統一させました。

コード:

#include "../include/GV.h"

double vy=0.0,g=1;

void calc_ch()
{
	ch.cnt++;
	ch.img=(ch.cnt%24)/6;
}

void ch_move()
{
	int i,sayu_flag=0,joge_flag=0,jump_flag=1;
	double x,y,mx,my,naname=1;
	int Green = GetColor( 0, 255, 0 );// 緑のコード
	
	double move_x[4]={-5.0,5.0,0,0},move_y[4]={0,0,0,vy};//{左,右,下,上}のスピード

	int inputpad[4]; //4つのキーパッドを配列に格納
	inputpad[0]=CheckStatePad(configpad.left); inputpad[1]=CheckStatePad(configpad.right);
	inputpad[2]=CheckStatePad(configpad.down); inputpad[3]=CheckStatePad(configpad.up);

	
	if(CheckStatePad(configpad.left)>0)//左キーが押されていたら
	{
		ch.img+=4*2;//画像を左向きに
		sayu_flag=1;//左右入力フラグを立てる
		if(CheckStatePad(configpad.up)>0 && jump_flag==0)//上キー左キーが押されていたら
		{	
			ch.img+=4*2;//画像を左上向きに//左向き時に値が既に足されていることに注意
			vy=-10.0;
			joge_flag=1;//上入力フラグを立てる
			jump_flag=1;//ジャンプ入力フラグを立てる
		}
		if(CheckStatePad(configpad.down)>0)//下キー左キーが押されていたら
			ch.img+=4*4;//画像を左下向きに
	}


	else if(CheckStatePad(configpad.right)>0)//右キーが押されていたら
	{
		ch.img+=4*1;//画像を右向きに
		sayu_flag=1;//左右入力フラグを立てる
		if(CheckStatePad(configpad.up)>0 && jump_flag==0)//上キー右キーが押されていたら
		{		
			ch.img+=4*2;//画像を右上向きに//右向き時に値が既に足されていることに注意
			vy=-10.0;
			joge_flag=1;//上入力フラグを立てる
			jump_flag=1;//ジャンプ入力フラグを立てる
		}
		if(CheckStatePad(configpad.down)>0)//下キー右キーが押されていたら
			ch.img+=4*4;//画像を右下向きに
	}


	else if(CheckStatePad(configpad.up)>0 && jump_flag==0)//上キーが押されていたら
		ch.img+=4*3;
		vy=-10.0;
		joge_flag=1;//上入力フラグを立てる
		jump_flag=1;//ジャンプ入力フラグを立てる


	//for(i=0;i<2;i++)//左右分
	//	if(inputpad[i]>0)//左右どちらかの入力があれば
	//		sayu_flag=1;//左右入力フラグを立てる


		//if(inputpad[3]>0 /*&& jump_flag==0*/)           //(4)jumpフラグが無効かつ、上の入力があればフラグを有効にし、初速を与える
		//{
		//	vy=-10.0;
		//	joge_flag=1;//上入力フラグを立てる
		//	jump_flag=1;//ジャンプ入力フラグを立てる
		//}
	


	if(sayu_flag==1 && joge_flag==1)//左右、上下両方の入力があれば斜めだと言う事
		naname=sqrt(2.0);//移動スピードを1/ルート2に


	if(jump_flag==1)
	{
		vy+=g;                                //(3)重力の方向に移動速度は毎フレーム毎に加速度を加算
	}
		ch.y+=vy;                             //(1)移動速度の変数を持ち毎回y座標に移動速度を加算
	


		//ジャンプしていなくても処理を行う

		if(ch.y>FIELD_MAX_Y-30)                        //(2)y座標が地面より下になったら
		{
				ch.y=FIELD_MAX_Y-30;                   //(2)地面の上にy座標を補正
				vy=0.0;                                //(2)移動速度を0に
				jump_flag=0;                           //(2)jumpフラグを無効に
		}
	

	DrawFormatString( 100, 100, Green, "jump_flag %d", jump_flag ); // 文字を描画
	DrawFormatString( 100, 125, Green, "sayu_flag %d", sayu_flag );
	DrawFormatString( 100, 150, Green, "joge_flag %d", joge_flag );

	for(int i=0;i<4;i++)
	{   //4方向分ループ
		if(inputpad[i]>0)
		{   //i方向のキーボード、パッドどちらかの入力があれば
			x=ch.x , y=ch.y;//今の座標をとりあえずx,yに格納

			mx=move_x[i];	my=move_y[i];//移動分をmx,myに代入
			if(CheckStatePad(configpad.slow)>0)
			{//低速移動なら
				mx=move_x[i]/3;	my=move_y[i]/3;//移動スピードを1/3に
			}
			x+=mx/naname , y+=my/naname;//今の座標と移動分を足す
			if(!(x<25 || x>FIELD_MAX_X-25 || y<30 || y>FIELD_MAX_Y-30))
			{//計算結果移動可能範囲内なら
				ch.x=x , ch.y=y;//実際に移動させる
			}
		}
	}
}


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

Re: 表示画像のキー入力に応じた座標変換について

#15

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

私の書いたデバッグ入門です。VC++のデバッガの使い方のリンクが最後にあります。
「簡単RPG講座 番外編。 デバッグ入門 • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/blog.php?u=114&b=982&c=2
ブレークポイントとステップ実行、変数の値の確認が出来るようになればプログラムの動作を実際に追いかけることが出来るようになります。

・(2)に関してはjumpしていなくても処理が必要です。あるいは、(3)の処理をjump中に限定するかどちらかです。
 以下のプログラムのようなことで大丈夫でしょうか。

両方やったのですね。
両方だと無駄なので、「(2)に関してはjumpしていなくても処理が必要です。」だけで良いですよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

まさのり

Re: 表示画像のキー入力に応じた座標変換について

#16

投稿記事 by まさのり » 13年前

デバッガの処理を行ってみました。
結果、my_move関係の処理を消去しました。

また、
jumpしていなくても(2)の処理を行う。
という処理のみにしました。

とりあえず、前回の問題点を自分なりに改善してみました。
よろしくお願いします。

コード:


#include "../include/GV.h"

double vy=0.0,g=1;

void calc_ch()
{
	ch.cnt++;
	ch.img=(ch.cnt%24)/6;
}

void ch_move()
{
	int sayu_flag=0,joge_flag=0,jump_flag=0;
	double x,y,mx,naname=1;
	int Green = GetColor( 0, 255, 0 );// 緑のコード
	
	double move_x[4]={-5.0,5.0,0,0};//x方向の{左,右,下,上}のスピード//y方向は別処理があるため省略

	int inputpad[4]; //4つのキーパッドを配列に格納
	inputpad[0]=CheckStatePad(configpad.left); inputpad[1]=CheckStatePad(configpad.right);
	inputpad[2]=CheckStatePad(configpad.down); inputpad[3]=CheckStatePad(configpad.up);

	
	if(CheckStatePad(configpad.left)>0)//左キーが押されていたら
	{
		ch.img+=4*2;//画像を左向きに
		sayu_flag=1;//左右入力フラグを立てる
		if(CheckStatePad(configpad.up)>0 && jump_flag==0)//上キー左キーが押されていたら
		{	
			ch.img+=4*2;//画像を左上向きに//左向き時に値が既に足されていることに注意
			vy=-10.0;
			joge_flag=1;//上入力フラグを立てる
			jump_flag=1;//ジャンプ入力フラグを立てる
		}
		if(CheckStatePad(configpad.down)>0)//下キー左キーが押されていたら
			ch.img+=4*4;//画像を左下向きに
	}


	else if(CheckStatePad(configpad.right)>0)//右キーが押されていたら
	{
		ch.img+=4*1;//画像を右向きに
		sayu_flag=1;//左右入力フラグを立てる
		if(CheckStatePad(configpad.up)>0 && jump_flag==0)//上キー右キーが押されていたら
		{		
			ch.img+=4*2;//画像を右上向きに//右向き時に値が既に足されていることに注意
			vy=-10.0;
			joge_flag=1;//上入力フラグを立てる
			jump_flag=1;//ジャンプ入力フラグを立てる
		}
		if(CheckStatePad(configpad.down)>0)//下キー右キーが押されていたら
			ch.img+=4*4;//画像を右下向きに
	}


	else if(CheckStatePad(configpad.up)>0 && jump_flag==0)//上キーが押されていたら
	{
		ch.img+=4*3;
		vy=-10.0;
		joge_flag=1;//上入力フラグを立てる
		jump_flag=1;//ジャンプ入力フラグを立てる
	}


	if(sayu_flag==1 && joge_flag==1)//左右、上下両方の入力があれば斜めだと言う事
	{
		naname=sqrt(2.0);//移動スピードを1/ルート2に
	}


	//ジャンプに関係なく常に動作
		vy+=g;                                //(3)重力の方向に移動速度は毎フレーム毎に加速度を加算
		ch.y+=vy;                             //(1)移動速度の変数を持ち毎回y座標に移動速度を加算
	
	if(ch.y>FIELD_MAX_Y-30)                        //(2)y座標が地面より下になったら
	{
			ch.y=FIELD_MAX_Y-30;                   //(2)地面の上にy座標を補正
			vy=0.0;                                //(2)移動速度を0に
			jump_flag=0;                           //(2)jumpフラグを無効に
	}
	
	

	DrawFormatString( 100, 100, Green, "jump_flag %d", jump_flag ); // 文字を描画
	DrawFormatString( 100, 125, Green, "sayu_flag %d", sayu_flag );
	DrawFormatString( 100, 150, Green, "joge_flag %d", joge_flag );

	for(int i=0;i<4;i++)
	{   //4方向分ループ
		if(inputpad[i]>0)
		{   //i方向のキーボード、パッドどちらかの入力があれば
			x=ch.x , y=ch.y;//今の座標をとりあえずx,yに格納

			mx=move_x[i];
			
			x+=mx/naname;//今の座標と移動分を足す//y座標の加算は上部で実行
								
			if(!(x<25 || x>FIELD_MAX_X-25 || y<30 || y>FIELD_MAX_Y-30))
			{//計算結果移動可能範囲内なら
				ch.x=x , ch.y=y;//実際に移動させる
			}
		}
	}
}



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

Re: 表示画像のキー入力に応じた座標変換について

#17

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

私には問題がないように見えますが、なにか動作に問題がありますでしょうか?
※ こちらでは動作確認できませんので、まさのりさんが調べてくれないと動作が問題ないかは分かりません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

まさのり

Re: 表示画像のキー入力に応じた座標変換について

#18

投稿記事 by まさのり » 13年前

特に問題なく、想像通りのジャンプ処理を行えました。

初心者のわたしにも、分かりやすく、
また、丁寧に教えてくださり とても助かりました。

ほんとうにありがとうございました。

閉鎖

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