[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