キャラクターの画像を左右の絵に切り替えて、アニメさせる

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

キャラクターの画像を左右の絵に切り替えて、アニメさせる

#1

投稿記事 by samusu0905 » 9年前

キャラクターの画像を右向きの状態でアニメさせる際に、絵の切り替え速度も丁度いい感じにさせる事は出来ました。
しかし問題点が一つありまして、右向きで絵の切り替えが出来ても、左向きの状態でアニメが出来ませんでした。

コードを提示しますので、何か左向きでアニメできない原因があれば回答お願いします。

コード:

//***************************************************************
//                          プレイヤー処理
//***************************************************************
#include <stdio.h>				//C言語
#include "Def.h"				//共通定義
#include <string.h>				//文字列
#include "DxLib.h"				//DXLib
#include "Player.h"				//プレイヤー


//グローバル変数宣言------------------------
int px=150, py=320;			//画像のx,y座標


//グローバル変数参照------------------------
//アニメ状態に関するデータ
extern int p_nowNumber;		//描画する絵の番号
extern int p_animeSpeed;		//絵を切り替えるフレームの間隔
extern int p_animeCount;		//絵の切り替えからのフレーム数

//キー入力のデータ
extern char Key[256];		//キーが押されているフレーム数の格納
extern char PrevKey[256];	//前フレームのキーの入力状態
extern char KeyEdge[256];	//このフレームで新たに入力されたキーの状態

extern int flg;				//アニメフラグ

//アニメさせる画像のデータ
extern const int p_Number = 16;
extern int gp[p_Number];


//開始----------------------------------------------------------------------
void gpStart()
{
	//今は何もしない
}


//メイン--------------------------------------------------------------------
void gpMain()
{
	

	gpMove();			//移動
	gpInScreen();		//移動範囲
}


//描画----------------------------------------------------------------------
void gpDraw()
{
	//アニメカウント
	p_animeCount++;

	//アニメフラグがONで、且つp_nowNumberが6以下なら
	if( flg == 0 && p_nowNumber <= 6)
	{
		//アニメカウントがアニメ速度以上なら
		if( p_animeCount >= p_animeSpeed )
		{
			//アニメフラグがONなら
			if( flg == 0 && p_nowNumber <= 6 )
			{
				p_nowNumber = (p_nowNumber--)%p_Number;	//次の絵に切り替える
				p_animeCount = 0;			//アニメカウントを0に戻す
			}
		}

		//p_nowNumberが3なら
		if( p_nowNumber == 3 )
		{
			p_nowNumber = 7;	//p_nowNumberを7に戻す
		}
		DrawGraph(px, py, gp[p_nowNumber], TRUE );
	}
	else
	//アニメフラグがONで、且つp_nowNumberが7以下且つ4以上なら
	if( flg == 1 && p_nowNumber <= 7 && p_nowNumber >= 4 )
	{
		DrawGraph(px, py, gp[p_nowNumber], TRUE );
	}

	

	//アニメフラグがONで,且つp_nowNumberが7以上、且つp_nowNumberが11以下
	if( flg == 0 && p_nowNumber >= 7 && p_nowNumber <= 11 )
	{
		//アニメカウントがアニメ速度以上なら
		if( p_animeCount >= p_animeSpeed)
		{
			if( flg == 0 && p_nowNumber >= 7)
			p_nowNumber = (p_nowNumber--)%p_Number;	//次の絵に切り替える
			p_animeCount = 0;			//アニメカウントを0に戻す
		}

		//p_nowNumber(フレーム)が7なら
		if( p_nowNumber == 7 )
		{
			p_nowNumber = 11;		//p_nowNumber(フレーム)を10にする
		}
		DrawGraph(px, py, gp[p_nowNumber], TRUE);
	}
	else	//アニメフラグがOFFで、且つp_nowNumberが8以上、且つp_nowNumberが11以下なら
		if( flg == 1 && p_nowNumber >= 8 && p_nowNumber <= 11)
	{
		//グラフィックの描画
		DrawGraph(px, py, gp[p_nowNumber], TRUE);
	}
	DrawFormatString( 10, 10, GetColor(255, 255, 255),  "%3dフレームに1回更新", p_animeCount);
}


//移動----------------------------------------------------------------------------------------------------
void gpMove()
{
	//方向キー左を押下したら
	if(Key[KEY_INPUT_LEFT] >= 1)
	{
		flg = 0;			//アニメフラグをONにする
		p_nowNumber = 7;	//p_nownNumberを7にする
	}
	else
	{
		flg = 1;		//アニメフラグをOFFにする
		//アニメフラグがOFFで、且つp_nowNumberが4以上、且つp_nowNumberが7以下なら
		if( flg == 1 && p_nowNumber >= 4 && p_nowNumber <= 7 )p_nowNumber = 7;		//p_nowNumberを7にする
	}


	//方向キー右を押下したら
	if(Key[KEY_INPUT_RIGHT] >= 1)
	{
		flg = 0;		//アニメフラグをONにする
	}
	else
	{
		flg = 1;		//アニメフラグをOFFにする
		//アニメフラグOFFで、且つp_nowNumberが8以上、且つp_nowNumberが11以下なら
		if( flg == 1 && p_nowNumber >= 8 && p_nowNumber <= 11)p_nowNumber = 11;	//p_nowNumberを11にする
	}
}

jay
記事: 314
登録日時: 13年前
住所: 大阪市
連絡を取る:

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#2

投稿記事 by jay » 9年前

コード:

//方向キー左を押下したら
    if(Key[KEY_INPUT_LEFT] >= 1)
    {
        flg = 0;            //アニメフラグをONにする
        p_nowNumber = 7;    //p_nownNumberを7にする
    }
多分ここが原因ですね
これだと、左キーを押してる限り永遠に7番の画像が表示されそうな気がします
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#3

投稿記事 by samusu0905 » 9年前

>>Jayさん回答有難うございます。
では、条件式でflgがONなら画像を7番にするってことにすれば宜しいでしょうか?

コード:

if( Key[KEY_INPUT_LEFT] >= 1)
{
         flg = 0;
         if( flg == 0)p_nowNumber = 7;
}
訂正した結果、このようなコードになりました。

taketoshi
記事: 222
登録日時: 13年前
住所: 日本国

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#4

投稿記事 by taketoshi » 9年前

p_nowNumber変数と割り当てている画像ファイルの内容が
不明なのでコードを読んだ限りの回答ですが

コード:

        //p_nowNumber(フレーム)が7なら
        if( p_nowNumber == 7 )
        {
            p_nowNumber = 11;       //p_nowNumber(フレーム)を10にする
        }
コメントとコードの内容が合っていないです。意図した記述でしょうか?

AC

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#5

投稿記事 by AC » 9年前

p_nowNumberに対する比較や代入がいくつかおかしい気がします。
アニメさせる絵の番号は右向きと左向きのそれぞれで何番から何番かがわかりにくいので
samusu0905さんのほうから一度ご説明されたほうがいいと思います。

コード:

#define ANIME_PATTERN_NUMBER_LEFT_START	○	// 左向きパターン先頭番号
#define ANIME_PATTERN_NUMBER_LEFT_END	○	// 左向きパターン末尾番号
#define ANIME_PATTERN_NUMBER_RIGHT_START	○
#define ANIME_PATTERN_NUMBER_RIGHT_END	○
のように定義して、各判定時などはそれを使う方が自分でも後でミスを発見しやすいですし、
回答者にも伝わりやすいのではないかと思いますがいかがでしょう。

jay
記事: 314
登録日時: 13年前
住所: 大阪市
連絡を取る:

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#6

投稿記事 by jay » 9年前

直前にflgに0を入れてるからそれだと結果はなんら変わらない気がします

p_nowNumberの値を初期化するのは最初の1フレームだけでいい気がしますね
キーの入力がある限り、Key配列の値が増え続ける仕様なら
対応のKeyが1の時に初期化するのがよさそうです

別にこの方法じゃなくてもいいですが
何らかの方法で「キーが押された瞬間」を検知して
それを条件にp_nowNumberを初期化してやるといいと思います

much

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#7

投稿記事 by much » 9年前

taketoshi さんが書きました:p_nowNumber変数と割り当てている画像ファイルの内容が
不明なのでコードを読んだ限りの回答ですが

コード:

        //p_nowNumber(フレーム)が7なら
        if( p_nowNumber == 7 )
        {
            p_nowNumber = 11;       //p_nowNumber(フレーム)を10にする
        }
コメントとコードの内容が合っていないです。意図した記述でしょうか?
コードぱっと見しかしてなくて申し訳ないですけど
フラグ(flg)のON/OFFと1/0の対応も時折コメントとあってませんね

なるべくコメントは正しく書くようにしましょう
オフトピック
ちょっとした部分を訂正したときコンパイル毎に訂正するのが面倒くさいという気持ちはわかります
そういう時は「//-」とか適当なコメントで変更箇所の簡易メモを残すかといいかと思います
変更前に戻すときにどこを戻せばいいかもわかりやすいですし

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#8

投稿記事 by samusu0905 » 9年前

>>taketoshiさん
>コメントとコードの内容が合っていないです。意図した記述でしょうか?
それは、ちょっとした私のミスです。詳しくは、「p_nowNumberを11にする」です。
失礼しました。

>>ACさん
そうですね。まずは簡単に説明したほうが良さそうですね...。

>>jayさん
>何らかの方法で「キーが押された瞬間」を検知して
>それを条件にp_nowNumberを初期化してやるといいと思います
了解しました、実践してみます。
色々とアドバイスを有難うございました。

コードの詳細と仕様はまとめた上で説明させてもらいます。しばらく待っていてください。
突然説明するのは厳しいので、詳細・仕様をまとめてから書きます。

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#9

投稿記事 by samusu0905 » 9年前

>>muchさん
>コードぱっと見しかしてなくて申し訳ないですけど
>フラグ(flg)のON/OFFと1/0の対応も時折コメントとあってませんね
>なるべくコメントは正しく書くようにしましょう
今さっき、他の回答者にも同じような事を言ってくれた人が居たので私の入力ミスだということを伝えました。
コメントが多くなると、最終的にどのコードで正常に作動したのか覚えられない時があります...。
なるべく、コメントとコードを一致させるように気を付けます。

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#10

投稿記事 by samusu0905 » 9年前

コードの説明をします。
まず、p_nowNumberは11番目の画像で初期化してあります。
p_Numberは画像の枚数です。画像総数は16です。
p_animeSpeedはアニメする速度を表す変数です。そのままですけど。
p_animeCountはアニメする際に画像の絵を切り替えるカウントです。
gp[p_Number]は画像のデータです。

コード:

//アニメフラグがONなら
            if( flg == 0 && p_nowNumber <= 6 )
            {
                p_nowNumber = (p_nowNumber--)%p_Number; //次の絵に切り替える
                p_animeCount = 0;           //アニメカウントを0に戻す
            }

if( flg == 0 && p_nowNumber >= 7)
            p_nowNumber = (p_nowNumber--)%p_Number; //次の絵に切り替える
            p_animeCount = 0;           //アニメカウントを0に戻す
ここのコードのコメントですが、
上のコメントは「アニメフラグがONで、且つp_nowNumberが6以下なら」です。

下のコメントは「アニメフラグがONで、且つP_nowNumberが7以上なら」です。

書かれていないコメントはこんな感じですね。

jay
記事: 314
登録日時: 13年前
住所: 大阪市
連絡を取る:

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#11

投稿記事 by jay » 9年前

ちょっとおせっかいですけど
samusu0905 さんが書きました:

コード:

//アニメフラグがONで、且つp_nowNumberが6以下なら
    if( flg == 0 && p_nowNumber <= 6)
これってif文の内容そのままですから、態々コメントで書かなくてもいいと思うんですよね
他人のコードを読む時にコメントに欲しい情報は”要約”なのです

p_nowNumberがどの範囲にあるかで、アニメーションの種類(上下左右?)を決めているのですよね
それなら
「アニメフラグがONで、且つ左向きのアニメーションが設定されていたら
として貰えれば、読む側としては非常に助かります

if文にコメントを付けるときは条件の"内容"ではなく、何を判定しようとしているのかと言う"要約"
(他人に読んでもらう場合には)これが大事ですね


ホントにおせっかいなこと書いてすいません(苦笑)
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#12

投稿記事 by samusu0905 » 9年前

いえいえ、コメントの書き方を教えていただき有難うございます。
いつもコードのとおりにコメントを書いていたので、”要約”を書くことすらわかりませんでした。

>p_nowNumberがどの範囲にあるかで、アニメーションの種類(上下左右?)を決めているのですよね。
はい。そのとおりです。ですが、どうしても右向きの時しかアニメーションされないです..。
左向きの時でもアニメーションさせる事ができれば、ゲーム制作が進むんですが..。

AC

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#13

投稿記事 by AC » 9年前

おそれいりますがsamusu0905さん、説明をと申し上げたのは
一行一行の動作説明ではなく、アニメの内容とパターン番号の対応です。

・7から始まって4までが左向き
・11から始まって8までが右向き
でよろしいのでしょうか?

なんというか、特にp_nowNumberが7でgpDraw()に入ってきたときが面白い動作をしているような
気がします。

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#14

投稿記事 by samusu0905 » 9年前

>・7から始まって4までが左向き
>・11から始まって8までが右向き
>でよろしいのでしょうか?
そうですね。そのとおりです。色々とすみません。
添付ファイル
Player1.jpg
Player1.jpg (38.22 KiB) 閲覧数: 22876 回


mcuh

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#16

投稿記事 by mcuh » 9年前

samusu0905 さんが書きました:>>Jayさん回答有難うございます。
では、条件式でflgがONなら画像を7番にするってことにすれば宜しいでしょうか?

コード:

if( Key[KEY_INPUT_LEFT] >= 1)
{
         flg = 0;
         if( flg == 0)p_nowNumber = 7;
}
訂正した結果、このようなコードになりました。
それは要するにこういうことじゃ・・・

コード:

if( Key[KEY_INPUT_LEFT] >= 1)
{
         flg = 0;
         p_nowNumber = 7;
}
samusu0905 さんが書きました:コードの説明をします。
まず、p_nowNumberは11番目の画像で初期化してあります。
p_Numberは画像の枚数です。画像総数は16です。
p_animeSpeedはアニメする速度を表す変数です。そのままですけど。
p_animeCountはアニメする際に画像の絵を切り替えるカウントです。
gp[p_Number]は画像のデータです。
コメントを見ればそこはわかります
欲しいのは左右それぞれでどのような画像を表示したいかという情報
p_nowNumberの番号の流れだけ記述してくればオーケーです


投稿せずに放置してました申し訳ないです
samusu0905 さんが書きました:

コード:

//アニメフラグがONなら
            if( flg == 0 && p_nowNumber <= 6 )
            {
                p_nowNumber = (p_nowNumber--)%p_Number; //次の絵に切り替える
                p_animeCount = 0;           //アニメカウントを0に戻す
            }

if( flg == 0 && p_nowNumber >= 7)
            p_nowNumber = (p_nowNumber--)%p_Number; //次の絵に切り替える
            p_animeCount = 0;           //アニメカウントを0に戻す
ここのコードのコメントですが、
上のコメントは「アニメフラグがONで、且つp_nowNumberが6以下なら」です。

下のコメントは「アニメフラグがONで、且つP_nowNumberが7以上なら」です。

書かれていないコメントはこんな感じですね。
2個目のifが { } でくくられてないのは仕様でしょうか?
(インデントされているから違うとは思いますけど)
もしそうでないなら上のコードがわざわざ2つのif文に分けられている理由は何でしょうか?

自己解決
単に左右で場合わけしているという意味ですね

もうひとつ

コード:

void gpMove()
{
    //方向キー左を押下したら
    if(Key[KEY_INPUT_LEFT] >= 1)
    {
        flg = 0;            //アニメフラグをONにする
        p_nowNumber = 7;    //p_nownNumberを7にする
    }

    //(中略)

    //方向キー右を押下したら
    if(Key[KEY_INPUT_RIGHT] >= 1)
    {
        //(中略)
    }
    else
    {
        flg = 1;        //アニメフラグをOFFにする
        if( flg == 1 && p_nowNumber >= 8 && p_nowNumber <= 11)p_nowNumber = 11; 
    }
これは左キーを押しても右キーを押していなければflgが1(OFF)
になるということじゃないでしょうか


その他

・アニメフラグflgは
0でON/1でOFF
の対応でよろしいでしょうか
オフトピック
今更変えろなどとはいいませんが
一般にフラグが立ったときは1です
というのは一般にC++においては1がTRUE(=ON)で0がFALSE(=OFF)となっているからです

論理式が成り立つときも成り立てば1そうでなければ0
つまりif(1)は通ってif(0)は通らない
だからif(flg) if(!flg)という風にも表記したりもします

まあ、アニメをさせないフラグととればいいんですけどね

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#17

投稿記事 by samusu0905 » 9年前

>・アニメフラグflgは
>0でON/1でOFF
>の対応でよろしいでしょうか
そうですね。それの対応が正しいです。

>これは左キーを押しても右キーを押していなければflgが1(OFF)
>になるということじゃないでしょうか
そうですね。そうなりますね。
多分、コードを訂正しないでそのまま提示したのでそのようなコードになっております。

コード:

//方向キー左を押下したら
    if(Key[KEY_INPUT_LEFT] >= 1)
    {
        flg = 0;            //アニメフラグをONにする
        p_nowNumber = 7;    //p_nownNumberを7にする
    }


//方向キー右を押下したら
    if(Key[KEY_INPUT_RIGHT] >= 1)
    {
        flg = 0;
    }
    else
    {
        flg = 1;        //アニメフラグをOFFにする
        if( flg == 1 && p_nowNumber >= 8 && p_nowNumber <= 11)p_nowNumber = 11; 
    }
このコードが正しい仕様です。
ここに関してですが、「右キーが押されてもflgは0」にしてあります。

jay
記事: 314
登録日時: 13年前
住所: 大阪市
連絡を取る:

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#18

投稿記事 by jay » 9年前

とりあえずコメントを書き直したコードをもう1回載せて欲しいですね
そうすれば僕も他の回答者さんも考えやすくなりますので

あともう1つ気になりましたが
if文の1つ1つに

コード:

DrawGraph(px, py, gp[p_nowNumber], TRUE);
って書いてますけど、何故なんでしょう?

引数に渡してる変数は全て同じなのですから

コード:

DrawFormatString( 10, 10, GetColor(255, 255, 255),  "%3dフレームに1回更新", p_animeCount);
これの手前に1回書けば事足りる気がします

適切なコメントを書くと共に
こうやって無駄な部分を減らしていくことが、読みやすいコードを書くコツですよ

もし何か理由があってそれぞれのif文に書いてるのだとしたら
余計なことを言ってしまってすいません。
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#19

投稿記事 by samusu0905 » 9年前

>>jayさん
色々と指摘していただき有難うございます。

コード:

DrawGraph(px, py, gp[p_nowNumber], TRUE);
すみませんでした。何度も書く癖がついてました...。
確かに一度書けば済むことですね・・。
失礼しました。


>とりあえずコメントを書き直したコードをもう1回載せて欲しいですね
>そうすれば僕も他の回答者さんも考えやすくなりますので
了解しました。では訂正したコードを載せます。今から提示するコードですが、
移動処理コードのところが変わっておりますので、読むときは気を付けてください。

コード:

//***************************************************************
//                          プレイヤー処理
//***************************************************************
#include <stdio.h>				//C言語
#include "Def.h"				//共通定義
#include <string.h>				//文字列
#include "DxLib.h"				//DXLib
#include "Player.h"				//プレイヤー


//グローバル変数宣言------------------------
int px=150, py=320;				//画像のx,y座標


//グローバル変数参照------------------------
//アニメ状態に関するデータ
extern int p_nowNumber;			//描画する絵の番号
extern int p_animeSpeed;		//絵を切り替えるフレームの間隔
extern int p_animeCount;		//絵の切り替えからのフレーム数

//キー入力のデータ
extern char Key[256];			//キーが押されているフレーム数の格納
extern char PrevKey[256];		//前フレームのキーの入力状態
extern char KeyEdge[256];		//このフレームで新たに入力されたキーの状態

extern int flg;					//アニメフラグ

//アニメさせる画像のデータ
extern const int p_Number = 16;	//絵の枚数
extern int gp[p_Number];		//絵のデータ



//開始----------------------------------------------------------------------
void gpStart()
{
	//今は何もしない
}


//メイン--------------------------------------------------------------------
void gpMain()
{
	gpMove();			//移動
	gpInScreen();		//移動範囲
}


//描画----------------------------------------------------------------------
void gpDraw()
{
	//アニメカウントの加算
	p_animeCount++;

	//アニメフラグが0で、アニメ番号が7以下3以上なら
	if( flg == 0 && p_nowNumber <= 7 && p_nowNumber >= 3)
	{
		//アニメカウントがアニメ速度以上なら
		if( p_animeCount >= p_animeSpeed )
		{
			p_nowNumber = (p_nowNumber--)%p_Number;	//次の絵に切り替える
			p_animeCount = 0;			//アニメカウントを0に戻す
		}

		//アニメ番号が4なら
		if( p_nowNumber == 4 )
		{
			p_nowNumber = 7;	//アニメ番号を7に戻す
		}
	}
	else
	//アニメフラグが1で、アニメ番号が7以下3以上なら
	if( flg == 1 && p_nowNumber <= 7 && p_nowNumber <= 3 )
	{
		p_nowNumber = 7;	//アニメ番号を7にする
	}



	//アニメフラグが0で,且つアニメ番号が11で7以上なら
	if( flg == 0 && p_nowNumber <= 11 && p_nowNumber >= 7 )
	{
		//アニメカウントがアニメ速度以上なら
		if( p_animeCount >= p_animeSpeed)
		{
			p_nowNumber = (p_nowNumber--)%p_Number;	//次の絵に切り替える
			p_animeCount = 0;			//アニメカウントを0に戻す
		}

		//アニメ番号が7なら
		if( p_nowNumber == 7 )
		{
			p_nowNumber = 11;		//アニメ番号を11に戻す
		}
	}
	else
	//アニメフラグが1で、アニメ番号が11以下8以上なら
	if( flg == 1 && p_nowNumber <= 11 && p_nowNumber >= 8)
	{
		p_nowNumber = 11;	//アニメ番号を11にする
	}

	//グラフィックの描画
	DrawGraph(px, py, gp[p_nowNumber], TRUE);
	DrawFormatString( 10, 10, GetColor(255, 255, 255),  "%3dフレームに1回更新", p_animeCount);
}


//移動----------------------------------------------------------------------------------------------------
void gpMove()
{
	//方向キーの左キー、又は右キーを押下したら
	if( Key[KEY_INPUT_LEFT] || Key[KEY_INPUT_RIGHT] )
	{
		flg = 0;		//アニメフラグを0
	}
	else	//押下されてなければ
	{
		flg = 1;		//アニメフラグを1

		//アニメフラグが1で、且つアニメ番号が11以下8以上なら
		if( flg == 1 && p_nowNumber <= 11 && p_nowNumber >= 8 )
		{
			p_nowNumber = 11;	//アニメ番号を11にする
		}
		else	//アニメフラグが1で、且つアニメ番号が7以下4以上なら 
			if( flg == 1 && p_nowNumber <= 7 && p_nowNumber >= 4)
		{
			p_nowNumber = 7;	//アニメ番号を7にする
		}
	}
}
多分ですが、移動処理のコードがかなり変わってしまったと思います。
コメントだけでなく、コードも訂正したので。

much

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#20

投稿記事 by much » 9年前

コード:

	if( flg == 1 && p_nowNumber <= 7 && p_nowNumber <= 3 )
これは

コード:

	if( flg == 1 &&  p_nowNumber <= 3 )
と同義になっています
(7以下かつ3以下)

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#21

投稿記事 by samusu0905 » 9年前

すみません..。コードの入力ミスです。

コード:

 flg == 1 && p_nowNumber <= 7 && p_nowNumber >= 3 
これが正当ですね。大変失礼しました。

jay
記事: 314
登録日時: 13年前
住所: 大阪市
連絡を取る:

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#22

投稿記事 by jay » 9年前

修正どうもです。 少しは見やすくなりましたね

それで気になったところは

コード:

//アニメカウントがアニメ速度以上なら
        if( p_animeCount >= p_animeSpeed )
        {
            p_nowNumber = (p_nowNumber--)%p_Number; //次の絵に切り替える
            p_animeCount = 0;           //アニメカウントを0に戻す
        }
これも「アニメーションフラグがONの時」という条件で纏められそうですね
その後で
アニメ番号が7なら
と判定してやれば無駄もだいぶ省けそうです

後は
samusu0905 さんが書きました: >・アニメフラグflgは
>0でON/1でOFF
>の対応でよろしいでしょうか
そうですね。それの対応が正しいです。
と言うことなら
ここも

コード:

//方向キーの左キー、又は右キーを押下したら
    if( Key[KEY_INPUT_LEFT] || Key[KEY_INPUT_RIGHT] )
    {
        flg = 0;        //アニメフラグを0
    }
    else    //押下されてなければ
    {
        flg = 1;        //アニメフラグを1
 
        //アニメフラグが1で、且つアニメ番号が11以下8以上なら
        if( flg == 1 && p_nowNumber <= 11 && p_nowNumber >= 8 )
こんな感じにすれば分かりやすいかと

コード:

//方向キーの左キー、又は右キーを押下したら
    if( Key[KEY_INPUT_LEFT] || Key[KEY_INPUT_RIGHT] )
    {
        flg = 0;        //アニメフラグをONに
    }
    else    //押下されてなければ
    {
        flg = 1;        //アニメフラグをOFFに
 
        //アニメフラグがOFFで、且つアニメ番号が11以下8以上なら
        if( flg == 1 && p_nowNumber <= 11 && p_nowNumber >= 8 )
これならどっちがONでどっちがOFFかも分かりやすいです


ところでこのキー入力の仕様はキーを押している間、入力値が増え続ける仕様ですか?
(例えば左入力がある間 Key[KEY_INPUT_LEFT] が 1 2 3 4 と増えて行き、放すと 0 になる)

だとすれば"キーを押した瞬間"を判定するのは"入力値が1の時"なので簡単なのですが・・・


それとも単に 0 か 1 かで入力があるか無いかを判定するだけでしょうか?
だとしたら直前の入力状態を保持して判定したいところです
その場合は"直前が 0 (入力なし) で、且つ今は 1 (入力がある)" という条件にすれば
"キーを押した瞬間"を判定できると思います

このあたりを踏まえて109行目以降の移動の部分を修正してみてください
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#23

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

コードの最初のほうで

コード:

#define FLG_ON 0
#define FLG_OFF 1
のようにON/OFFに対応する値を定義し、それをコード中で適切に使用すれば、さらにわかりやすくなると思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#24

投稿記事 by samusu0905 » 9年前

>ところでこのキー入力の仕様はキーを押している間、入力値が増え続ける仕様ですか?
>(例えば左入力がある間 Key[KEY_INPUT_LEFT] が 1 2 3 4 と増えて行き、放すと 0 になる)
>だとすれば"キーを押した瞬間"を判定するのは"入力値が1の時"なので簡単なのですが・・・
そうですね。キーを押している間、入力値が増える仕様です。

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#25

投稿記事 by samusu0905 » 9年前

flgですが、

コード:

enum
{
     ON,
     OFF,
};
このように定義した上で、flgを0,ON/1,OFFにしてます。

much

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#26

投稿記事 by much » 9年前

samusu0905 さんが書きました:flgですが、

コード:

enum
{
     ON,
     OFF,
};
このように定義した上で、flgを0,ON/1,OFFにしてます。
で、前の部分からそのON/OFFの表記に変更したってことでよろしいのでしょうか?

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#27

投稿記事 by samusu0905 » 9年前

定義した時に、ONは0/OFFは1になっているので、ここはON/OFFの表記でも、0/1の表記でも構いません。
皆さんが分かりやすければそれで結構です。

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#28

投稿記事 by samusu0905 » 9年前

できれば、みけさん以外の人が考えたコードを提示してほしいです。
正解問わずお願いします。

taketoshi
記事: 222
登録日時: 13年前
住所: 日本国

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#29

投稿記事 by taketoshi » 9年前

提示されたコードを書き直し、不明なインプット部分をjayさんへの返答で想像から補い
画像をダウンロードしてプロジェクトを組み直し、動かしてみました。
上手く動かないという症状としては、右を押しても左を押しても、
右向きにキャラクタがアニメーションする事が確認できましたが、抱えている問題はこれですか?

DrawFormatString(0,100,RGB(255,255,255),"%d",p_nowNumber);
このコードを何処かに追加してp_nowNumberが目的に沿った形で変化しているか確認してみてください
► スポイラーを表示

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#30

投稿記事 by samusu0905 » 9年前

>>taketoshiさん
>右向きにキャラクタがアニメーションする事が確認できましたが、抱えている問題はこれですか?
右向きにキャラクターがアニメーションしますが、左向きにはキャラクターがアニメーションしない感じです。

>p_nowNumberの初期値に左向きの画像添え字番号を加えると一瞬だけ左になりますが
>即座に右向きの初期化コードが実行され、そのあとは延々と右を向いています。
>左向きの初期化コードを通過していない様子ですね。
私の場合、左向きの画像添え字番号の初期設定ではなく、右向きの画像添え字番号しか初期設定してなかったので、左キー入力で左向きにしても、直ぐに右向きになってしまうことが一度ありました。

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#31

投稿記事 by samusu0905 » 9年前

>DrawFormatString(0,100,RGB(255,255,255),"%d",p_nowNumber);
>このコードを何処かに追加してp_nowNumberが目的に沿った形で変化しているか確認してみてください
そのコードを描画処理に追加して分かったことがあります。右向きの場合はp_nowNumberはカウントされてますが、左向きの場合だとp_nowNumberはカウントされませんでした。やはり、左向きの画像添え字番号は通過されてませんでした。

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#32

投稿記事 by samusu0905 » 9年前

向きの初期設定って、左向きも右向きも変数の宣言時以外で設定できないんですか?
例えば、キー入力によって初期設定するとかできませんか?

jay
記事: 314
登録日時: 13年前
住所: 大阪市
連絡を取る:

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#33

投稿記事 by jay » 9年前

キーを押した瞬間を検知して、そこで初期化すればいい
と言ったのですが、伝わって無かったみたいですね。

ちょっと本筋から外れた指摘が多すぎたかな? 申し訳ないです。


仰るとおり
キー入力で初期化してやればいいと思います

キーを押している間入力値が増えて行くということは
つまり、キーを押した瞬間だけに入力値が 1 になるわけですよね

コード:

    
    //方向キーの左キー、又は右キーの入力があれば
    if( Key[KEY_INPUT_LEFT] > 0 || Key[KEY_INPUT_RIGHT] > 0 )
    {
        flg = 0;        //アニメフラグをON
        
        //押した瞬間なら、アニメ番号を初期化
    	if( Key[KEY_INPUT_LEFT] == 1 )
    	{
    		//左用のアニメ番号を設定
    		
    	}
    	else if ( Key[KEY_INPUT_RIGHT] == 1 )
    	{
    		//右用のアニメ番号を設定
    		
    	}
    }
    else    //押下されてなければ
    {
        flg = 1;        //アニメフラグをOFF
    }

こんな感じでいけると思います
足りない部分はご自分でどうぞ
オフトピック
先日、(お名前は忘れましたが)誰かの日記で騒ぎ(?)があったみたいで
答えに近いソースコードを載せるのはちょっと気が引けますね(苦笑)
最後に編集したユーザー jay on 2014年9月15日(月) 21:53 [ 編集 1 回目 ]
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#34

投稿記事 by samusu0905 » 9年前

>キーを押した瞬間を検知して、そこで初期化すればいい
>と言ったのですが、伝わって無かったみたいですね。
確かそのように仰っていましたね。失礼しました。伝わっていましたが、移動処理でどのようにコードを書けばいいのか
良くわからなかったので。
コードの提示有難うございます。さすがにそのようなコードまでは思いつきませんでした..。

>こんな感じでいけると思います
>足りない部分はご自分でどうぞ
了解です。実践してみます。実践しながら詰まったら、また質問したりする事が多くなりますが、宜しくお願いします。

ISLe()

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#35

投稿記事 by ISLe() » 9年前

キーは左右反対方向でも同時に入力できることを忘れないようにしましょう。
ゲームコントローラーでもヘタれてくるとあります。

左右同時に押す→右を押したまま左を離す、とどうなるかトレースしてみてください。

個人的にキーを押した瞬間に依存しないようにするのをお勧めします。

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#36

投稿記事 by samusu0905 » 9年前

>>ISLeさん
>左右同時に押す→右を押したまま左を離す、とどうなるかトレースしてみてください。
結果は右向きになりました。また、左を押したまま右を離すと左向きになりました。

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#37

投稿記事 by samusu0905 » 9年前

jayさんの書いたコードを書いて色々と試したのですが、どういう訳か右向きの時にも左向きの時にもアニメしなくなってしまいました...。アニメしないところで苦戦しております....。

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#38

投稿記事 by samusu0905 » 9年前

>>jayさん
出来れば、表示処理のコードも移動処理コードのように穴埋めする形で提示して貰えないでしょうか?
ヒントかアドバイスだけ書いて貰えれば有り難いです。そこから先は自分でさらに考えますので。
お願いします。

jay
記事: 314
登録日時: 13年前
住所: 大阪市
連絡を取る:

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#39

投稿記事 by jay » 9年前

まさかの名指しですかw
とはいえあんなに穴の少ない穴埋め問題を作っても
あんまりsamusu0905さんの経験値にならない気もしますね(苦笑)

とりあえず、ただ上手くできないと書かれてもこちらも困りますからね
どこが上手くいっていないのか、もう少し具体的に書いてみてはどうでしょう?
(多分アニメ番号を更新している所だとは思いますが)

それともうひとつ
もう1度taketoshiさんが仰っているようにp_nowNumberの動きを追ってみて
それを教えて欲しいですね。
ついでに何か気づいたことがあれば一緒に教えてもらえるとなお良しです。
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#40

投稿記事 by samusu0905 » 9年前

返事遅れてすみません...。
了解しました。もう一度、p_nowNumberを見直してみます。
それで気づいたことを書き込みます。

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#41

投稿記事 by samusu0905 » 9年前

もう一度見直しというのは、表示処理から移動処理まで見直したほうがいいですよね?

taketoshi
記事: 222
登録日時: 13年前
住所: 日本国

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#42

投稿記事 by taketoshi » 9年前

見直すというのは、p_nowNumber変数が貴方の書いたコード通りに変化していくかを「確認する」という意味です。
その結果に従ってそれぞれの関数を、きちんと動くように書き直しましょう。

一つアドバイスを。
きちんと設計してゆけば表示関数を見直す必要はありません。
何故ならば、移動処理の関数でp_nowNumberを計算し、表示関数はその変数を使って表示するだけなので
描写関数には変数の初期化やカウントアップ等の計算といった処理は一切入りません。

DrawGraph(x,y,gp[p_nowNumber],true)

の1行で済んでしまいます。

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#43

投稿記事 by samusu0905 » 9年前

なるほど、そうゆうことですか。

描画関数にはDrawGraph()関数を書くだけで十分ってことですね。
移動処理にp_nowNumberを計算する処理を書くってことですね。

了解しました。

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#44

投稿記事 by samusu0905 » 9年前

途中まで指示通りに書いて、あとは自分で考えて書きました。

コード:

//***************************************************************
//                          プレイヤー処理
//***************************************************************
#include <stdio.h>				//C言語
#include "Def.h"				//共通定義
#include <string.h>				//文字列
#include "DxLib.h"				//DXLib
#include "Player.h"				//プレイヤー


//グローバル変数宣言------------------------
int px=150, py=320;				//プライヤーのx,y座標

//画像のデータ
int p_nowNumber;			//描画する絵の添え字番号
int p_animeSpeed = 4;			//絵を切り替えるフレームの間隔
int p_animeCount = 0;			//絵の切り替えからのフレーム数



//グローバル変数参照------------------------

//キー入力のデータ
extern char Key[256];			//キーが押されているフレーム数の格納
extern int flg;					//アニメフラグ

//アニメさせる画像のデータ
extern const int p_Number = 16;	//絵の枚数
extern int gp[p_Number];		//絵のデータ
extern int SceneMode;



//開始----------------------------------------------------------------------
void gpStart()
{
	//今は何もしない
}


//メイン---------------------------------------------------------------------------------------------------
void gpMain()
{
	gpMove();			//移動
	gpInScreen();		//移動範囲

	//シーンモードが1なら
	if( SceneMode == 1)
	{
		p_nowNumber = 11;		//画像添え字番号を11に戻す
	}
}


//描画-----------------------------------------------------------------------------------------------------
void gpDraw()
{
	DrawGraph(px, py, gp[p_nowNumber], TRUE);
	DrawFormatString( 10, 10, GetColor(255, 255, 255),  "%3dフレームに1回更新", p_animeCount);
	DrawFormatString(0, 100, GetColor(255,255,255), "%d", p_nowNumber);
}


//移動-----------------------------------------------------------------------------------------------------
void gpMove()
{
	p_animeCount++;		//アニメカウントを加算
	//方向キーの右キー、又は左キーの入力があれば
	if( Key[KEY_INPUT_RIGHT] > 0 || Key[KEY_INPUT_LEFT] > 0 )
	{
		flg = 0;		//アニメフラグをON

		//押した瞬間なら、アニメ番号を初期化
		//右キーが押下されて1なら
		 if( Key[KEY_INPUT_RIGHT] == 1)
		{
			//アニメカウントがアニメ速度以上なら
			if( p_animeCount >= p_animeSpeed)
			{
				//アニメフラグが0で、且つアニメ番号が11以下8以上なら
				if( flg == 0 && p_nowNumber <= 11 && p_nowNumber >= 8 )
				{
					p_nowNumber = (p_nowNumber--)%p_Number;			//次の画像に切り替える
					p_animeCount = 0;								//アニメカウントを0に戻す
				}

				//アニメ番号が7なら
				if( p_nowNumber == 7 )
				{
					//アニメ番号を11にする
					p_nowNumber = 11;
				}
			}
			//px += 4;
		}
		//左キーが押下されて1なら
		else if( Key[KEY_INPUT_LEFT] == 1)
		{
			//アニメカウントがアニメ速度以上なら
			if( p_animeCount >= p_animeSpeed)
			{
				//アニメフラグが0で、且つアニメ番号が7以下4以上なら
				if( flg == 0 && p_nowNumber <= 7 && p_nowNumber >= 4)
				{
					p_nowNumber = (p_nowNumber--)%p_Number;			//次の画像に切り替える
					p_animeCount = 0;								//アニメカウントを0に戻す
				}

				//アニメ番号が3なら
				if( p_nowNumber == 3)
				{
					//アニメ番号を7にする
					p_nowNumber = 7;
				}
			}
			//px -= 4;
		}
	}
	//押下されてなければ
	else if( Key[KEY_INPUT_RIGHT] < 1 || Key[KEY_INPUT_LEFT] < 1)
	{
		flg = 1;		//アニメフラグをOFF

		if( flg == 1 && Key[KEY_INPUT_LEFT] == 0 )
		{
			p_nowNumber = 7;
		}
		else 
		if( flg == 1 && Key[KEY_INPUT_RIGHT] == 0 )
		{
			p_nowNumber = 11;
		}
	}
}
このコードを実行したら、最初のアニメ番号の初期設定が左向きになってしまいました。
多分、jayさんがNo:39で言っていた「アニメ番号を更新する所」で問題が発生した可能性があります。
どこがどのようにいけないのか、までは分からないです。
このコードで「ここが可笑しい」と思うところなどあれば指摘をお願いします。
また、可笑しいと感じたところに対して、何が可笑しかったのか説明文を加えてもらえるともっと有り難いです。
そうすればこちらの方でも改善しやすいです。

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#45

投稿記事 by samusu0905 » 9年前

多分、移動処理コードのところで何か問題があるのではないかと思います。
(ただの個人予想です)

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#46

投稿記事 by samusu0905 » 9年前

提示したコードは左右どちらもアニメさせる事に成功しております。
後は、初期設定を右向きに設定して、更に左右ともにアニメ番号の切り替え(アニメーション)ができれば解決しそうです。

具体的に言うと、キャラクターの向きの初期設定を右向きにするところが出来ておりません。

taketoshi
記事: 222
登録日時: 13年前
住所: 日本国

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#47

投稿記事 by taketoshi » 9年前

キャラクターの状態を初期化する関数を作りそこで変数を右向きに初期化してください。
初期化関数はキャラクター生成時に一度だけ実行する関数です。

dxライブラリ特有のwhileループ以前に記述すれば一度だけ実行する処理にすることができます。
whileループ内に含めても良いですが、状態遷移を分けて一度だけ通るように工夫しないといけません。

提示していただいたコードの中身は精査していませんが
記述したコードが動いているのならばそれでよろしいのではないでしょうか。
オフトピック
ただ、私ならば内部に上下左右正面、どの向いているのか状態遷移を記録する変数を設けそれによって処理を切り替えます。
なぜならば添え字番号で向き・及び初期化のタイミングを記述すると後で意味が解らなくなるためです。

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#48

投稿記事 by samusu0905 » 9年前

>>taketoshiさん
回答有難うございます。
>キャラクターの状態を初期化する関数を作りそこで変数を右向きに初期化してください。
>初期化関数はキャラクター生成時に一度だけ実行する関数です。
了解しました。では関数をまた作ります。

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#49

投稿記事 by samusu0905 » 9年前

>>taketoshiさん
>初期化関数はキャラクター生成時に一度だけ実行する関数です。
このように述べておりますが、DXLibの場合キャラクターが生成されていることが分かるコードってどんなコードですか?
詳しく教えてもらえないでしょうか?

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#50

投稿記事 by samusu0905 » 9年前

色々とご迷惑をお掛けしてすみません....。

jay
記事: 314
登録日時: 13年前
住所: 大阪市
連絡を取る:

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#51

投稿記事 by jay » 9年前

なんだか難しく考えすぎているように思えますね

DrawGraph関数を使っているなら
その時に描画するための画像をLoadGraphなりLoadDivGraphなりで
1回だけ事前に画像を読み込んでいるはずですよね?
その時に一緒に変数を初期化してやればいいと思います。

一度だけ実行する初期化というのは、そう言うメインループの前に行う下準備全般のことだと思えばいいですよ
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#52

投稿記事 by samusu0905 » 9年前

>DrawGraph関数を使っているなら
>その時に描画するための画像をLoadGraphなりLoadDivGraphなりで
>1回だけ事前に画像を読み込んでいるはずですよね?
>その時に一緒に変数を初期化してやればいいと思います。

jayさんの言っていることって、

コード:

                p_nowNumber = 11;
		//BMP画像のメモリの分割読み込み
		LoadDivGraph("画像/Player1.bmp", p_Number, 4, 4, 70, 50, gp);
こんな感じのコードでしょうか?
p_nowNumberは描画する画像の番号を表していますので、この場合は11が右向きとなってます。
上のコードで実行しても何も変わらなかったです。

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#53

投稿記事 by samusu0905 » 9年前

上のコードで間違いってありますか?
一応、Mainソースファイルで画像の読み込みをしております。
描画処理はPlayerソースファイルで書いてます。

taketoshi
記事: 222
登録日時: 13年前
住所: 日本国

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#54

投稿記事 by taketoshi » 9年前

初期化に関してはjayさんに補足していただいた通りです。ありがとうございます。

情報が足りないのでエスパー全開の回答ですが。
右向きに設定しても右を向かないということは、初期化後にどこかで変数を上書きしているのでしょう。
右を向かなくて困っているという事ですが、今現在はどっちを向いているんですか?

>>LoadDivGraph("画像/Player1.bmp", p_Number, 4, 4, 70, 50, gp);
アップロードされていた画像は、Player1.jpgです。

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#55

投稿記事 by samusu0905 » 9年前

>>taketoshiさん
回答有難うございます。

>右向きに設定しても右を向かないということは、初期化後にどこかで変数を上書きしているのでしょう。
そうなりますかね。多分上書きされてしまっているかと思われます。
問題はどこで上書きされているかですね。

>右を向かなくて困っているという事ですが、今現在はどっちを向いているんですか?
今現在は実行すると左向き状態になってます。

jay
記事: 314
登録日時: 13年前
住所: 大阪市
連絡を取る:

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#56

投稿記事 by jay » 9年前

書き換えられているのはココでしょうね

コード:

//押下されてなければ
    else if( Key[KEY_INPUT_RIGHT] < 1 || Key[KEY_INPUT_LEFT] < 1)
    {
        flg = 1;        //アニメフラグをOFF
 
        if( flg == 1 && Key[KEY_INPUT_LEFT] == 0 )
        {
            p_nowNumber = 7;
        }
        else 
        if( flg == 1 && Key[KEY_INPUT_RIGHT] == 0 )
        {
            p_nowNumber = 11;
        }
    }
このコードだと、キー入力が無い場合は無条件でアニメ番号は7になるでしょう

あとついでに、上のほうで散々注意されてますが
flgに1を入れた直後にif文で「flgは1か?」って聞いても仕方ないですよ
だって直前に1を入れてますからね。
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#57

投稿記事 by samusu0905 » 9年前

>>jayさん
回答有難うございます。

>あとついでに、上のほうで散々注意されてますが
>flgに1を入れた直後にif文で「flgは1か?」って聞いても仕方ないですよ
>だって直前に1を入れてますからね。
言われてみれば確かにそうですね....。
自分の過ちでこのようなコードになってしまったことを深く反省します。

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#58

投稿記事 by samusu0905 » 9年前

何となくですが、自分がやりたかった事が分かってきました。
キャラクターにモーションさせる際に、いつどんな条件でモーションさせたいのか。
それは、キー入力されたときだけモーションさせればいいわけですね。
jayさんやtaketoshiさんが何度も説明していた事ですね。
ようやく自分でも気づきました。
後もう少しで出来そうです。
アルゴリズムが少しずつですが分かってきました。

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#59

投稿記事 by samusu0905 » 9年前

No58で「書くべきコードが何となくわかりました」このように述べたのは本当です。
ただ、完璧に分かったわけではないので、いまだに躓いています。
右キーを押下した瞬間にアニメさせるってのは理解しました。
残るは左右キーを押下していない状態で、右向きならp_nowNumber = 11左向きならp_nowNumber = 7、
の処理コードを組み立てればいいのですが、そこのコードの処理がまだわかりません。
ここが出来れば左右キーを押下した状態としていない状態に分けることが出来ますが。

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#60

投稿記事 by samusu0905 » 9年前

今日書き込んだコードを提示します。
段々と求めていた動きになってきました。

コード:

//開始-----------------------------------------------------------------------------------------------------
void gpStart()
{
	if( SceneMode == 1 || SceneMode == 2){
		p_nowNumber = 11;
	}
}

//メイン---------------------------------------------------------------------------------------------------
void gpMain()
{
	gpMove();			//移動
	gpInScreen();		//移動範囲
}


//描画-----------------------------------------------------------------------------------------------------
void gpDraw()
{
	DrawGraph(px, py, gp[p_nowNumber], TRUE);
	DrawFormatString( 10, 10, GetColor(255, 255, 255),  "%3dフレームに1回更新", p_animeCount);
	DrawFormatString(0, 100, GetColor(255,255,255), "%d", p_nowNumber);
}


//移動-----------------------------------------------------------------------------------------------------
void gpMove()
{
	p_animeCount++;		//アニメカウントを加算

	//方向キーの右キー、又は左キーの入力があれば
	if( Key[KEY_INPUT_RIGHT] > 0 || Key[KEY_INPUT_LEFT] > 0 )
	{
		flg = 0;		//アニメフラグをON
		//右キーが押下されて1なら
		if( Key[KEY_INPUT_RIGHT] == 1)
		{
			//アニメカウントがアニメ速度以上なら
			if( p_animeCount >= p_animeSpeed)
			{
				if( p_nowNumber <= 11 && p_nowNumber >= 8){

					p_nowNumber = (p_nowNumber--)%p_Number;			//次の画像に切り替える
					p_animeCount = 0;								//アニメカウントを0に戻す

				}
				//アニメ番号が7なら
				if( p_nowNumber == 7 )
				{
					//アニメ番号を11にする
					p_nowNumber = 11;
				}
			}
			//px += 4;
		}
		//左キーが押下されて1なら
		else if( Key[KEY_INPUT_LEFT] == 1)
		{
			//アニメカウントがアニメ速度以上なら
			if( p_animeCount >= p_animeSpeed)
			{

				p_nowNumber = (p_nowNumber--)%p_Number;			//次の画像に切り替える
				p_animeCount = 0;								//アニメカウントを0に戻す	

				//アニメ番号が3なら
				if( p_nowNumber == 3)
				{
					//アニメ番号を7にする
					p_nowNumber = 7;
				}
			}
			//px -= 4;
		}
	}
	//押されてなければ
	else if( Key[KEY_INPUT_RIGHT] < 1 || Key[KEY_INPUT_LEFT] < 1)
	{
		flg = 1;	//アニメフラグをOFFにする

		//アニメフラグが11以下8以上且つ右キーの入力がなければ
		if( p_nowNumber <= 11 && p_nowNumber >= 8 && Key[KEY_INPUT_RIGHT] == 0)
		{
			p_nowNumber = 11;		//アニメ番号を11にする
		}
		else
			//アニメフラグが7以下且つ4以上且つ左キーの入力がなければ
		if( p_nowNumber <= 7 && p_nowNumber >= 4 && Key[KEY_INPUT_LEFT] == 0)
		{
			p_nowNumber = 7;
		}
	}
}

この後が問題です。左右にアニメさせる事はできましたが、右向きの状態で左キーを押すとアニメ番号が7にならず11から減少されて、7になったら左向きになるようになっています。
この移動処理コードで、左キーを押下したら左向きになるようなコードってどんなのがありますか?
jayさんでもtaketoshiさんでも構いませんので、 ヒントだけ下さい。答えはいらないです。

taketoshi
記事: 222
登録日時: 13年前
住所: 日本国

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#61

投稿記事 by taketoshi » 9年前

左キーの入力をした時に変数を強制的に7に初期化する処理を挟みましょう。

コード:

//右向きの処理番号ならば
        if( p_nowNumber <= 11 && p_nowNumber >= 8 )
        {
            p_nowNumber = 7;//左向きに強制設定 
        }
こんな感じでしょうか。

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

Re: キャラクターの画像を左右の絵に切り替えて、アニメさせる

#62

投稿記事 by samusu0905 » 9年前

>>taketoshiさん
回答有難うございます。
そのコードを追加したら解決しました!色々と有難うございます。

コード:

//移動-----------------------------------------------------------------------------------------------------
void gpMove()
{
	p_animeCount++;		//アニメカウントを加算

	//方向キーの右キー、又は左キーの入力があれば
    if( Key[KEY_INPUT_RIGHT] > 0 || Key[KEY_INPUT_LEFT] > 0 )
    {
        flg = 0;        //アニメフラグをON
        //右キーが押下されて1なら
        if( Key[KEY_INPUT_RIGHT] == 1)
        {
            //アニメカウントがアニメ速度以上なら
            if( p_animeCount >= p_animeSpeed)
            {
                if( p_nowNumber <= 11 && p_nowNumber >= 8 )
				{
                    p_nowNumber = (p_nowNumber--)%p_Number;         //次の画像に切り替える
                    p_animeCount = 0;                               //アニメカウントを0に戻す
                }
                //アニメ番号が7なら
                if( p_nowNumber == 7 )
                {
                    //アニメ番号を11にする
                    p_nowNumber = 11;
                }
            }
            //px += 4;
        }
        //左キーが押下されて1なら
        else if( Key[KEY_INPUT_LEFT] == 1)
        {
			//右向きの処理番号ならば
			if( p_nowNumber <= 11 && p_nowNumber >= 8)
			{
				p_nowNumber = 7;		//左向きに強制的に変更
			}
			//アニメカウントがアニメ速度以上なら
			if( p_animeCount >= p_animeSpeed)
			{
				if( p_nowNumber <= 7 && p_nowNumber >= 4)
				{
					p_nowNumber = (p_nowNumber--)%p_Number;         //次の画像に切り替える
					p_animeCount = 0;                               //アニメカウントを0に戻す    
				}

				//アニメ番号が3なら
				if( p_nowNumber == 3)
				{
					//アニメ番号を7にする
					p_nowNumber = 7;
				}
			}
            //px -= 4;
        }
    }
    //押されてなければ
    else if( Key[KEY_INPUT_RIGHT] < 1 || Key[KEY_INPUT_LEFT] < 1)
    {
        flg = 1;    //アニメフラグをOFFにする
 
        //アニメフラグが11以下8以上且つ右キーの入力がなければ
        if( p_nowNumber <= 11 && p_nowNumber >= 8 && Key[KEY_INPUT_RIGHT] == 0)
        {
            p_nowNumber = 11;       //アニメ番号を11にする
        }
        else
            //アニメフラグが7以下且つ4以上且つ左キーの入力がなければ
        if( p_nowNumber <= 7 && p_nowNumber >= 4 && Key[KEY_INPUT_LEFT] == 0)
        {
            p_nowNumber = 7;
        }
    }
}
このようにコードを書いたら出来ました。

閉鎖

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