动画问题? 现在我开始游戏时,我在C++中左上或下走。但是角色只是滑倒,看起来不像是在走路。。我已经将所有的图片加载到我的游戏中,它们正在工作。。但我不知道该怎么解决。。我搞不懂的是当你按下按钮时如何改变画面

动画问题? 现在我开始游戏时,我在C++中左上或下走。但是角色只是滑倒,看起来不像是在走路。。我已经将所有的图片加载到我的游戏中,它们正在工作。。但我不知道该怎么解决。。我搞不懂的是当你按下按钮时如何改变画面,c++,animation,allegro,C++,Animation,Allegro,顺便说一下,这是快板 以下是我的绘图播放器代码: void Player::Draw(BITMAP *Buffer){ draw_sprite(Buffer, Oskar[picNumber], x, y); } Oskar[]是包含所有图片的阵列的名称 以下是当您按下按钮时更改角色图片的内容: void Player::Controls(){ if(key[KEY_RIGHT]){ velocityX = speed; picNumber = 6; } else

顺便说一下,这是快板

以下是我的绘图播放器代码:

void Player::Draw(BITMAP *Buffer){
    draw_sprite(Buffer, Oskar[picNumber], x, y);
}
Oskar[]是包含所有图片的阵列的名称

以下是当您按下按钮时更改角色图片的内容:

void Player::Controls(){

if(key[KEY_RIGHT]){
    velocityX = speed;
    picNumber = 6;
}

else if(key [KEY_LEFT]){
    velocityX = -speed;
    picNumber = 9;
}

else{
    velocityX = 0;
}

if(key [KEY_UP]){
    velocityY = -speed;
    picNumber = 3;
}
else if(key [KEY_DOWN]){
    velocityY = speed;
    picNumber = 0;
}
else{
    velocityY = 0;
}

x += velocityX;
y += velocityY;
}
这都是关于我创建的变量picNumber。。我所有的图片都在一个数组中,picNumber表示要绘制的图片。。 如果能在这方面得到一些帮助,那就太好了。。我整天都在想这个

编辑
#包括“Player.h”
#包括“Global.h”
#包括
Player::Player(){
}
玩家::~Player(){
}
void播放器::Init(){
x=10;
y=10;
速度x=0;
速度y=0;
速度=1;
picNumber=x%最大Pics;
OskarFront[0]=加载位图(“Character\\OskarFront.bmp”,NULL);
OskarFront[1]=加载位图(“Character\\oskarsting.bmp”,NULL);
OskarFront[2]=加载位图(“Character\\OskarFront2.bmp”,NULL);
OskarBack[0]=加载位图(“Character\\OskarBack.bmp”,NULL);
OskarBack[1]=加载位图(“Character\\OskarStandingBack.bmp”,NULL);
OskarBack[2]=加载位图(“Character\\OskarBack2.bmp”,NULL);
OskarRight[0]=加载位图(“Character\\Oskar1.bmp”,NULL);
OskarRight[1]=加载位图(“Character\\Oskar.bmp”,NULL);
OskarRight[2]=加载位图(“Character\\Oskar2.bmp”,NULL);
Oskarlefit[0]=加载位图(“Character\\oskarlefit.bmp”,NULL);
OskarLeft[1]=加载位图(“Character\\OskarLeftStand.bmp”,NULL);
Oskarleeft[2]=加载位图(“Character\\oskarleeft2.bmp”,NULL);
}
void Player::Update(){
Player::Controls();
}
无效播放器::绘制(位图*缓冲区){
如果(walkingRight==真){
绘制精灵(缓冲区,奥斯卡右[picNumber],x,y);
}
else if(walkingLeft==true){
绘制精灵(缓冲区,奥斯卡左[picNumber],x,y);
}
else if(walkingFront==true){
绘制精灵(缓冲区,奥斯卡正面[picNumber],x,y);
}
else if(walkingBack==true){
绘制精灵(缓冲区,奥斯卡背[picNumber],x,y);
}
否则{
绘制精灵(缓冲区,奥斯卡前线[1],x,y);
}
}
void Player::Controls(){
如果(键[右键]){
速度x=速度;
walkingRight=正确;
}
else if(键[左键]){
velocityX=速度;
walkingLeft=正确;
}
否则{
walkingRight=错误;
向左行走=错误;
速度x=0;
}
如果(键[向上键]){
velocityY=速度;
walkingFront=true;
}
否则如果(按键[按键向下]){
速度y=速度;
后退=真;
}
否则{
速度y=0;
walkingFront=错误;
后退=假;
}
x+=速度x;
y+=速度y;
}

下面是我在这里获得帮助后键入的新完整代码。。它现在不工作,当我向上走时,它显示前面的图片,而我向下走时,它显示的是上面的图片。。但是左和右都有效。。而且它不会像动画那样改变图片。

每个运动方向只有一个索引

假设你画了大约3(左腿向前,重叠,右腿向前),你需要随着行进的进行随着时间或运动增加索引

有趣的是Allegro取得了多大的进步——十年前,它主要是DOS图形(我与DJGPP一起使用),并且有一封来自住在伦敦公寓的作者的留言。我认为这是多么严峻,直到现在我才看到我们这些地方人的价格离伦敦有多远

对于您的评论,请尝试以下方式:

#define MAXPICS 3
BITMAP *OskarWalksLeft[MAXPICS];
BITMAP *OskarWalksRight[MAXPICS];
picNumber = x % MAXPICS;
if (facingLeft) {
    draw_sprite(Buffer, OskarWalksLeft[picNumber], x, y);
} else //facingRight
    draw_sprite(Buffer, OskarWalksRight[picNumber], x, y);
或者,如果您不希望每像素增加一帧,但每3帧左右,请尝试更换一帧

picNumber = x % MAXPICS;

我试着整理一下您的代码,并得出以下结论,我没有allegro,因此无法测试它:

#include "Player.h"
#include "Global.h"
#include <allegro.h>

Player::Player(){}

Player::~Player(){}

enum playerDir {left, right, front, back, stationary} direction;
BITMAP *Oskar[stationary][3];

void Player::Init(){
    x = 10;
    y = 10;
    velocityX = 0;
    velocityY = 0;
    speed = 1;
    picNumber = x % MAXPICS;

    char filename[256];
    const char *dirStrs[] = {"left","right","front","back"};
    for (playerDir i = left; i < stationary; (int)i = (int)i + 1)
        for (j = 0; j < 3; ++j) {
            strcpy(filename, "Character\\Oskar");
            strcat(filename, dirStrs[i]);
            strcat(filename, itoa(j));
            strcat(filename, ".bmp");
            Oskar[i][j] = load_bitmap(filename, NULL);
        }
}

void Player::Update(){Player::Controls();}
void Player::Draw(BITMAP *Buffer){
    switch (direction) {
        case left :
                draw_sprite(Buffer, OskarLeft[picNumber], x, y);
                break;
        case right :
                draw_sprite(Buffer, OskarRight[picNumber], x, y);
                break;
        case front :
                draw_sprite(Buffer, OskarFront[picNumber], x, y);
                break;
        case back :
                draw_sprite(Buffer, OskarBack[picNumber], x, y);
                break;
        default:
                draw_sprite(Buffer, OskarFront[1], x, y);
        }
}

void Player::Controls(){
    direction = stationary;
    if(key[KEY_RIGHT]){
        velocityX = speed;
        direction = right;
    } else if(key [KEY_LEFT]){
        velocityX = -speed;
        direction = left;
    } else velocityX = 0;

    if(key [KEY_UP]){
        velocityY = -speed;
        direction = front;
    } else if(key [KEY_DOWN]){
        velocityY = speed;
        direction = back;
    } else velocityY = 0;

    x += velocityX;
    y += velocityY;
 }
#包括“Player.h”
#包括“Global.h”
#包括
Player::Player(){}
玩家::~Player(){}
枚举播放器方向{左、右、前、后、静止}方向;
位图*奥斯卡[静止][3];
void播放器::Init(){
x=10;
y=10;
速度x=0;
速度y=0;
速度=1;
picNumber=x%最大Pics;
字符文件名[256];
const char*dirStrs[]={“左”、“右”、“前”、“后”};
对于(playerDir i=左;i<静止;(int)i=(int)i+1)
对于(j=0;j<3;++j){
strcpy(文件名,“Character\\Oskar”);
strcat(文件名,目录[i]);
strcat(文件名,itoa(j));
strcat(文件名“.bmp”);
Oskar[i][j]=加载位图(文件名,NULL);
}
}
void Player::Update(){Player::Controls();}
无效播放器::绘制(位图*缓冲区){
开关(方向){
案例左:
绘制精灵(缓冲区,奥斯卡左[picNumber],x,y);
打破
案例权利:
绘制精灵(缓冲区,奥斯卡右[picNumber],x,y);
打破
案件正面:
绘制精灵(缓冲区,奥斯卡正面[picNumber],x,y);
打破
案件背景:
绘制精灵(缓冲区,奥斯卡背[picNumber],x,y);
打破
违约:
绘制精灵(缓冲区,奥斯卡前线[1],x,y);
}
}
void Player::Controls(){
方向=静止;
如果(键[右键]){
速度x=速度;
方向=右;
}else if(键[左键]){
velocityX=速度;
方向=左;
}else-velocityX=0;
如果(键[KE
picNumber = (x / 3)  % MAXPICS;
#include "Player.h"
#include "Global.h"
#include <allegro.h>

Player::Player(){}

Player::~Player(){}

enum playerDir {left, right, front, back, stationary} direction;
BITMAP *Oskar[stationary][3];

void Player::Init(){
    x = 10;
    y = 10;
    velocityX = 0;
    velocityY = 0;
    speed = 1;
    picNumber = x % MAXPICS;

    char filename[256];
    const char *dirStrs[] = {"left","right","front","back"};
    for (playerDir i = left; i < stationary; (int)i = (int)i + 1)
        for (j = 0; j < 3; ++j) {
            strcpy(filename, "Character\\Oskar");
            strcat(filename, dirStrs[i]);
            strcat(filename, itoa(j));
            strcat(filename, ".bmp");
            Oskar[i][j] = load_bitmap(filename, NULL);
        }
}

void Player::Update(){Player::Controls();}
void Player::Draw(BITMAP *Buffer){
    switch (direction) {
        case left :
                draw_sprite(Buffer, OskarLeft[picNumber], x, y);
                break;
        case right :
                draw_sprite(Buffer, OskarRight[picNumber], x, y);
                break;
        case front :
                draw_sprite(Buffer, OskarFront[picNumber], x, y);
                break;
        case back :
                draw_sprite(Buffer, OskarBack[picNumber], x, y);
                break;
        default:
                draw_sprite(Buffer, OskarFront[1], x, y);
        }
}

void Player::Controls(){
    direction = stationary;
    if(key[KEY_RIGHT]){
        velocityX = speed;
        direction = right;
    } else if(key [KEY_LEFT]){
        velocityX = -speed;
        direction = left;
    } else velocityX = 0;

    if(key [KEY_UP]){
        velocityY = -speed;
        direction = front;
    } else if(key [KEY_DOWN]){
        velocityY = speed;
        direction = back;
    } else velocityY = 0;

    x += velocityX;
    y += velocityY;
 }
void Player::updateFrame(float time_delta)
{
    time_to_next_frame -= time_delta;
    while (time_to_next_frame <= 0.0f)
    {
        nextFrame();
        time_to_next_frame += time_per_frame;
    }
}
void Player::nextFrame( int startIndex /* Changes based on your direction */) {
      static unsigned short iIndex = 0;

      // Increment and map value to the range [0, 2]
      ++iIndex;
      iIndex %= 3;


      // Note: this assumes that picNumber is a member function, else you
      // will have to pass it by reference to this function.
      picNumber = iIndex + startIndex;
}