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

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

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

#1

投稿記事 by 時雨 » 14年前

プログラミングの館を見ながら作っています。キャラの移動はできたんですが歩かせるのがうまくいきません何かヒントでもお願いします。

コード:

#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]);
}

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

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

#2

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

どの様な問題があるのでしょうか?曖昧な「うまくいきません」では無く具体的にお願いします。
現状だと同じアニメコマ常に表示しているようです。

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

時雨

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

#3

投稿記事 by 時雨 » 14年前

返信ありがとうございます。
進むことに歩く画像をいれたいんです。

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

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

#4

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

プログラミングの館の絵だとアニメのコマは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()が呼び出された回数を数える。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

時雨

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

#5

投稿記事 by 時雨 » 14年前

プログラムの館のものを利用しましたが歩かせることできました。

コード:


#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]);
}

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

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

#6

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

解決チェックを外しておきますが、このコードはバグっています。
0,1,2,3,3,1,2,3,3,1,2,3・・・
とコマが再生されるはずです。ちょっとガクツキませんか?

【補足】
あとインデントは正確に行いましょう。バグの元になります。
も忘れないで下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

peot

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

#7

投稿記事 by peot » 14年前

もう解決しているのかもしれませんが、
コードを見て気になった箇所を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] );
	}
}

閉鎖

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