[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdegames/kolf
From: Stefan Majewsky <majewsky () gmx ! net>
Date: 2010-10-31 22:15:49
Message-ID: 20101031221549.38891AC8ED () svn ! kde ! org
[Download RAW message or body]
SVN commit 1191690 by majewsky:
Add EllipticalCanvasItem class as common base class for Ball, Bumper, Cup, Puddle, Sand.
This is the first time in my Kolf activity that I can restore a feature:
The ball is now colored again (although the current theme does not have
a translucent ball, so the colored ellipse cannot be seen below the
opaque ball texture).
M +6 -11 ball.cpp
M +3 -8 ball.h
M +65 -0 canvasitem.cpp
M +25 -0 canvasitem.h
M +12 -42 game.cpp
M +5 -31 game.h
--- trunk/KDE/kdegames/kolf/ball.cpp #1191689:1191690
@@ -22,14 +22,12 @@
#include "rtti.h"
#include <QApplication>
-#include <KGameRenderer>
Ball::Ball(QGraphicsItem* parent)
- : Tagaro::SpriteObjectItem(Kolf::renderer(), QLatin1String("ball"), parent)
+ : EllipticalCanvasItem(true, QLatin1String("ball"), parent)
{
const int diameter = 8;
- setOffset(-0.5 * diameter, -0.5 * diameter);
- Tagaro::SpriteObjectItem::setSize(diameter, diameter);
+ setSize(QSizeF(diameter, diameter));
setData(0, Rtti_Ball);
m_doDetect = true;
@@ -104,14 +102,11 @@
void Ball::moveBy(double dx, double dy)
{
- double oldx;
- double oldy;
- oldx = x();
- oldy = y();
- Tagaro::SpriteObjectItem::moveBy(dx, dy);
+ const QPointF oldPos = pos();
+ EllipticalCanvasItem::moveBy(dx, dy);
if (game && !game->isPaused())
- collisionDetect(oldx, oldy);
+ collisionDetect(oldPos.x(), oldPos.y());
if ((dx || dy) && game && game->curBall() == this)
game->ballMoved();
@@ -530,7 +525,7 @@
void Ball::setVisible(bool yes)
{
- Tagaro::SpriteObjectItem::setVisible(yes);
+ EllipticalCanvasItem::setVisible(yes);
label->setVisible(yes && game && game->isInfoShowing());
}
--- trunk/KDE/kdegames/kolf/ball.h #1191689:1191690
@@ -21,14 +21,12 @@
#define KOLF_BALL_H
#include "canvasitem.h"
-#include "vector.h"
-#include "tagaro/spriteobjectitem.h"
class Wall;
enum BallState { Rolling = 0, Stopped, Holed };
-class Ball : public Tagaro::SpriteObjectItem, public CanvasItem
+class Ball : public EllipticalCanvasItem
{
public:
Ball(QGraphicsItem* parent);
@@ -47,8 +45,8 @@
BallState curState() const { return state; }
void setState(BallState newState);
- QColor color() const { return m_color; }
- void setColor(QColor color) { m_color = color; }
+ QColor color() const { return ellipseItem()->brush().color(); }
+ void setColor(const QColor& color) { ellipseItem()->setBrush(color); }
void setMoved(bool yes) { m_moved = yes; }
bool moved() const { return m_moved; }
@@ -86,9 +84,6 @@
virtual void setName(const QString &);
virtual void setVisible(bool yes);
- double width() { return size().width(); }
- double height() { return size().height(); }
-
double getMaxBumperBounceSpeed() { return maxBumperBounceSpeed; }
void reduceMaxBumperBounceSpeed() { if(maxBumperBounceSpeed > 0.4) maxBumperBounceSpeed -= 0.35; }
--- trunk/KDE/kdegames/kolf/canvasitem.cpp #1191689:1191690
@@ -60,3 +60,68 @@
game->playSound(file, vol);
}
+//BEGIN EllipticalCanvasItem
+
+EllipticalCanvasItem::EllipticalCanvasItem(bool withEllipse, const QString& spriteKey, QGraphicsItem* parent)
+ : Tagaro::SpriteObjectItem(Kolf::renderer(), spriteKey, parent)
+ , m_ellipseItem(0)
+{
+ if (withEllipse)
+ {
+ m_ellipseItem = new QGraphicsEllipseItem(this);
+ m_ellipseItem->setFlag(QGraphicsItem::ItemStacksBehindParent);
+ //won't appear unless pen/brush is configured
+ m_ellipseItem->setPen(Qt::NoPen);
+ m_ellipseItem->setBrush(Qt::NoBrush);
+ }
+}
+
+bool EllipticalCanvasItem::contains(const QPointF& point) const
+{
+ const QSizeF halfSize = size() / 2;
+ const qreal xScaled = point.x() / halfSize.width();
+ const qreal yScaled = point.y() / halfSize.height();
+ return xScaled * xScaled + yScaled * yScaled < 1;
+}
+
+QPainterPath EllipticalCanvasItem::shape() const
+{
+ QPainterPath path;
+ path.addEllipse(rect());
+ return path;
+}
+
+QRectF EllipticalCanvasItem::rect() const
+{
+ return Tagaro::SpriteObjectItem::boundingRect();
+}
+
+void EllipticalCanvasItem::setSize(const QSizeF& size)
+{
+ setOffset(QPointF(-0.5 * size.width(), -0.5 * size.height()));
+ Tagaro::SpriteObjectItem::setSize(size);
+ if (m_ellipseItem)
+ m_ellipseItem->setRect(this->rect());
+}
+
+void EllipticalCanvasItem::moveBy(double dx, double dy)
+{
+ Tagaro::SpriteObjectItem::moveBy(dx, dy);
+}
+
+void EllipticalCanvasItem::saveSize(KConfigGroup* group)
+{
+ const QSizeF size = this->size();
+ group->writeEntry("width", size.width());
+ group->writeEntry("height", size.height());
+}
+
+void EllipticalCanvasItem::loadSize(KConfigGroup* group)
+{
+ QSizeF size = this->size();
+ size.rwidth() = group->readEntry("width", size.width());
+ size.rheight() = group->readEntry("height", size.height());
+ setSize(size);
+}
+
+//END EllipticalCanvasItem
--- trunk/KDE/kdegames/kolf/canvasitem.h #1191689:1191690
@@ -22,6 +22,7 @@
#include "config.h"
#include "vector.h"
+#include "tagaro/spriteobjectitem.h"
#include <QGraphicsRectItem>
#include <QGraphicsView>
@@ -131,4 +132,28 @@
Vector m_velocity;
};
+//WARNING: pos() is at center (not at top-left edge of bounding rect!)
+class EllipticalCanvasItem : public Tagaro::SpriteObjectItem, public CanvasItem
+{
+ public:
+ EllipticalCanvasItem(bool withEllipse, const QString& spriteKey, QGraphicsItem* parent = 0);
+ QGraphicsEllipseItem* ellipseItem() const { return m_ellipseItem; }
+
+ virtual bool contains(const QPointF& point) const;
+ virtual QPainterPath shape() const;
+
+ QRectF rect() const;
+ double width() const { return Tagaro::SpriteObjectItem::size().width(); }
+ double height() const { return Tagaro::SpriteObjectItem::size().height(); }
+
+ virtual void setSize(const QSizeF& size);
+ void setSize(qreal width, qreal height) { setSize(QSizeF(width, height)); }
+ virtual void moveBy(double x, double y);
+
+ void saveSize(KConfigGroup* group);
+ void loadSize(KConfigGroup* group);
+ private:
+ QGraphicsEllipseItem* m_ellipseItem;
+};
+
#endif
--- trunk/KDE/kdegames/kolf/game.cpp #1191689:1191690
@@ -754,7 +754,7 @@
/////////////////////////
KolfEllipse::KolfEllipse(QGraphicsItem *parent, const QString &type)
- : Tagaro::SpriteObjectItem(Kolf::renderer(), type, parent)
+ : EllipticalCanvasItem(false, type, parent)
{
savingDone();
setChangeEnabled(false);
@@ -787,15 +787,9 @@
return ret;
}
-void KolfEllipse::setSize(const QSizeF& size)
-{
- setOffset(-0.5 * size.width(), -0.5 * size.height());
- Tagaro::SpriteObjectItem::setSize(size);
-}
-
void KolfEllipse::moveBy(double dx, double dy)
{
- QGraphicsItem::moveBy(dx, dy);
+ EllipticalCanvasItem::moveBy(dx, dy);
point->dontMove();
point->setPos(x() + width()/2, y() + height()/2);
@@ -826,19 +820,15 @@
{
setChangeEnabled(cfgGroup->readEntry("changeEnabled", changeEnabled()));
setChangeEvery(cfgGroup->readEntry("changeEvery", changeEvery()));
- double newWidth = width(), newHeight = height();
- newWidth = cfgGroup->readEntry("width", newWidth);
- newHeight = cfgGroup->readEntry("height", newHeight);
- setSize(QSizeF(newWidth, newHeight));
- moveBy(0, 0);
+ EllipticalCanvasItem::loadSize(cfgGroup);
+ moveBy(0, 0); //adjust point
}
void KolfEllipse::save(KConfigGroup *cfgGroup)
{
cfgGroup->writeEntry("changeEvery", changeEvery());
cfgGroup->writeEntry("changeEnabled", changeEnabled());
- cfgGroup->writeEntry("width", width());
- cfgGroup->writeEntry("height", height());
+ EllipticalCanvasItem::saveSize(cfgGroup);
}
Config *KolfEllipse::config(QWidget *parent)
@@ -871,12 +861,8 @@
{
if (ball->isVisible())
{
- // is center of ball in? (calculation based on assumption of precise ellipse shape)
- const QPointF posDiff = ball->pos() - pos();
- const QSizeF halfSize = boundingRect().size() / 2;
- const qreal dxScaled = posDiff.x() / halfSize.width();
- const qreal dyScaled = posDiff.y() / halfSize.height();
- if (dxScaled * dxScaled + dxScaled * dyScaled < 1/* && ball->curVector().magnitude() < 4*/)
+ // is center of ball in?
+ if (contains(ball->pos() - pos()) /* && ball->curVector().magnitude() < 4*/)
{
playSound("puddle");
ball->setAddStroke(ball->addStroke() + 1);
@@ -1047,22 +1033,16 @@
/////////////////////////
Bumper::Bumper(QGraphicsItem * parent)
-: Tagaro::SpriteObjectItem(Kolf::renderer(), QLatin1String("bumper_off"), parent)
+: EllipticalCanvasItem(false, QLatin1String("bumper_off"), parent)
{
const int diameter = 20;
- setOffset(-0.5 * diameter, -0.5 * diameter);
- Tagaro::SpriteObjectItem::setSize(QSizeF(diameter, diameter));
+ setSize(QSizeF(diameter, diameter));
setZValue(-25);
count = 0;
setAnimated(false);
}
-void Bumper::moveBy(double x, double y)
-{
- QGraphicsItem::moveBy(x, y);
-}
-
void Bumper::advance(int phase)
{
if(!isAnimated())
@@ -1107,11 +1087,10 @@
/////////////////////////
Cup::Cup(QGraphicsItem * parent)
- : Tagaro::SpriteObjectItem(Kolf::renderer(), "cup", parent)
+ : EllipticalCanvasItem(false, QLatin1String("cup"), parent)
{
const int diameter = 16;
- setOffset(-0.5 * diameter, -0.5 * diameter);
- Tagaro::SpriteObjectItem::setSize(QSizeF(diameter, diameter));
+ setSize(QSizeF(diameter, diameter));
setZValue(998.1);
}
@@ -1126,16 +1105,6 @@
return true;
}
-void Cup::moveBy(double x, double y)
-{
- QGraphicsItem::moveBy(x, y);
-}
-
-void Cup::save(KConfigGroup *cfgGroup)
-{
- cfgGroup->writeEntry("dummykey", true);
-}
-
void Cup::saveState(StateDB *db)
{
db->setPoint(pos());
@@ -2191,6 +2160,7 @@
: QGraphicsView(parent)
, m_factory(factory)
{
+ setRenderHint(QPainter::Antialiasing);
// for mouse control
setMouseTracking(true);
viewport()->setMouseTracking(true);
--- trunk/KDE/kdegames/kolf/game.h #1191689:1191690
@@ -27,7 +27,6 @@
#include "statedb.h"
#include "tagaro/scene.h"
-#include "tagaro/spriteobjectitem.h"
#include <KLocale>
#include <KConfigGroup>
@@ -175,7 +174,7 @@
bool dontmove;
};
-class KolfEllipse : public Tagaro::SpriteObjectItem, public CanvasItem
+class KolfEllipse : public EllipticalCanvasItem
{
public:
KolfEllipse(QGraphicsItem *parent, const QString &type);
@@ -192,8 +191,6 @@
virtual QList<QGraphicsItem *> moveableItems() const;
- virtual void setSize(const QSizeF& size);
-
virtual void moveBy(double dx, double dy);
virtual void editModeChanged(bool changed);
@@ -203,9 +200,6 @@
virtual Config *config(QWidget *parent);
- double width() { return boundingRect().width(); }
- double height() { return boundingRect().height(); }
-
protected:
RectPoint *point;
int m_changeEvery;
@@ -255,50 +249,30 @@
virtual bool collision(Ball *ball, long int id);
};
-class Inside : public QGraphicsEllipseItem, public CanvasItem
+class Bumper : public EllipticalCanvasItem
{
public:
- Inside(CanvasItem *item, QGraphicsItem *parent) : QGraphicsEllipseItem(parent) { this->item = item; }
- virtual bool collision(Ball *ball, long int id) { return item->collision(ball, id); }
- virtual void setSize(const QSizeF& size) { setRect(QRectF(rect().topLeft(), size)); }
-
-protected:
- CanvasItem *item;
-};
-
-class Bumper : public Tagaro::SpriteObjectItem, public CanvasItem
-{
-public:
Bumper(QGraphicsItem *parent);
virtual void advance(int phase);
- void moveBy(double x, double y);
virtual bool collision(Ball *ball, long int id);
-
-protected:
- Inside *inside;
-
private:
int count;
};
- class Cup : public Tagaro::SpriteObjectItem, public CanvasItem
+ class Cup : public EllipticalCanvasItem
{
public:
Cup(QGraphicsItem *parent);
virtual bool place(Ball *ball, bool wasCenter);
- void moveBy(double x, double y);
- virtual void save(KConfigGroup *cfgGroup);
- void saveState(StateDB *db);
- void loadState(StateDB *db);
+ virtual void saveState(StateDB *db);
+ virtual void loadState(StateDB *db);
virtual bool canBeMovedByOthers() const { return true; }
virtual bool collision(Ball *ball, long int id);
protected:
- QPixmap pixmap;
- bool pixmapInitialised;
virtual HoleResult result(const QPointF, double, bool *wasCenter);
};
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic