0

第一次在这里发帖,我也需要它来帮助别人。

我只是 QT/c++ 的新手,但是由于多年的编程爱好,我的进步相对较快。

我正在尝试通过制作游戏来学习它,等等,除了其他东西之外,我还制作了一个从 QWidget 继承的自定义精灵类。作为一种常见的做法,我重新实现了paintEvent函数,使用了一些技巧,qpixmap/qpainter,json文件,spritesheets,我自己制作的codehelpers,以成功播放具有idle/walking/attacking等姿势的动画。

一切都很完美,直到我尝试通过 QWidget 中的函数 move(int x, int y) 移动它。

我认为,问题在于每次我调用“move”函数时,它都会通过再次调用paintEvent函数来更新/刷新/重新绘制QWidget,切断我的动画,产生几个问题等等。

如果不重新绘制或等待动画完成,或者我缺少什么,我无法弄清楚如何移动它。似乎没有其他方法可以移动 QWidget。我相信问题出在另一个被发射信号调用的事件函数中,可能是 moveEvent,但我重新实现了它,保持它为空,结果是一样的。

你有什么主意吗?我应该以另一种方式重新制作它以跳过这个麻烦吗?还是简单到我看不到对面的硬币?

如果需要,请索取代码。非常感谢你,露娜。


编辑1:

customsprite::customsprite(QWidget *parent, QString spriteName) : QWidget(parent)
{
// qpm is a QPixmap
qpm_idle.load(":/Assets/sprites/" + spriteName + ".png");
qpm_walk.load(":/Assets/sprites/" + spriteName + "_walk.png");
... 
// here goes a custom class to load json files for each sprite sheet
// the json contains x,y,h,w info to draw the animation
...
//some int,bools,qstrings
...
// fps is QTimer
fps.setInterval(33);
connect(&fps,SIGNAL(timeout()),this,SLOT(update()));
fps.start();
}


//the paintEvent:
void customsprite::paintEvent(QPaintEvent *){
//
QPainter qp(this);
QRect targetR(xMove,0,spriteW,spriteH);
QRect sourceR(jhV[status].getFrameX(jhV[status].namesV[spriteFg]),0,spriteW*sizeDivisor,spriteH*sizeDivisor);
// things abouts consulting jsonhelper info
switch (status){ // status is to know if should draw idle or walk animation
case 0:
    qp.drawPixmap(targetR,qpm_idle,sourceR);
    break;
case 1:
    xMove = xMove + 1;
    targetR = QRect(xMove,0,spriteW,spriteH);
    qp.drawPixmap(targetR,qpm_walk,sourceR);
    break;
default:
    break;
}


// all this works fine
if(!reversingAnimation && shouldAnimate){ // simple bool options
    spriteFg++; // an int counter refering to which frame should be drawed
    if(spriteFg == jhV[status].getSSSize()){ // this consults the json files by a custom jsonhelper, it works fine
        if(reversible){
            reversingAnimation = true;
            spriteFg = jhV[status].getSSSize() - 1;
        }else if(!reversible){
            spriteFg = 0;
            emitSignals();

            if(animateOnce == true){
                shouldAnimate = false;
            }
        }

    }
}
//here goes a similar the above code to to handle the animation playing in reverse, nothing important
}

然后在我的通用 QMainWindow 中添加我的customsprite 类的实例,将其父级设置为 QMainWindow,它出现,播放动画。问题是当我尝试使用时:

//cs is customsprite
cs->move(cs->x()+1,cs->Y());

它移动,但多次插入动画。我也尝试过在paintEvent中使用“isWalking”布尔过滤器,但它是一样的。

编辑 2:那里的“xMove”是一个用来成功平滑地移动动画的技巧,但它需要增加 QWidget 的宽度才能被看到。不是一个好的解决方案。

4

0 回答 0