第一次在这里发帖,我也需要它来帮助别人。
我只是 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 的宽度才能被看到。不是一个好的解决方案。