From 87618947d1de7cdd1ff9a8047acec3279ef253b4 Mon Sep 17 00:00:00 2001 From: Samu Laaksonen Date: Sat, 29 Sep 2012 17:02:52 +0300 Subject: Level loading update Improved level loading - added better first test level - mapLoader now loads all data layers from level files - TODO: further improve loader so it can read layer depths too - added unloadMap() to release resources used by levels --- data/levels/level_1.tmx | 19 ++++++-- data/levels/tileset/tileset.png | Bin 695 -> 0 bytes data/levels/tileset/tileset2.png | Bin 0 -> 2815 bytes src/ActionScene.cpp | 99 ++++++++++++++++++++++++++++++++------- src/ActionScene.h | 20 +++++--- 5 files changed, 111 insertions(+), 27 deletions(-) delete mode 100644 data/levels/tileset/tileset.png create mode 100644 data/levels/tileset/tileset2.png diff --git a/data/levels/level_1.tmx b/data/levels/level_1.tmx index 6d374fc..6c77c45 100644 --- a/data/levels/level_1.tmx +++ b/data/levels/level_1.tmx @@ -1,11 +1,22 @@ - - + + - + + + + - eJxjYBgFwxUwomFS1ROjZ6iDweTfoRD+2NxIT3fisn8UY2IAdcAAZA== + eJxjYBgFo2BwARYgZgViNjT2SAKjYTBwAFfYU5PNDsQcQMxJQzYAG8cBgA== + + + + + + + + eJxjYBgFo4B4wAjETEDMjMYeSWA0DAYO4Ap7arKHCwAAgOgASg== diff --git a/data/levels/tileset/tileset.png b/data/levels/tileset/tileset.png deleted file mode 100644 index 017027b..0000000 Binary files a/data/levels/tileset/tileset.png and /dev/null differ diff --git a/data/levels/tileset/tileset2.png b/data/levels/tileset/tileset2.png new file mode 100644 index 0000000..a840ea9 Binary files /dev/null and b/data/levels/tileset/tileset2.png differ diff --git a/src/ActionScene.cpp b/src/ActionScene.cpp index c121f33..cc6faa4 100644 --- a/src/ActionScene.cpp +++ b/src/ActionScene.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include @@ -43,10 +44,12 @@ ActionScene::ActionScene(const QString &name, const QRectF &rect, GameView *pare m_map = 0; m_mapRenderer = 0; + // initialize rand here qsrand(QTime::currentTime().msec()); + // TODO: implement some logic to randomize color bubbles given to player - m_hero = new Hero(this, QPointF(100, 300)); - connect(m_hero, SIGNAL(removeMe()), this, SLOT(removeSprite())); + //m_hero = new Hero(this, QPointF(100, 300)); + //connect(m_hero, SIGNAL(removeMe()), this, SLOT(removeSprite())); } ActionScene::~ActionScene() @@ -71,6 +74,33 @@ void ActionScene::updateLogic() void ActionScene::keyPressEvent(QKeyEvent *event) { QGraphicsScene::keyPressEvent(event); + + switch(event->key()) + { + // arrow up + case 16777235: + break; + // arrow down + case 16777237: + break; + // arrow left + case 16777234: + break; + // arrow right + case 16777236 : + break; + // button a + case 65: + break; + // button s + case 83: + break; + // button d + case 68 : + break; + default: + break; + } } void ActionScene::loadMap(QString target) @@ -94,25 +124,42 @@ void ActionScene::loadMap(QString target) qDebug() << "size" << m_map->width() << "x" << m_map->height(); qDebug() << "layers" << m_map->layerCount(); - QImage img(m_map->width() * m_map->tileWidth(), - m_map->height() * m_map->tileHeight(), - QImage::Format_ARGB32); + for(int layer = 0; layer < m_map->layerCount(); layer++) + { + QImage img(m_map->width() * m_map->tileWidth(), + m_map->height() * m_map->tileHeight(), + QImage::Format_ARGB32); + + QPainter painter(&img); + m_mapRenderer->drawTileLayer(&painter, m_map->layerAt(layer)->asTileLayer()); + + QPixmap mapPixmap = QPixmap::fromImage(img); + m_mapPixmaps.append(mapPixmap); - QPainter painter(&img); - m_mapRenderer->drawTileLayer(&painter, m_map->layerAt(0)->asTileLayer()); + qDebug() << "hasAlpha" << mapPixmap.hasAlpha() << "\n" + << "hasAlphaChannel" << mapPixmap.hasAlphaChannel(); - m_mapPixmap = QPixmap::fromImage(img); + QGraphicsPixmapItem* mapPixmapItem = addPixmap(mapPixmap); + mapPixmapItem->setPos(0, 0); + mapPixmapItem->setShapeMode(QGraphicsPixmapItem::MaskShape); - qDebug() << "hasAlpha" << m_mapPixmap.hasAlpha() << "\n" - << "hasAlphaChannel" << m_mapPixmap.hasAlphaChannel(); + QString type = m_map->layerAt(layer)->property("type"); - m_mapPixmapItem = addPixmap(m_mapPixmap); - m_mapPixmapItem->setPos(0, 0); - m_mapPixmapItem->setData(ITEM_OBJECTNAME, QString("SolidGround")); - m_mapPixmapItem->setShapeMode(QGraphicsPixmapItem::MaskShape); - m_mapPixmapItem->setZValue(1); + if (type == "solid") + { + mapPixmapItem->setData(ITEM_OBJECTNAME, QString("SolidGround")); + mapPixmapItem->setZValue(1); + } + else if (type == "covering") + { + mapPixmapItem->setData(ITEM_OBJECTNAME, QString("Covering")); + mapPixmapItem->setZValue(2); + } + + mapPixmapItem->setPixmap(mapPixmap); - m_mapPixmapItem->setPixmap(m_mapPixmap); + m_mapPixmapItems.append(mapPixmapItem); + } ObjectGroup* fish = NULL; @@ -138,6 +185,26 @@ void ActionScene::loadMap(QString target) m_clearAlert = false; } +void ActionScene::unloadMap() +{ + foreach(QGraphicsPixmapItem* removableItem, m_mapPixmapItems) + { + removeItem(removableItem); + } + + for(int i = m_mapPixmapItems.size() - 1; i > 0; i++) + delete m_mapPixmapItems.at(i); + + m_mapPixmapItems.clear(); + + m_mapPixmaps.clear(); + + if (m_mapRenderer) + delete m_mapRenderer; + if (m_map) + delete m_map; +} + void ActionScene::removeSprite() { qDebug() << "removing a sprite"; diff --git a/src/ActionScene.h b/src/ActionScene.h index 49fdb20..28d032b 100644 --- a/src/ActionScene.h +++ b/src/ActionScene.h @@ -31,6 +31,11 @@ public: */ void loadMap(QString target); + /** + * Unloads map, releasing its resources from memory + */ + void unloadMap(); + private: Tiled::Map *m_map; @@ -44,10 +49,16 @@ private: int m_levelScore; //! Map layer is drawn to this pixmap - QPixmap m_mapPixmap; + //QPixmap m_mapPixmap; //! Item for map layer - QGraphicsPixmapItem *m_mapPixmapItem; + //QGraphicsPixmapItem *m_mapPixmapItem; + + //! Map layers are drawn to these pixmaps + QVector m_mapPixmaps; + + //! Items for map layers + QVector m_mapPixmapItems; //! What portion of the map to draw QSize m_mapWindow; @@ -65,11 +76,6 @@ private: //! Stops graphics rendering while scene is cleared. bool m_clearAlert; - //! HP text item - QGraphicsTextItem* m_hpText; - //! Score text item - QGraphicsTextItem* m_scoreText; - signals: void gameOver(); -- cgit v1.2.3