#1
by keito94 » 7年前
キャラのアニメーションを動かすテストをしているのですが、移動しようとすると、キャラが消えてしまいます。
コードは以下のとおりです。
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 バイト) ダウンロード数: 143 回
キャラのアニメーションを動かすテストをしているのですが、移動しようとすると、キャラが消えてしまいます。
コードは以下のとおりです。
Main.cpp(画像読み込みの部分のみ)
[code]
//画像は添付ファイルにあります。
LoadDivGraph("自作キャラ.bmp", 32, 8, 4, 16, 16, PlayerGh);
[/code]
Anim.h(一部のみ)
[code]
#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; }
};
[/code]
Anim.cpp
[code]#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;
}
[/code]
Player.cpp(一部のみ)
[code]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);
}
[/code]
デバック用コンソール(移動モーションの時)
[code]
アニメモーション番号:1
アニメフレーム番号:-8
[/code]
アニメフレーム番号が-8と怪しい数値を吐き出しています。
デバックをすればいいということはわかっているのですが、どこに原因があるのかを教えてくれませんか?