キャラが正しくアニメーションされない。

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

キャラが正しくアニメーションされない。

#1

投稿記事 by keito94 » 3年前

キャラのアニメーションを動かすテストをしているのですが、移動しようとすると、キャラが消えてしまいます。
コードは以下のとおりです。
Main.cpp(画像読み込みの部分のみ)

コード:

//画像は添付ファイルにあります。
LoadDivGraph("自作キャラ.bmp", 32, 8, 4, 16, 16, PlayerGh);
Anim.h(一部のみ)

コード:

#pragma once
#include <vector>
using namespace std;

const int MLOOP = -1;
const int MSTOP = -2;
const int MEND = -3;

enum MOTION_NAME{
	STAND,WALK,JUMPUP,JUMPDOWN,LAND
};

class CMotion {
public:
	int No;
	int Time;
};

class CAnim {
public:
	int AnimIndex, MotionType, PrevMotion;
	float AnimCnt;
	CAnim(const CMotion* motion, int col, int row);
	vector<vector<CMotion>> WMotion;
	vector<CMotion> VMotion;
	void Animation(float anim_spped);
	void MotionChange(int motion);
	int GetAnimNo() const { return WMotion[MotionType][AnimIndex].No; }
};
Anim.cpp

コード:

#include "Anim.h"

CAnim::CAnim(const CMotion* motion, int col, int row)
	:AnimIndex(0),MotionType(0), AnimCnt(0.0F),PrevMotion(-1){
	for (int i = 0; i < col; i++) {
		for (int j = 0; j < row; j++) {
			VMotion.push_back(motion[i*row + j]);
		}
		WMotion.push_back(VMotion);
		VMotion.clear();
	}
}

void CAnim::Animation(float anim_spped) {
	AnimCnt += anim_spped;
	if (AnimCnt > WMotion[MotionType][AnimIndex].Time) {
		AnimCnt = 0;
		AnimIndex++;
		if (WMotion[MotionType][AnimIndex].No == MLOOP) {
			AnimIndex = 0;
		}
		else if (WMotion[MotionType][AnimIndex].No == MEND) {
			MotionType = STAND;
			AnimIndex = 0;
		}
		else if (WMotion[MotionType][AnimIndex].No == MSTOP) {
			AnimIndex--;
		}
		else {

		}
	}
}

void CAnim::MotionChange(int motion) {
	//モーション変更の特殊条件
	//ジャンプモーションから立ちモーションへの直接移行はない
	if ((MotionType == JUMPUP || MotionType == JUMPDOWN || MotionType == LAND || MotionType == STAND) &&
		motion == STAND)	return;
	if (MotionType == JUMPUP && motion == WALK) return;
	AnimIndex = 0;
	AnimCnt = 0;
	MotionType = motion;
}
Player.cpp(一部のみ)

コード:

CPlayer::CPlayer(float x, float y)
	:CMover(x, y, -8, -8, 8, 8),Dir(FALSE),JumpCount(0),GroundFlag(false),Grav(0.5F),MaxJump(false) {
	CMotion temp[MOTION_MAX][ANIM_MAX]=
	{
		//上から順に
		//{STAND,WALK,JUMPUP,JUMPDOWN,LAND}
		{{0,3},{1,3} ,{2,6},{1,3}, {0,3} ,{MLOOP,0}},//立ち
		{{3,3},{4,3},{0,3},{5,3},{6,3},{7,3} ,{MLOOP,0}},//歩き
		{{0,3},{8,3},{9,3},{10,15},{MSTOP,0}},//ジャンプ上り
		{{11,3},{12,3}, {13,3},{MSTOP,0}},//ジャンプ下り
		{{15,3},{16,3}, {17,3}, {MEND,0}},//着地
	};
	int col = sizeof(temp) / sizeof(temp[0]);
	int row = sizeof(temp) / sizeof(temp[0][0]);
	AnimObj = new CAnim(&temp[0][0], col, row);
}

bool CPlayer::Move() {
	Game->OffSetPlayer();
	JoyPad.Update();
	if (JoyPad.Get(PAD_INPUT_RIGHT)) {
		AnimObj->MotionChange(WALK);
		Dir = FALSE;
		VX = 3.0F;
	}
	else if (JoyPad.Get(PAD_INPUT_LEFT)){
		AnimObj->MotionChange(WALK);
		Dir = TRUE;
		VX = -3.0F;
	}
	else {
		AnimObj->MotionChange(STAND);
		VX = 0;
	}
//省略。
	AnimObj->Animation(0.4F);
//デバック用コンソール。
	printf("アニメモーション番号:%d\n", AnimObj->MotionType);
	printf("アニメフレーム番号:%d\n",AnimObj->GetAnimNo());
	return true;
}

void CPlayer::Draw() {
	DrawRotaGraph((int)(Game->ViewX), (int)(Game->ViewY), 1.0, 0.0, Game->PlayerGh[AnimObj->GetAnimNo()], FALSE, Dir);
}
デバック用コンソール(移動モーションの時)

コード:

アニメモーション番号:1
アニメフレーム番号:-8
アニメフレーム番号が-8と怪しい数値を吐き出しています。
デバックをすればいいということはわかっているのですが、どこに原因があるのかを教えてくれませんか?
添付ファイル
添付画像.zip
(721 バイト) ダウンロード数: 37 回
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

たいちう
記事: 418
登録日時: 9年前

Re: キャラが正しくアニメーションされない。

#2

投稿記事 by たいちう » 3年前

> デバックをすればいいということはわかっているのですが、
> どこに原因があるのかを教えてくれませんか?

期待されている回答ではないと思うけど。
どこに原因があるのかを調べるのがデバッグです。
(ついでに、デバックではなく、デバッグです。)
以前も指摘したように、この題材はあなたにはまだ早いと思います。
強いて言うなら、それが原因です。

あせらず言語の基本から勉強することをお勧めします。
その過程でデバッグの能力も培われることでしょう。

たいちう
記事: 418
登録日時: 9年前

Re: キャラが正しくアニメーションされない。

#3

投稿記事 by たいちう » 3年前

補足です。

小学生が微積分を勉強しているのを想像してみてください。
熱心に「この問題はどのように解くの?」と質問を繰り返します。
教わった通りにその問題を解けるようになったとしても、
ほとんど理解できていないため、少しでも違う問題は解けません。

まずは算数から、次に中学の数学から勉強するようにアドバイスしませんか?

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

Re: キャラが正しくアニメーションされない。

#4

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

keito94 さんが書きました:デバックをすればいいということはわかっているのですが、どこに原因があるのかを教えてくれませんか?
CPlayer::CPlayer(float x, float y)関数内の要素数の計算に原因がありそうです。
計算された値を調べてみましょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
keito94
記事: 264
登録日時: 3年前
連絡を取る:

Re: キャラが正しくアニメーションされない。

#5

投稿記事 by keito94 » 3年前

計算した値を調べてみたところ、rowが列数を得たのつもりが、配列の合計を得てしまったことにあるようですね。
みけCATさん、デバッグの支援をしていただきありがとうございました。
オフトピック
何だ、簡単な設計ミスだったのか…。
これからは見落としとかがないようにしよう…。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

NNN

Re: キャラが正しくアニメーションされない。

#6

投稿記事 by NNN » 3年前

たいちうさんのレスは無視ですか?
掲示板を利用する以上、最低限の礼節は守って下さい。

アバター
keito94
記事: 264
登録日時: 3年前
連絡を取る:

Re: キャラが正しくアニメーションされない。

#7

投稿記事 by keito94 » 3年前

NNNさん、ご指摘ありがとうございました。
たいちうさん、その点に関しては大丈夫です。
プログラミング言語の学習は一応しているつもりです。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

NNN

Re: キャラが正しくアニメーションされない。

#8

投稿記事 by NNN » 3年前

違うよ、ソコジャナイヨ

みけCATさんが「要素数の計算に原因がありそうです」
と指摘したから値を調べたんだろうけど
本来は原因の箇所を特定するのは自分で行う事
つまり現時点で原因箇所の特定するノウハウがない
ということは同じような問題が起きたら
また他人に原因箇所調べてもらうまでしてもらわないと解決できない

一生人にデバッグしてもらうの?

アバター
keito94
記事: 264
登録日時: 3年前
連絡を取る:

Re: キャラが正しくアニメーションされない。

#9

投稿記事 by keito94 » 3年前

ごめんなさい…。
プログラミング言語の基礎中の基礎を学び直したいと思います。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

NNN

Re: キャラが正しくアニメーションされない。

#10

投稿記事 by NNN » 3年前

プログラム言語というよりデバッグの話
まずそこから認識を改めよう
言語の基礎覚えてもデバッグ能力は変わらないよ

ただ確実に言えるのはここを何とかしないと
何年かかってもゲーム作れないってこと
何年も無駄にしたくないなら一度立ち止まる事お勧め

アバター
keito94
記事: 264
登録日時: 3年前
連絡を取る:

Re: キャラが正しくアニメーションされない。

#11

投稿記事 by keito94 » 3年前

つまり、デバッグのトレーニングをしろというわけですね…
今までプログラミング言語の知識だけで挑んでいたのが目に見えてきました…。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。

たいちう
記事: 418
登録日時: 9年前

Re: キャラが正しくアニメーションされない。

#12

投稿記事 by たいちう » 3年前

NNNさん、フォローありがとうございます。
まぁ、スルーされても構わないのですが、私は私で拙い例えを続けます。
何か感じ取ってくれればよいのですが、、、


件の小学生は、ある積分の問題を解きたいのですが、
「先に因数分解の勉強をしたら」と勧められても、
「因数分解は理解している」と聞き入れません。
実際は教科書に書かれたことをパラパラ読んだだけで、
因数分解の簡単な問題も解けません。

プログラミングや数学に限りませんが、
簡単なものからの積み重ねが重要な場合がしばしばあります。
自分が今取り組んでいることが非常に難しく感じるなら、
もっと簡単なことの理解を深めることが近道な場合が多いと思います。

返信

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