我有一个扩展QGraphicsItem的类,该对象在场景中显示正常,直到我调用advance()来为对象设置动画。一旦调用advance并且位置改变,对象立即从(x,y)移动到(2x,2y)。这是我的对象代码。
Zombie::Zombie(QRectF bounds, int refreshTime){
speed = 5.0/1000*refreshTime;
image = ":/assets/RegularZombie.png";
x = bounds.x();
y = bounds.y();
width = bounds.width();
height = bounds.height();
}
void Zombie::advance(int phase){
if (!phase || eating) return;
x = x-speed;
//setPos(boundingRect().topLeft());
setX(x);
}
QRectF Zombie::boundingRect() const{
int x_pos = (int)x;
return QRectF(x_pos,y,width,height);
}
void Zombie::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){
painter->drawImage(boundingRect(),QImage(image));
}
创建时,对象在(x,y)处正确显示,但是一旦调用advance,对象就会移动到(2x,2y)并从那里进行动画处理。
我有另一个类似结构的类,面临着类似的问题。
到目前为止,我提出的唯一可能的解决方案是将坐标除以2并在构造函数中设置位置,但这仍然不允许与场景中的其他对象进行任何比较(例如包含)
此外,这是我用来将对象添加到场景的代码。
int column_width = scene->width()/WIDTH;
int column_height = scene->height()/HEIGHT;
int random = qrand()%HEIGHT;
QRectF rect(scene->width(),random*column_height,column_width,column_height);
zombies.append(new Zombie(rect,refreshRate));
scene->addItem(zombies.at(0));
cout<<rect3.x()<<endl;
cout<<zombies.at(0)->boundingRect().x()<<endl;
scene->update();
提前感谢您的帮助!
聚苯乙烯。我不确定这是否相关,但是我想知道,所有这些都是在Macbook Pro Retina上处理的