DXライブラリでキャラアニメーションを作る

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

DXライブラリでキャラアニメーションを作る

#1

投稿記事 by Fake » 11年前

初めまして!
今、2D横スクロールアクションゲームを制作しているのですが、様々なWEBサイトを参考にしたり、それを自分で考えて改良したりしてきましたが、アニメーションがどうしてもうまくいきませんでした・・・
もしよろしければ考え方の違いや、改良点、参考ソースコードがありましたら、是非教えてもらいたいと思い書き込ませていただきました!
キャラの分割枚数は横3縦2の計6体となっております

コード:

#include "DxLib.h"

/************************
変数や関数、構造体の指定
************************/
#define SCREEN_WIDTH	(640)			//画面の横の大きさ
#define SCREEN_HEIGT	(480)			//画面の縦の大きさ
#define MAP_PIXEL_WIDTH	(1280)			//マップの横のピクセル数
#define MAP_PIXEL_HEIGHT (480)			//マップの縦のピクセル数
#define CHIP_SIZE	(32)				//チップサイズ
#define MAP_WIDTH	(MAP_PIXEL_WIDTH / CHIP_SIZE)	//マップの横の大きさ
#define MAP_HEIGHT	(MAP_PIXEL_HEIGHT / CHIP_SIZE)  //マップの縦の大きさ

typedef struct
{
	int x,y,img;
}ch_t;


int chip[4];						//マップチップの指定
int image[6];						//グラフィックハンドルの指定
int PlayerX , PlayerY ;				//プレイヤー変数
int JumpPower ;						//ジャンプ用変数
int CountX = 0;						//アニメーション用カウント変数
int ix = 0,result = 0;				//アニメーション用添字変数
float move = 1.0f;


int Map[15] [40] =					//マップデータ
{
	{2,2,2,2,2,2,2,2,2,2 , 2,2,2,2,2,2,2,2,2,2 , 2,2,2,2,2,2,2,2,2,2 , 2,2,2,2,2,2,2,2,2,2},
	{2,2,2,2,2,2,2,2,2,2 , 2,2,2,2,2,2,2,2,2,2 , 2,2,2,2,2,2,2,2,2,2 , 2,2,2,2,2,2,2,2,2,2},
	{2,2,2,2,2,2,2,2,2,2 , 2,2,2,2,2,2,2,2,2,2 , 2,2,2,2,2,2,2,2,2,2 , 2,2,2,2,2,2,2,2,2,2},
	{2,2,2,2,2,2,2,2,2,2 , 2,2,2,2,3,2,2,2,2,2 , 2,2,2,2,2,2,2,2,2,2 , 2,2,2,2,2,2,2,2,2,2},
	{2,2,2,2,2,2,2,2,2,2 , 2,2,2,2,2,2,2,2,2,2 , 2,2,2,2,2,2,2,2,2,2 , 2,2,2,2,2,2,2,2,2,2},
	{2,2,2,2,2,2,2,2,2,2 , 2,2,2,2,2,2,2,2,2,2 , 2,2,2,2,2,2,2,2,2,2 , 2,2,2,2,2,2,2,2,2,2},
	{2,2,2,2,2,2,2,2,2,2 , 2,2,2,2,2,2,2,2,2,2 , 2,2,2,2,2,2,2,2,2,2 , 2,2,2,2,2,2,2,2,2,2},
	{2,2,2,2,2,2,2,2,2,2 , 2,2,2,2,2,2,2,2,2,2 , 2,2,2,2,2,2,2,2,2,2 , 2,2,2,2,2,2,2,2,2,2},

	{2,2,2,2,2,2,2,2,2,2 , 2,2,2,2,2,2,2,2,2,2 , 2,2,2,2,2,2,1,2,2,2 , 2,2,2,2,2,2,2,2,2,2},
	{2,2,2,2,2,2,3,2,2,2 , 2,2,2,2,2,2,2,2,2,2 , 2,2,2,2,2,2,2,2,2,2 , 2,2,2,2,2,2,2,2,2,2},
	{2,2,2,2,2,2,2,2,2,2 , 2,2,2,2,2,2,2,2,2,2 , 2,2,2,2,2,2,2,2,2,2 , 2,2,2,2,2,2,2,2,2,2},
	{1,1,1,1,1,1,1,1,1,1 , 1,1,1,1,1,1,1,1,1,1 , 1,1,1,1,1,1,1,1,1,1 , 1,1,1,1,1,1,1,1,1,1},
	{0,0,0,0,0,0,0,0,0,0 , 0,0,0,0,0,0,0,0,0,0 , 0,0,0,0,0,0,0,0,0,0 , 0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0 , 0,0,0,0,0,0,0,0,0,0 , 0,0,0,0,0,0,0,0,0,0 , 0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0 , 0,0,0,0,0,0,0,0,0,0 , 0,0,0,0,0,0,0,0,0,0 , 0,0,0,0,0,0,0,0,0,0},
};
/*****************
ゲームの基本処理
*****************/
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
						 LPSTR lpCmdLine, int nCmdShow )
{
	int Key ;
	ChangeWindowMode(true);

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

	
	SetDrawScreen( DX_SCREEN_BACK ) ;		// 描画先画面を裏画面にセット

	// グラフィックのロード
	LoadDivGraph("CharGraph6.png",6,3,2,32,64,image);		//キャラクターの描画
	LoadDivGraph("MapGraph1.png",4,4,1,32,32,chip);			//MAPの描画

	
	PlayerX = 50 ;			// キャラクターの初期データをセット
	PlayerY = 200 ;
	JumpPower = 0 ;

	/********************
	 ここからループ開始
	 *******************/
	while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
	{
		
		Key = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ;	// キー入力取得

		if(( Key & PAD_INPUT_RIGHT ) || ( Key & PAD_INPUT_LEFT ))
		{
			move = 1.0f;
		}

		if( Key & PAD_INPUT_RIGHT )// →で右に進む
		{
			PlayerX += (int)4*move ;
		}
		if( Key & PAD_INPUT_LEFT )// ←で左に進む
		{
			PlayerX -= (int)4*move ;	
		}

		if( Key & PAD_INPUT_RIGHT )		//→キーが押されていて、カウントが0より大きい場合
		{								//カウントを0にしてから1ずつ足していく
			if(CountX < 0)
				CountX = 0;
				++CountX;
		}
		if( Key & PAD_INPUT_LEFT )		//←キーが押されていて、カウントが0より小さい場合
		{								//カウントを0にしてから1ずつ引いていく
			if(CountX > 0)
				CountX = 0;
				--CountX;
		}
		
		ix = abs(CountX)%30/10;			//添字用変数にカウント数から添字を求め代入する

		if(CountX > 0)					//添字用変数にキャラの先頭添字番号を足してループ範囲を指定する(右向き)
		{
			ix += 0;
			result = ix;
		}
		else if(CountX < 0)				//添字用変数にキャラの先頭添字番号を足してループ範囲を指定する(左向き)
		{
			ix += 3;
			result = ix;
		}

		if((Key & PAD_INPUT_LEFT) != 1 &&(Key & PAD_INPUT_RIGHT) != 1)	//何も押してない時はカウント数を0に戻し、初期化
		{
			CountX = 0;
		}


		
		PlayerY -= JumpPower ;	// 落下処理

		
		JumpPower -= 1 ;		// 落下加速度を加える

		
		if( PlayerY > 300 )		// もし地面についていたら止まる
		{
			PlayerY = 300 ;
			JumpPower = 0 ;
		}

		
		if( ( Key & PAD_INPUT_A ) && PlayerY == 300 ) JumpPower = 20 ;
		// ジャンプボタンを押していて、地面についていたらジャンプ
		
		ClearDrawScreen() ;	// 画面を初期化する

			for(int y = 0; y<15; y++)					//マップの描画
		{											//縦15ループ
			for(int x = 0; x < 20; x++)				//横20ループ
			{
				DrawGraph(x * 32, y * 32, chip [Map[y][x]],TRUE);
			}
		}

		DrawGraph( PlayerX , PlayerY , image[result] , TRUE ) ;	// プレイヤーを描画する
		
		ScreenFlip() ;		// 裏画面の内容を表画面に反映させる
	}
/****************
ゲームの終了処理
****************/
	DxLib_End() ;				// DXライブラリ使用の終了処理

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

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

Re: DXライブラリでキャラアニメーションを作る

#2

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

はじめまして。
アニメが出来ないとのことですが、根本的なことが分かっていないので出来ない可能性がありますので、キー入力関係なしで右向きアニメパターンを繰り返すプログラムは書けますでしょうか?
不必要な部分は取っ払った状態でお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Fake

Re: DXライブラリでキャラアニメーションを作る

#3

投稿記事 by Fake » 11年前

ご返信ありがとうございます!
右向きのアニメーションパターンのみを考えてみたところ、自分のコードの

コード:

		if((Key & PAD_INPUT_LEFT) !=1 &&(Key & PAD_INPUT_RIGHT)!=1)	//何も押してない時はカウント数を0に戻し、初期化
		{
			CountX = 0;
		}
の部分が本来、

コード:

		if((Key & PAD_INPUT_LEFT) &&(Key & PAD_INPUT_RIGHT))	//何も押してない時はカウント数を0に戻し、初期化
		{
			CountX = 0;
		}
このようになっていないといけないことに気づき、直したらアニメーションが左右ともにできました!
このことに適格に気づかせていただき本当にありがとうございます!
この調子で、スクロールや当たり判定など進めていこうと思います!

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

Re: DXライブラリでキャラアニメーションを作る

#4

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

ちょっと心配なのはアニメーションの処理がやたら複雑な事です。
もっと簡単にならないか考えられたほうが良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Fake

Re: DXライブラリでキャラアニメーションを作る

#5

投稿記事 by Fake » 11年前

わかりました。
今は少し時間におされているのでやっと理解できたこれで行きたいと思います。
他の処理が出来次第また戻ってきて改良を加えたいと思います!

閉鎖

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