diff options
| author | Samu Laaksonen <laaksonen.sj@gmail.com> | 2012-09-29 17:02:52 +0300 |
|---|---|---|
| committer | Samu Laaksonen <laaksonen.sj@gmail.com> | 2012-09-29 17:02:52 +0300 |
| commit | 87618947d1de7cdd1ff9a8047acec3279ef253b4 (patch) | |
| tree | 986b1c867878c373aa3c94a67ccfeedec9333576 | |
| parent | 1cf5a427a829b22abea7027b18a130a01da3ed6a (diff) | |
| download | prism-87618947d1de7cdd1ff9a8047acec3279ef253b4.tar.gz prism-87618947d1de7cdd1ff9a8047acec3279ef253b4.zip | |
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
| -rw-r--r-- | data/levels/level_1.tmx | 19 | ||||
| -rw-r--r-- | data/levels/tileset/tileset.png | bin | 695 -> 0 bytes | |||
| -rw-r--r-- | data/levels/tileset/tileset2.png | bin | 0 -> 2815 bytes | |||
| -rw-r--r-- | src/ActionScene.cpp | 99 | ||||
| -rw-r--r-- | src/ActionScene.h | 20 |
5 files changed, 111 insertions, 27 deletions
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 @@ <?xml version="1.0" encoding="UTF-8"?> <map version="1.0" orientation="orthogonal" width="25" height="15" tilewidth="32" tileheight="32"> - <tileset firstgid="1" name="base" tilewidth="32" tileheight="32"> - <image source="tileset/tileset.png" width="32" height="32"/> + <tileset firstgid="1" name="tileset2" tilewidth="32" tileheight="32"> + <image source="tileset/tileset2.png" width="96" height="96"/> </tileset> - <layer name="solidground" width="25" height="15"> + <layer name="solid" width="25" height="15"> + <properties> + <property name="type" value="solid"/> + </properties> <data encoding="base64" compression="zlib"> - eJxjYBgFwxUwomFS1ROjZ6iDweTfoRD+2NxIT3fisn8UY2IAdcAAZA== + eJxjYBgFo2BwARYgZgViNjT2SAKjYTBwAFfYU5PNDsQcQMxJQzYAG8cBgA== + </data> + </layer> + <layer name="plants" width="25" height="15"> + <properties> + <property name="type" value="covering"/> + </properties> + <data encoding="base64" compression="zlib"> + eJxjYBgFo4B4wAjETEDMjMYeSWA0DAYO4Ap7arKHCwAAgOgASg== </data> </layer> </map> diff --git a/data/levels/tileset/tileset.png b/data/levels/tileset/tileset.png Binary files differdeleted file mode 100644 index 017027b..0000000 --- a/data/levels/tileset/tileset.png +++ /dev/null diff --git a/data/levels/tileset/tileset2.png b/data/levels/tileset/tileset2.png Binary files differnew file mode 100644 index 0000000..a840ea9 --- /dev/null +++ b/data/levels/tileset/tileset2.png 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 <QDebug> #include <QGraphicsPixmapItem> #include <QGraphicsSceneMouseEvent> +#include <QKeyEvent> #include <QSettings> @@ -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<QPixmap> m_mapPixmaps; + + //! Items for map layers + QVector<QGraphicsPixmapItem*> 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(); |
