[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdegames/bomber/src
From:       Stefan Majewsky <majewsky () gmx ! net>
Date:       2012-04-14 23:58:38
Message-ID: 20120414235838.1584FAC89B () svn ! kde ! org
[Download RAW message or body]

SVN commit 1289573 by majewsky:

Port Bomber from KGameCanvas to QGraphicsView.

Patch by Mehmet Emre. Thanks very much!

CCMAIL: maemre2@gmail.com
(Please remember to close the review request.)

 M  +18 -10    board.cpp  
 M  +18 -6     board.h  
 M  +1 -1      bomber.cpp  
 M  +30 -27    bomberwidget.cpp  
 M  +4 -4      bomberwidget.h  
 M  +13 -15    building.cpp  
 M  +4 -7      building.h  
 M  +4 -4      explodable.cpp  
 M  +2 -2      explodable.h  
 M  +2 -1      main.cpp  


--- trunk/KDE/kdegames/bomber/src/board.cpp #1289572:1289573
@@ -21,14 +21,15 @@
 #include "building.h"
 #include "bomb.h"
 
-#include "kgamecanvas.h"
+#include "settings.h"
 
-#include <kdebug.h>
 #include <KRandom>
 #include <Phonon/MediaObject>
 #include <KStandardDirs>
 
 #include <QTimer>
+#include <QGraphicsScene>
+#include <QGraphicsView>
 
 /** The value that the plane velocity increases by */
 const qreal PLANE_INC_VELOCITY = 0.0005;
@@ -49,16 +50,16 @@
 /** This time in milliseconds that the bomb exploding animation is played for */
 const unsigned int BOMB_EXPLODE_TIME = 1000;
 
-BomberBoard::BomberBoard(KGameRenderer *renderer, KGameCanvasAbstract *canvas,
-		QWidget *parent) :
-	QObject(parent), KGameCanvasGroup(canvas), m_renderer(renderer), m_bomb(NULL)
+BomberBoard::BomberBoard(KGameRenderer *renderer, QGraphicsView* view, QObject *parent) :
+	QGraphicsScene(parent), m_renderer(renderer), m_view(view)
 {
+	m_bomb = NULL;
 	m_clock = new QTimer(this);
 	m_clock->setInterval(GAME_DELAY);
 	connect(m_clock, SIGNAL(timeout()), this, SLOT(tick()));
 	m_plane = new Plane(m_renderer, this);
 	m_plane->resize(m_tileSize);
-	m_plane->raise();
+	this->addItem(m_plane);
 	m_plane->show();
 	resetPlane();
 	clear();
@@ -85,6 +86,8 @@
 
 void BomberBoard::resize(QSize& size)
 {
+	setBackgroundBrush(m_renderer->spritePixmap("background", size));
+
 	unsigned int minTileSizeWidth = size.width() / TILE_NUM_W;
 	unsigned int minTileSizeHeight = size.height() / TILE_NUM_H;
 
@@ -155,7 +158,6 @@
 		Building *building = new Building(m_renderer, this, i + 1, height);
 
 		building->resize(m_tileSize);
-		building->raise();
 		building->show();
 
 		m_buildings.append(building);
@@ -224,9 +226,8 @@
 	if (m_bomb == NULL && m_plane->state() == Explodable::Moving)
 	{
 		QPointF planePos = m_plane->position();
-		m_bomb
-				= new Bomb(m_renderer, this, planePos.x(), planePos.y() + 1, m_tileSize);
-		m_bomb->raise();
+		m_bomb = new Bomb(m_renderer, this, planePos.x(), planePos.y() + 1, m_tileSize);
+		this->addItem(m_bomb);
 		m_bomb->show();
 	}
 }
@@ -287,6 +288,13 @@
 	delete bomb;
 }
 
+void BomberBoard::settingsChanged()
+{
+	setSounds(BomberSettings::playSounds());
+	setBackgroundBrush(m_renderer->spritePixmap("background", m_view->size()));
+	redraw();
+}
+
 void BomberBoard::planeExploded()
 {
 	m_plane->setState(Plane::Exploded);
--- trunk/KDE/kdegames/bomber/src/board.h #1289572:1289573
@@ -18,7 +18,7 @@
 #ifndef BOARD_H
 #define BOARD_H
 
-#include <KGameCanvas>
+#include <QGraphicsScene>
 #include <KGameRenderer>
 
 #include <QSize>
@@ -39,7 +39,7 @@
  * This class used to represent the game board. This makes sure all the game objects
  * get moved and redrawn every second. It also checks for any collisions
  */
-class BomberBoard: public QObject, public KGameCanvasGroup
+class BomberBoard: public QGraphicsScene
 {
 Q_OBJECT
 
@@ -47,11 +47,11 @@
 
 	/**
 	 * The constructor used to create the board.
-	 * \param renderer The Render used to renderer game objects
-	 * \param canvas The object were the games objects are drawn onto
+	 * \param renderer The renderer used to render game objects
+	 * \param view The graphics view object which this board is bound to
 	 * \param parent The widget which the board is inserted into
 	 */
-	explicit BomberBoard(KGameRenderer *renderer, KGameCanvasAbstract *canvas = NULL, QWidget *parent = 0);
+	explicit BomberBoard(KGameRenderer *renderer, QGraphicsView* view, QObject *parent = 0);
 
 	~BomberBoard();
 
@@ -131,9 +131,16 @@
 	 */
 	void levelCleared();
 
+public slots:
+	/**
+	 * This is called when the settings change to save the settings
+	 */
+	void settingsChanged();
+
 private slots:
 	/** This is called once a second to update and draw all the game objects */
 	void tick();
+
 	/**
 	 * This is called when a plane has finished exploding
 	 */
@@ -169,9 +176,11 @@
 	 */
 	void crashed();
 
+	/** This is the renderer used to render game objects */
 	KGameRenderer *m_renderer;
+
+	/** This is the size of a tiling block */
 	QSize m_tileSize;
-
 	QTimer *m_clock;
 
 	Phonon::MediaObject *m_audioPlayer;
@@ -192,6 +201,9 @@
 
 	/** This is the number of blocks that make up the buildings */
 	unsigned int m_buildingBlocks;
+
+	/** This is the graphics view object which this board is bound. */
+	QGraphicsView *m_view;
 };
 
 #endif
--- trunk/KDE/kdegames/bomber/src/bomber.cpp #1289572:1289573
@@ -22,7 +22,7 @@
 
 #include <KAction>
 #include <KActionCollection>
-#include <kdebug.h>
+#include <KConfigDialog>
 #include <KLocale>
 #include <KMessageBox>
 #include <krandom.h>
--- trunk/KDE/kdegames/bomber/src/bomberwidget.cpp #1289572:1289573
@@ -19,10 +19,12 @@
 #include "bomberwidget.h"
 #include "settings.h"
 
-#include <QPalette>
 #include <QTimer>
+#include <QGraphicsView>
+#include <QGraphicsItem>
 
 #include <KLocale>
+#include <sys/stat.h>
 
 #define NEW_LIVE_AT_SCORE 10000;
 
@@ -31,33 +33,43 @@
 
 static const unsigned int GAME_TIME_DELAY = 1000;
 static const unsigned int TICKS_PER_SECOND = 1000 / GAME_TIME_DELAY;
+/** The z-value for overlays */
+static const unsigned int OVERLAY_Z_VALUE = 1000;
 
 BomberGameWidget::BomberGameWidget(KgThemeProvider *provider, QWidget *parent) :
-	KGameCanvasWidget(parent), m_state(BeforeFirstGame), m_level(0),m_lives(0), m_time(0)
-	, m_renderer(provider)
+	QGraphicsView(parent), m_state(BeforeFirstGame), m_level(0),m_lives(0), m_time(0),
+	m_renderer(provider)
 {
+	// Gameboard
 	m_board = new BomberBoard(&m_renderer, this, this);
 	connect(m_board, SIGNAL(onPlaneCrash()), this, SLOT(onPlaneCrashed()));
 	connect(m_board, SIGNAL(onBombHit()), this, SLOT(onBombHit()));
 	connect(m_board, SIGNAL(levelCleared()), this, SLOT(onLevelCleared()));
+	setScene(m_board);
+	setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+	setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+	setFrameStyle(QFrame::NoFrame);
+	setCacheMode(QGraphicsView::CacheBackground); // Optimize caching
+	setFocusPolicy(Qt::StrongFocus);
+	setAlignment(Qt::AlignLeft | Qt::AlignTop);
+	// Overlay
+	m_overlay = new QGraphicsPixmapItem();
 
-	m_overlay = new KGameCanvasPixmap(this);
+	m_board->addItem(m_overlay);
 
-	m_overlay->raise();
-	m_overlay->hide();
-
 	m_clock = new QTimer(this);
 	m_clock->setInterval(GAME_TIME_DELAY);
 
 	connect(m_clock, SIGNAL(timeout()), this, SLOT(tick()));
 
 	setMouseTracking(true);
+	generateOverlay();
 }
 
 BomberGameWidget::~BomberGameWidget()
 {
 	delete m_board;
-	delete m_overlay;
+	//delete m_overlay; // m_overlay is implicitly deleted by m_board
 }
 
 unsigned int BomberGameWidget::level() const
@@ -141,12 +153,7 @@
 
 void BomberGameWidget::settingsChanged()
 {
-	m_board->setSounds(BomberSettings::playSounds());
-
-	QPalette palette;
-	palette.setBrush(backgroundRole(), m_renderer.spritePixmap("background", size()));
-	setPalette(palette);
-	redraw();
+	m_board->settingsChanged();
 }
 
 void BomberGameWidget::setSounds(bool val)
@@ -197,16 +204,8 @@
 
 void BomberGameWidget::resizeEvent(QResizeEvent *ev)
 {
-	QPalette palette;
-	palette.setBrush(backgroundRole(), m_renderer.spritePixmap("background", ev->size()));
-	setPalette(palette);
-	setAutoFillBackground(true);
-
 	QSize boardSize = ev->size();
 	m_board->resize(boardSize);
-	m_board->moveTo((ev->size().width() - boardSize.width()) / 2,
-			(ev->size().height() - boardSize.height()) / 2);
-
 	redraw();
 }
 
@@ -260,20 +259,23 @@
 {
 	if (size().isEmpty())
 		return;
-
+	QGraphicsItem* item;
 	switch (m_state)
 	{
 	case BeforeFirstGame:
-		m_board->hide();
+		foreach (item, m_board->items())
+			item->hide();
 		generateOverlay();
 		m_overlay->show();
 		break;
 	case Running:
-		m_board->show();
+		foreach (item, m_board->items())
+			item->show();
 		m_overlay->hide();
 		break;
 	default:
-		m_board->show();
+		foreach (item, m_board->items())
+			item->show();
 		generateOverlay();
 		m_overlay->show();
 		break;
@@ -334,7 +336,8 @@
 	p.end();
 
 	m_overlay->setPixmap(px);
-	m_overlay->moveTo((size().width() - itemWidth) / 2, (size().height() - itemHeight) / 2);
+	m_overlay->setPos((size().width() - itemWidth) / 2, (size().height() - itemHeight) / 2);
+	m_overlay->setZValue(OVERLAY_Z_VALUE);
 }
 
 void BomberGameWidget::onLevelCleared()
--- trunk/KDE/kdegames/bomber/src/bomberwidget.h #1289572:1289573
@@ -22,8 +22,7 @@
 
 #include "board.h"
 
-#include <KGameCanvas>
-#include <KGameRenderer>
+#include <QGraphicsView>
 #include <QMouseEvent>
 
 class KgThemeProvider;
@@ -31,7 +30,7 @@
 /**
  * This is the main game widget class. It manages things like the lives, source coutns and game states.
  */
-class BomberGameWidget: public KGameCanvasWidget
+class BomberGameWidget: public QGraphicsView
 {
 Q_OBJECT
 
@@ -184,7 +183,8 @@
 	QTimer *m_clock;
 	BomberBoard *m_board;
 
-	KGameCanvasPixmap *m_overlay;
+	QGraphicsPixmapItem *m_overlay;
+
 };
 
 #endif
--- trunk/KDE/kdegames/bomber/src/building.cpp #1289572:1289573
@@ -19,7 +19,7 @@
 #include "building.h"
 
 #include "board.h"
-
+#include <KGameRenderedItem>
 #include <KRandom>
 
 /**
@@ -49,6 +49,8 @@
 
 Building::~Building()
 {
+	foreach (KGameRenderedItem *tile, m_buildingTiles)
+		m_board->removeItem(tile);
 	qDeleteAll(m_buildingTiles);
 }
 
@@ -60,6 +62,8 @@
 		for (unsigned int i = 1; i <= m_height - height; i++)
 		{
 			m_buildingTiles.at(m_height - i)->hide();
+			m_board->removeItem(m_buildingTiles.at(m_height - i));
+			delete m_buildingTiles.at(m_height - i);
 			m_buildingTiles.removeAt(m_height - i);
 		}
 	}
@@ -93,26 +97,20 @@
 	const QString pixmap = QString::fromLatin1("roof_%1_0").arg(style);
 	m_buildingTiles.append(createBuildingTile(pixmap));
 	m_boundingRect.moveTo(m_xPos, BUILD_BASE_LOCATION - m_height + 1);
+	foreach (KGameRenderedItem *tile, m_buildingTiles)
+		m_board->addItem(tile);
 }
 
-KGameCanvasRenderedPixmap *Building::createBuildingTile(const QString& pixmap)
+KGameRenderedItem *Building::createBuildingTile(const QString& pixmap)
 {
-	KGameCanvasRenderedPixmap* tile = new KGameCanvasRenderedPixmap(m_renderer, pixmap, m_board);
+	KGameRenderedItem* tile = new KGameRenderedItem(m_renderer, pixmap);
 	tile->setRenderSize(QSize(32, 64));
 	return tile;
 }
 
-void Building::raise()
-{
-	foreach(KGameCanvasRenderedPixmap *tile, m_buildingTiles)
-	{
-		tile->raise();
-	}
-}
-
 void Building::show()
 {
-	foreach(KGameCanvasRenderedPixmap *tile, m_buildingTiles)
+	foreach(KGameRenderedItem *tile, m_buildingTiles)
 	{
 		tile->show();
 	}
@@ -124,9 +122,9 @@
 			static_cast<unsigned int> (BUILDING_RELATIVE_HEIGHT * size.height()));
 	for (int i = 0; i < m_buildingTiles.size(); i++)
 	{
-		KGameCanvasRenderedPixmap *tile = m_buildingTiles.at(i);
+		KGameRenderedItem *tile = m_buildingTiles.at(i);
 		tile->setRenderSize(tileSize);
-		tile->moveTo(m_board->mapPosition(QPointF(m_xPos, BUILD_BASE_LOCATION - i)));
+		tile->setPos(m_board->mapPosition(QPointF(m_xPos, BUILD_BASE_LOCATION - i)));
 	}
 }
 
@@ -148,4 +146,4 @@
 unsigned int Building::height() const
 {
 	return m_height;
-}
+}
\ No newline at end of file
--- trunk/KDE/kdegames/bomber/src/building.h #1289572:1289573
@@ -23,7 +23,7 @@
 #include <QtCore/QSize>
 #include <QtCore/QList>
 
-class KGameCanvasRenderedPixmap;
+class KGameRenderedItem;
 class KGameRenderer;
 class BomberBoard;
 
@@ -61,10 +61,7 @@
 	 */
 	void setFrame(unsigned int frame);
 
-	/** Restacks the building item on the top of the canvas. */
-	void raise();
-
-	/** Show the building item on the game canvas */
+	/** Show the building item on the game scene */
 	void show();
 
 	/**
@@ -95,13 +92,13 @@
 	 * \param pixmap The pixmap the building tile should be created with
 	 * \return The new created building tile
 	 */
-	KGameCanvasRenderedPixmap *createBuildingTile(const QString& pixmap);
+	KGameRenderedItem *createBuildingTile(const QString& pixmap);
 
 	unsigned int m_height;
 	QRectF m_boundingRect;
 	KGameRenderer *m_renderer;
 	BomberBoard *m_board;
-	QList<KGameCanvasRenderedPixmap*> m_buildingTiles;
+	QList<KGameRenderedItem*> m_buildingTiles;
 
 	qreal m_xPos;
 };
--- trunk/KDE/kdegames/bomber/src/explodable.cpp #1289572:1289573
@@ -36,7 +36,7 @@
 Explodable::Explodable(const QString& mainSvg, const QString& explosionSvg,
 		qreal relativeWidth, qreal relativeHeight, KGameRenderer *renderer,
 		BomberBoard *board) :
-	KGameCanvasRenderedPixmap(renderer, mainSvg, board), m_board(board), m_mainSvg(
+	KGameRenderedItem(renderer, mainSvg), m_board(board), m_mainSvg(
 			mainSvg), m_explosionSvg(explosionSvg)
 {
 	setRenderSize(QSize(32, 64));
@@ -45,7 +45,7 @@
 	resetPixmaps();
 	m_state = Moving;
 	m_nextBoundingRect.setSize(QSizeF(m_relativeWidth, m_relativeHeight));
-	moveTo(m_board->mapPosition(QPointF(m_xPos, m_yPos)));
+	setPos(m_board->mapPosition(QPointF(m_xPos, m_yPos)));
 }
 
 Explodable::~Explodable()
@@ -61,7 +61,7 @@
 void Explodable::update()
 {
 	setFrame(frame() + 1);
-	moveTo(m_board->mapPosition(QPointF(m_xPos, m_yPos)));
+	setPos(m_board->mapPosition(QPointF(m_xPos, m_yPos)));
 }
 
 void Explodable::resize(const QSize& tileSize)
@@ -81,7 +81,7 @@
 			EXPLOSION_RELATIVE_SIZE_H * tileSize.height()
 		));
 	}
-	moveTo(m_board->mapPosition(QPointF(m_xPos, m_yPos)));
+	setPos(m_board->mapPosition(QPointF(m_xPos, m_yPos)));
 }
 
 void Explodable::setVelocity(qreal vX)
--- trunk/KDE/kdegames/bomber/src/explodable.h #1289572:1289573
@@ -19,14 +19,14 @@
 #ifndef EXPLODABLE_H
 #define EXPLODABLE_H
 
-#include "kgamecanvas.h"
+#include <KGameRenderedItem>
 
 class BomberBoard;
 
 /**
  * This is a game object that can explode.
  */
-class Explodable: public KGameCanvasRenderedPixmap
+class Explodable: public KGameRenderedItem
 {
 public:
 	/** The states that a bomb can be in */
--- trunk/KDE/kdegames/bomber/src/main.cpp #1289572:1289573
@@ -20,7 +20,6 @@
 #include <kaboutdata.h>
 #include <kcmdlineargs.h>
 #include <KDE/KLocale>
-#include <kdebug.h>
 
 static const char description[] = I18N_NOOP("Arcade bombing game");
 
@@ -33,6 +32,8 @@
 			KLocalizedString(), 0, "jp@stanwood.org.uk");
 	about.addAuthor(ki18n("John-Paul Stanford"), KLocalizedString(),
 			"jp@stanwood.org.uk");
+	about.addAuthor(ki18n("Mehmet Emre"), ki18n("Porting to QGraphicsView."),
+			"maemre2@gmail.com");
 	KCmdLineArgs::init(argc, argv, &about);
 
 	KApplication app;
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic