# HG changeset patch # User sheepluva # Date 1319985090 -3600 # Node ID e2c7771162aec6a84c45c62ee32bf9e17449e6f9 # Parent 5d8e478916b4fa983a0bb04b03a14c36a6bb29bf frontend flakes: * good-bye clipping * also "respawn" flakes when leaving window to the right (instead just the botton) + flakes rotate in 4 degree steps, so let's only generate 90 animation frames instead of 90 diff -r 5d8e478916b4 -r e2c7771162ae QTfrontend/res/Star.png Binary file QTfrontend/res/Star.png has changed diff -r 5d8e478916b4 -r e2c7771162ae QTfrontend/ui/widget/bgwidget.cpp --- a/QTfrontend/ui/widget/bgwidget.cpp Sun Oct 30 08:01:26 2011 +0100 +++ b/QTfrontend/ui/widget/bgwidget.cpp Sun Oct 30 15:31:30 2011 +0100 @@ -36,7 +36,8 @@ fY += fYMov; iAngle += 4; if (iAngle >= 360) iAngle = 0; - if (fY > wParent->height()) reset(); + if ((fX - fXMov) > wParent->width()) reset(); + else if ((fY - fYMov) > wParent->height()) reset(); } void SpritePosition::reset() @@ -73,7 +74,7 @@ for (int i = 0; i < SPRITE_MAX; i++) spritePositions[i] = new SpritePosition(this, sprite.height()); - for (int i = 0; i < 360; i++) + for (int i = 0; i < 90; i++) { rotatedSprites[i] = new QImage(sprite.width(), sprite.height(), QImage::Format_ARGB32); rotatedSprites[i]->fill(0); @@ -85,7 +86,7 @@ // p.setRenderHint(QPainter::Antialiasing); p.setRenderHint(QPainter::SmoothPixmapTransform); p.translate(translate.x(), translate.y()); - p.rotate(i); + p.rotate(4 * i); p.translate(-1*translate.x(), -1*translate.y()); p.drawImage(0, 0, sprite); } @@ -98,7 +99,7 @@ BGWidget::~BGWidget() { for (int i = 0; i < SPRITE_MAX; i++) delete spritePositions[i]; - for (int i = 0; i < 360; i++) delete rotatedSprites[i]; + for (int i = 0; i < 90; i++) delete rotatedSprites[i]; delete timerAnimation; } @@ -107,13 +108,15 @@ Q_UNUSED(event); QPainter p; + p.begin(this); - //p.setRenderHint(QPainter::Antialiasing); + for (int i = 0; i < SPRITE_MAX; i++) { QPoint point = spritePositions[i]->pos(); - p.drawImage(point.x(), point.y(), *rotatedSprites[spritePositions[i]->getAngle()]); + p.drawImage(point.x(), point.y(), *rotatedSprites[spritePositions[i]->getAngle()/4]); } + p.end(); } @@ -121,9 +124,13 @@ { for (int i = 0; i < SPRITE_MAX; i++) { - // bottom edge of star *seems* clipped, but in fact, if I switch to just plain old repaint()/update() it is still clipped - artifact of transform? As for 5, is arbitrary number. 4 was noticeably clipping, 5 seemed same as update() - I assume extra room is due to rotation and value really should be calculated proportional to width/height - update(spritePositions[i]->pos().x(),spritePositions[i]->pos().y(), sprite.width()+5, sprite.height()+5); + QPoint oldPos = spritePositions[i]->pos(); spritePositions[i]->move(); + QPoint newPos = spritePositions[i]->pos(); + + int xdiff = newPos.x() - oldPos.x(); + int ydiff = newPos.y() - oldPos.y(); + update(oldPos.x(), oldPos.y(), xdiff+sprite.width(), ydiff+sprite.height()); } } diff -r 5d8e478916b4 -r e2c7771162ae QTfrontend/ui/widget/bgwidget.h --- a/QTfrontend/ui/widget/bgwidget.h Sun Oct 30 08:01:26 2011 +0100 +++ b/QTfrontend/ui/widget/bgwidget.h Sun Oct 30 15:31:30 2011 +0100 @@ -28,7 +28,7 @@ #include #include -#define SPRITE_MAX 12 +#define SPRITE_MAX 10 #define ANIMATION_INTERVAL 40