ページ 11

キャラを歩かせたいです。

Posted: 2012年3月23日(金) 13:48
by 時雨
プログラミングの館を見ながら作っています。キャラの移動はできたんですが歩かせるのがうまくいきません何かヒントでもお願いします。

コード:

#include "DxLib.h"
#include "Player.h"
#include "Keyboard.h"
#include "Field.h"

// このファイル内でしか使えないグローバル変数
static int m_Image[16]; //画像ハンドル
static int m_y;     //y座標
static int m_x;
static int W,SPD,W2;
static int muki_flag,walk_flag;

// 初期化をする
void Player_Initialize(){
        LoadDivGraph("画像/キャラクタ10.png", 16, 4, 4, 32, 32, m_Image);
        m_y = 320;
		m_x = 160;
		SPD=1;
		W=FIELD_MAX_X;//600
		W2=FIELD_MAX_Y;//448
		muki_flag=3;
		walk_flag=0;
}

// 動きを計算する
void Player_Calc(){
if(m_x%1==0 && m_y%1==0){
	walk_flag=1;

	if(Keyboard_Get(KEY_INPUT_UP)>0)
		muki_flag=0;
	
	else if(Keyboard_Get(KEY_INPUT_LEFT)>0)
		muki_flag=1;

	else if(Keyboard_Get(KEY_INPUT_DOWN)>0)
		muki_flag=2;

	else if(Keyboard_Get(KEY_INPUT_RIGHT)>0)
		muki_flag=3;
	else 
		walk_flag=0;
	
if(walk_flag==1){
	if(muki_flag==0)
		m_y--;
	else if(muki_flag==1)
		m_x--;
	else if(muki_flag==2)
		m_y++;
	else if(muki_flag==3)
		m_x++;
if(m_x>W)
	m_x--;
else if(m_x<0)
	m_x++;
else if(m_y>W2)
	m_y--;
else if(m_y<16)
	m_y++;

}
}
}

// 描画する
void Player_Graph(){
if(muki_flag==0)
   DrawGraph(m_x, m_y, m_Image[0], TRUE);
else if(muki_flag==1)
	DrawGraph(m_x, m_y, m_Image[4], TRUE);
else if(muki_flag==2)
	DrawGraph(m_x, m_y, m_Image[8], TRUE);
else if(muki_flag==3)
	DrawGraph(m_x, m_y, m_Image[12], TRUE);
}

// 終了処理をする
void Player_Finalize(){
        DeleteGraph(m_Image[16]);
}

Re: キャラを歩かせたいです。

Posted: 2012年3月23日(金) 13:58
by softya(ソフト屋)
どの様な問題があるのでしょうか?曖昧な「うまくいきません」では無く具体的にお願いします。
現状だと同じアニメコマ常に表示しているようです。

あとインデントは正確に行いましょう。バグの元になります。

Re: キャラを歩かせたいです。

Posted: 2012年3月23日(金) 14:45
by 時雨
返信ありがとうございます。
進むことに歩く画像をいれたいんです。

Re: キャラを歩かせたいです。

Posted: 2012年3月23日(金) 15:17
by softya(ソフト屋)
プログラミングの館の絵だとアニメのコマは0~3の4コマの繰り返しです。
m_Image[0]など固定で与えていますが、移動の時間経過に合わせて m_Image[0]、 m_Image[1]、 m_Image[2]、 m_Image[3]と切り替える必要があります。
m_Image[4]だと m_Image[4~7]ですね。
さて、どうすれば良いと思いますか?

アイデア
(1)座標でアニメコマを決める。
(2)Player_Calc()が呼び出された回数を数える。

Re: キャラを歩かせたいです。

Posted: 2012年3月25日(日) 15:19
by 時雨
プログラムの館のものを利用しましたが歩かせることできました。

コード:


#include "DxLib.h"
#include "Player.h"
#include "Keyboard.h"
#include "Field.h"

// このファイル内でしか使えないグローバル変数
static int m_Image[16]; //画像ハンドル
static int m_y;     //y座標
static int m_x;
static int W,SPD,W2;
static int muki_flag,walk_flag;

// 初期化をする
void Player_Initialize(){
        LoadDivGraph("画像/キャラクタ10.png", 16, 4, 4, 32, 32, m_Image);
        m_y = 320;
		m_x = 160;
		SPD=1;
		W=FIELD_MAX_X;//600
		W2=FIELD_MAX_Y;//448
		muki_flag=3;
		walk_flag=0;
}

// 動きを計算する
void Player_Calc(){
if(m_x%1==0 && m_y%1==0){
	walk_flag=1;

	if(Keyboard_Get(KEY_INPUT_UP)>0)
		muki_flag=0;
	
	else if(Keyboard_Get(KEY_INPUT_LEFT)>0)
		muki_flag=1;

	else if(Keyboard_Get(KEY_INPUT_DOWN)>0)
		muki_flag=2;

	else if(Keyboard_Get(KEY_INPUT_RIGHT)>0)
		muki_flag=3;
	else 
		walk_flag=0;
	
if(walk_flag==1){
	if(muki_flag==0)
		m_y--;
	else if(muki_flag==1)
		m_x--;
	else if(muki_flag==2)
		m_y++;
	else if(muki_flag==3)
		m_x++;
if(m_x>W)
	m_x--;
else if(m_x<0)
	m_x++;
else if(m_y>W2)
	m_y--;
else if(m_y<16)
	m_y++;

}
}
}

// 描画する
void Player_Graph(){
	m_Image[12]=m_Image[(m_x%32)/8+12];
	m_Image[8]=m_Image[(m_y%32)/8+8];
	m_Image[0]=m_Image[(m_y%32)/8+0];
	m_Image[4]=m_Image[(m_x%32)/8+4];
if(muki_flag==0)
   DrawGraph(m_x, m_y, m_Image[0], TRUE);
else if(muki_flag==1)
	DrawGraph(m_x, m_y, m_Image[4], TRUE);
else if(muki_flag==2)
	DrawGraph(m_x, m_y, m_Image[8], TRUE);
else if(muki_flag==3)
	DrawGraph(m_x, m_y, m_Image[12], TRUE);
}

// 終了処理をする
void Player_Finalize(){
        DeleteGraph(m_Image[16]);
}

Re: キャラを歩かせたいです。

Posted: 2012年3月25日(日) 15:25
by softya(ソフト屋)
解決チェックを外しておきますが、このコードはバグっています。
0,1,2,3,3,1,2,3,3,1,2,3・・・
とコマが再生されるはずです。ちょっとガクツキませんか?

【補足】
あとインデントは正確に行いましょう。バグの元になります。
も忘れないで下さい。

Re: キャラを歩かせたいです。

Posted: 2012年3月25日(日) 18:43
by peot
もう解決しているのかもしれませんが、
コードを見て気になった箇所を2つだけ指摘させてください。

ひとつめ、28行目のIF文は何を判定しようとしたのでしょうか?
整数を1で割った余りが0以外になる事はないので、この判定は必要ないですよね。

ふたつめ、終了処理(80行目)で

コード:

DeleteGraph(m_Image[16])
としていますが、これでは配列の16番目の画像だけを削除している事になるので、
終了処理としては不完全になっています。
FOR文などを使って全ての配列を削除するようにしましょう。

以下で私なり改変してみました。

コード:

#include "DxLib.h"
#include "Player.h"
#include "Keyboard.h"
#include "Field.h"

//定数
#define IMAGE_MAX	16	//画像の分割最大数
#define TIMING		10	//アニメの速さ
#define PATTERN		4	//アニメの枚数
#define SPEED		1	//プレイヤーの移動速度

// このファイル内でしか使えないグローバル変数
static int m_Image[IMAGE_MAX];	//画像ハンドル
static int m_x;			//x座標
static int m_y;			//y座標
static int SPD;			//移動量
static int muki_flag;	//向き
static int walk_flag;	//歩き
 
// 初期化をする
void Player_Initialize()
{
	LoadDivGraph("画像/キャラクタ10.png", IMAGE_MAX, 4, 4, 32, 32, m_Image);
	m_y = 320;
	m_x = 160;
	SPD = SPEED;
	muki_flag = 8;
	walk_flag = 0;
}

// 動きを計算する
void Player_Calc()
{
	//キーボードによる移動処理
	walk_flag = 0;
	if( Keyboard_Get(KEY_INPUT_UP) > 0 ){
		walk_flag = 1;
		muki_flag = 0;
		 m_y -= SPD;
	}
	if( Keyboard_Get(KEY_INPUT_DOWN) > 0 ){
		walk_flag = 1;
		muki_flag = 8;
		 m_y += SPD;
	}	
	if( Keyboard_Get(KEY_INPUT_LEFT) > 0 ){
		walk_flag = 1;
		muki_flag = 4;
		 m_x -= SPD;
	}
	if( Keyboard_Get(KEY_INPUT_RIGHT) > 0 ){
		walk_flag = 1;
		muki_flag = 12;
		 m_x += SPD;
	}
	//画面内移動補正
	if(m_x > FIELD_MAX_X ) m_x = FIELD_MAX_X;//600
	if(m_x < 0           ) m_x = 0;
	if(m_y > FIELD_MAX_Y ) m_y = FIELD_MAX_Y;//448
	if(m_y < 16          ) m_y = 16;
}

// 描画する
void Player_Graph()
{
	static int timer = 0;//アニメの速さ用
	static int count = 0;//アニメのコマ送り用

	//歩きアニメ処理
	if(walk_flag == 1 ){
		if(( timer%TIMING ) == 0 ) count = ( count+1 )%PATTERN ;
	}else{
		count = 0;//止まっている時は1枚目を表示する
	}
	timer++;

	//歩きアニメ表示
	int motion = muki_flag + count;
	DrawGraph(m_x, m_y, m_Image[motion], TRUE);
}

// 終了処理をする
void Player_Finalize()
{
	for(int i = 0; i < IMAGE_MAX; i++ ){
		DeleteGraph( m_Image[i] );
	}
}