DXLibでキャラクターにアニメーションさせながら移動させる方法について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
samusu0905
記事: 336
登録日時: 10年前

DXLibでキャラクターにアニメーションさせながら移動させる方法について

#1

投稿記事 by samusu0905 » 9年前

件名にあるとおり、キャラクターを普通に描画させる処理は自作関数で記入済みです。
ですが、キャラクターが歩くアニメーションしながら移動するという処理を書くところで困っています。
当たり前の事ですが、その処理も自作関数で書きたいと考えてます。
しかし、歩くアニメーションしながら移動させる処理をどのように書けばいいのか分かりません・・。

コード:

#include <stdio.h>			//C言語
#include <stdlib.h>			//C言語
#include <string.h>			//文字列
#include <iostream>			//C++言語
#include "DxLib.h"			//DirectXライブラリ

int Key[256];			// キーが押されているフレーム数を格納する

// キーの入力状態を更新する
int gpUpdateKey(){

	char tmpKey[256]; // 現在のキーの入力状態を格納する
	GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
	//キーの入力状態をループする
	for( int i=0; i<256; i++ ){
		if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
			Key[i]++;     // キーの入力を加算
		}
		else // 押されていなければ
		{
			Key[i] = 0;   // 0にする
		}
	}
	return 0;
}

int px=150, py=320, p[16];
int i;


//移動
void gpMove()
{
	if( Key[ KEY_INPUT_RIGHT ] >= 1 ){
				px+=10;
		}
	if( Key[ KEY_INPUT_DOWN  ] >= 1 ){
		py+=10;
		}
	if( Key[ KEY_INPUT_LEFT  ] >= 1 ){
		px-=10;
		}
	if( Key[ KEY_INPUT_UP    ] >= 1 ){
		py-=10;
		}
}


//描画
void gpDraw()
{	
	//ロードしたグラフィックのアニメーション
	i=8;

	//画像を消して描画
	while( ClearDrawScreen()==0 && gpUpdateKey() == 0)
	{
		LoadGraphScreen(0, 0, "画像/Title.jpg", TRUE);
		//BMP画像のメモリの分割読み込み
		LoadDivGraph("画像/Player1.bmp", 16, 4, 4, 70, 50, p);
		//グラフィックの描画(「DrawGraph」)
		DrawGraph(px, py, p[i], TRUE);

		//アニメーションパターンナンバーを変更
		i++;

		//iが画像の11番目なら
		if( i == 11)
			i=8;	//iを8に戻す

		//一定時間待つ
		WaitTimer( 150 );
	}
}


//メイン処理
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
             LPSTR lpCmdLine, int nCmdShow )
{
        ChangeWindowMode(TRUE),
			DxLib_Init();
		
        // while(裏画面を表画面に反映, メッセージ処理, 画面クリア)
       while( ScreenFlip()==0 && ProcessMessage()==0 && gpUpdateKey()==0){
		   gpMove();
		   gpDraw();
	}
	DxLib_End(); // DXライブラリ終了処理
	return 0;
}
一応コード載せます。
自作関数のgpDraw関数がキャラクターを通常描画させる処理です。
もう一つの自作関数で、gpMove関数がキャラクターを移動させる処理です。
書き方が分からないと言えばいいでしょうか。
ヒントやアドバイスをお願いします。

アバター
海Sea
記事: 102
登録日時: 13年前
住所: 大阪
連絡を取る:

Re: DXLibでキャラクターにアニメーションさせながら移動させる方法について

#2

投稿記事 by 海Sea » 9年前

一番単純な方法は
Moveのなかでdrow関数を呼ぶことです
押したキーによって
表示させる画像を変更すれば良いでしょう

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: DXLibでキャラクターにアニメーションさせながら移動させる方法について

#3

投稿記事 by みけCAT » 9年前

gpMove関数→キーが押されているなら、「アニメをする」フラグをON、そうでなければ「アニメをする」フラグをOFF
gpDraw関数→ループや画像の読み込みはせずに「アニメをする」フラグが立っていればアニメを描画、そうでなければ静止画を描画
という方針でどうでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

samusu0905
記事: 336
登録日時: 10年前

Re: DXLibでキャラクターにアニメーションさせながら移動させる方法について

#4

投稿記事 by samusu0905 » 9年前

>>海Seaさん・みけCATさん回答有難うございます。
>一番単純な方法は
>Moveのなかでdrow関数を呼ぶことです
>押したキーによって
>表示させる画像を変更すれば良いでしょう

>gpMove関数→キーが押されているなら、「アニメをする」フラグをON、そうでなければ「アニメをする」フラグを>OFF
>gpDraw関数→ループや画像の読み込みはせずに「アニメをする」フラグが立っていればアニメを描画、そうでなけ>>れば静止画を描画
>という方針でどうでしょうか?

お二人の方法をそれぞれ試してみます。
まず海Seaさんの処理方法を実行してみます。
その次にみけCATさんの処理を実行してみます。

アバター
海Sea
記事: 102
登録日時: 13年前
住所: 大阪
連絡を取る:

Re: DXLibでキャラクターにアニメーションさせながら移動させる方法について

#5

投稿記事 by 海Sea » 9年前

正攻法はみけさんのやり方ですね
せっかく処理をわけたのに、
わたしのやり方だと無駄ばかりなので

samusu0905
記事: 336
登録日時: 10年前

Re: DXLibでキャラクターにアニメーションさせながら移動させる方法について

#6

投稿記事 by samusu0905 » 9年前

>>海Seaさん回答有難うございます。
いえいえ、そんな事ないですよ。海Seaさんのやり方も悪くないかと思います。
みけさんのやり方は少し面倒ですが、プログラミング知識はとても身に付きますよ。

>わたしのやり方だと無駄ばかりなので
まあ、確かに一見無駄な処理には見えますが、慣れれば、そうゆう処理もいいと思います。
では、みけさんの処理が成功例の文ということで、みけさんの処理を実践させていただきます。

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

Re: DXLibでキャラクターにアニメーションさせながら移動させる方法について

#7

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

samusu0905 さんが書きました:>>海Seaさん回答有難うございます。
いえいえ、そんな事ないですよ。海Seaさんのやり方も悪くないかと思います。
みけさんのやり方は少し面倒ですが、プログラミング知識はとても身に付きますよ。
あまりにひどいので一言。
えーと、海Seaさんに対して上から目線で書かれていますが海Seaさんの書いた内容は初心者なら、そういうやり方も仕方ないでしょうと言うことです。
問題が有るのは海Seaさんも十々承知の上での提案ですので勘違いなさらないように。
つまり、samusu0905さんには難しいだろうと思われての提案です。
samusu0905 さんが書きました: >わたしのやり方だと無駄ばかりなので
まあ、確かに一見無駄な処理には見えますが、慣れれば、そうゆう処理もいいと思います。
では、みけさんの処理が成功例の文ということで、みけさんの処理を実践させていただきます。
全然良くないですよ。
「Moveのなかでdrow関数を呼ぶ」をあえて超初心者以外が使う理由はないです。

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

samusu0905
記事: 336
登録日時: 10年前

Re: DXLibでキャラクターにアニメーションさせながら移動させる方法について

#8

投稿記事 by samusu0905 » 9年前

みけさんの言う
>ループや画像の読み込みはせずに
と有りますが、画像の読み込みなしではキャラクターを描画できませんよ。
多分ですが、gpDraw関数で読み込みはせずに、int WINAPI WinMain()関数で画像の読み込みをする
ってことですか?
良く分からないので、実践してみます。

samusu0905
記事: 336
登録日時: 10年前

Re: DXLibでキャラクターにアニメーションさせながら移動させる方法について

#9

投稿記事 by samusu0905 » 9年前

>>softyaさん
回答有難うございます。
失礼しました。私自信もかなり上から目線で言ってしまったことを反省します。

samusu0905
記事: 336
登録日時: 10年前

Re: DXLibでキャラクターにアニメーションさせながら移動させる方法について

#10

投稿記事 by samusu0905 » 9年前

色々と実践した結果出来ました。

コード:

//ロードしたグラフィックのアニメーション、フラグ
int i=11, flg=OFF;

//移動
void gpMove()
{
	//キーの右が押されていれば
	if( Key[ KEY_INPUT_RIGHT ] >= 1 ){
		flg = ON;		//フラグをON
		px+=10;
	}
	//押されていなければ
	else{
		flg = OFF;
	}//フラグをOFF


	//〃の左が押されていれば
	if( Key[ KEY_INPUT_LEFT  ] >= 1 ){
		//flg = ON;		//フラグをON
		//フラグがONなら
		//if(flg == ON)
		{
			px-=10;
		}
	}
	/*//押されていなければ
	else{
		flg = OFF;		//フラグをOFF
	}*/


	//〃の下が押されていれば
	/*if( Key[ KEY_INPUT_DOWN  ] >= 1 ){
		flg = ON;		//フラグをON
		//フラフがONなら
		if(flg == ON)
		{
			py+=10;
		}
	}
	//押されていなければ
	else{
		flg = OFF;		//フラグをOFF
	}


	//〃の上が押されていれば
	if( Key[ KEY_INPUT_UP    ] >= 1 ){
		flg = ON;		//フラグをON
		//フラグがONなら
		if(flg == ON)
		{
			py-=10;
		}
	}
	//押されていなければ
	else{
		flg = OFF;		//フラグをOFF
	}*/
}

//描画
void gpDraw()
{	
	LoadGraphScreen(0, 0, "画像/Title.jpg", TRUE);
	
	//アニメするフラグがONなら
	if( flg == ON)
	{
		//ロードしたアニメーションナンバーを変更
		i--;
		//グラフィックの描画(「DrawGraph」)
		DrawGraph(px, py, p[i], TRUE);

		//iが画像の8番目なら
		if( i == 8)
			i=11;	//iを11に戻す
		//一定時間待つ
		WaitTimer( 30 );
	}
	else
	{
		//グラフィックの描画(「DrawGraph」)
		DrawGraph(px, py, p[i], TRUE);
		i = 11;
		//一定時間待つ
		WaitTimer(30);
	}
}
こんな感じになりました。
gpMove()関数内の//は、キャラクターを右移動させたときにアニメさせる処理だけをまず先にやろうと思い、コメント化しました。(気にしないようにお願いします)

みけさんの書いた文通りにプログラムを組み込んだ結果、
キャラクターが右移動した際に、アニメをさせる処理は出来ました。
簡潔に説明すると、

iをアニメさせるための変数とし、
宣言と同時に分割画像総数の内の一部だけを初期値として設定しました。(i=11;)
変数iは関数の一番上の方に宣言しておきました。
後は、みけさんが書いた通りに実践しました。
gpMove()関数では、キーが押されたら、アニメさせるフラグをONにして、移動させる。
押されていなければ、アニメさせるフラグをOFFにする。
gpMove()関数はこんな方針で出来ました。

gpDraw()関数では、アニメさせるフラグがONなら、
変数iの初期値11を-1ずつ減らして、11~8までを描画する。
変数iが i==8ならiを初期値に戻す
WaitTimer()関数で、アニメモーションの速度調整を行う。(約30秒に一回の早さでアニメモーションさせる)
アニメさせるフラグがOFFなら、キャラクターを変数iの初期値に戻す。
ここでもWaitTimer()関数を利用する。(約30秒に一回の早さでアニメモーションさせる)

以上です。
私はうまくプログラムが動作してくれたので、満足しています。
みけさんの説明も海さんの説明も参考になりました。
有難うございます!!

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

Re: DXLibでキャラクターにアニメーションさせながら移動させる方法について

#11

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

そうですね。
見事にやっては行けないことを4つやっているので、ぜひ「ゲームプログラミングの館」をちゃんと勉強して頂きたいです。

「補足資料.11章 書いてはいけない4つの処理」
http://dixq.net/g/h_11.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

samusu0905
記事: 336
登録日時: 10年前

Re: DXLibでキャラクターにアニメーションさせながら移動させる方法について

#12

投稿記事 by samusu0905 » 9年前

すみませんでした。というか、書いてはいけない4つの処理ってあったんですね。
真面目に知らなかったです。あると思いませんでした。確認すらしてなかったです。これからは注意しますね。
書いてはいけない処理を教えていただき有難うございます。

閉鎖

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