From da42fe8f58197c01da1ca969b8ebdc281d0d382d Mon Sep 17 00:00:00 2001 From: buull Date: Thu, 19 Aug 2010 20:52:32 +0300 Subject: [PATCH] add loader add schema new loader model using xml separated work and load data validation using schema map data in xml new core model... proecting --- Makefile | 57 +++++- adcore.cpp | 38 ++-- adcore.h | 2 + aliendefender.pro | 17 +- aliendefender.pro.user | 29 +-- aliens.cpp | 48 ++--- aliens.h | 4 +- base_types.h | 19 +- data.xml | 27 +++ example16x16_64.map | 1 + game_data.h | 14 +- loader.cpp | 401 +++++++++++++++++++++++++++++++++++++++++ loader.h | 164 +++++++++++++++++ main.cpp | 8 +- map.cpp | 28 ++- map.h | 15 +- player.h | 4 +- schema.xml | 158 ++++++++++++++++ towers.cpp | 37 ++-- towers.h | 12 +- 20 files changed, 943 insertions(+), 140 deletions(-) create mode 100644 data.xml create mode 100644 example16x16_64.map create mode 100644 loader.cpp create mode 100644 loader.h create mode 100644 schema.xml diff --git a/Makefile b/Makefile index 7d76f8d..2b1c81e 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ ############################################################################# # Makefile for building: aliendefender -# Generated by qmake (2.01a) (Qt 4.6.2) on: ?? ???? 30 01:35:39 2010 +# Generated by qmake (2.01a) (Qt 4.6.2) on: ?? ???. 17 20:37:06 2010 # Project: aliendefender.pro # Template: app # Command: /usr/bin/qmake-qt4 -spec /usr/share/qt4/mkspecs/linux-g++ -unix CONFIG+=debug -o Makefile aliendefender.pro @@ -10,13 +10,13 @@ CC = gcc CXX = g++ -DEFINES = -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED +DEFINES = -DQT_XMLPATTERNS_LIB -DQT_XML_LIB -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_SHARED CFLAGS = -pipe -g -Wall -W -D_REENTRANT $(DEFINES) CXXFLAGS = -pipe -g -Wall -W -D_REENTRANT $(DEFINES) -INCPATH = -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. +INCPATH = -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtNetwork -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtOpenGL -I/usr/include/qt4/QtXml -I/usr/include/qt4/QtXmlPatterns -I/usr/include/qt4 -I/usr/X11R6/include -I. LINK = g++ LFLAGS = -LIBS = $(SUBLIBS) -L/usr/lib -lQtGui -lQtCore -lpthread +LIBS = $(SUBLIBS) -L/usr/lib -L/usr/X11R6/lib -lQtXmlPatterns -lQtXml -lQtOpenGL -lQtGui -lQtNetwork -lQtCore -lGLU -lGL -lpthread AR = ar cqs RANLIB = QMAKE = /usr/bin/qmake-qt4 @@ -51,13 +51,15 @@ SOURCES = map.cpp \ splashes.cpp \ adcore.cpp \ player.cpp \ - settreader.cpp moc_map.cpp \ + settreader.cpp \ + loader.cpp moc_map.cpp \ moc_game_data.cpp \ moc_aliens.cpp \ moc_towers.cpp \ moc_splashes.cpp \ moc_adcore.cpp \ moc_player.cpp \ + moc_loader.cpp \ qrc_images.cpp OBJECTS = map.o \ game_data.o \ @@ -68,6 +70,7 @@ OBJECTS = map.o \ adcore.o \ player.o \ settreader.o \ + loader.o \ moc_map.o \ moc_game_data.o \ moc_aliens.o \ @@ -75,6 +78,7 @@ OBJECTS = map.o \ moc_splashes.o \ moc_adcore.o \ moc_player.o \ + moc_loader.o \ qrc_images.o DIST = /usr/share/qt4/mkspecs/common/g++.conf \ /usr/share/qt4/mkspecs/common/unix.conf \ @@ -88,6 +92,7 @@ DIST = /usr/share/qt4/mkspecs/common/g++.conf \ /usr/share/qt4/mkspecs/features/default_post.prf \ /usr/share/qt4/mkspecs/features/warn_on.prf \ /usr/share/qt4/mkspecs/features/qt.prf \ + /usr/share/qt4/mkspecs/features/unix/opengl.prf \ /usr/share/qt4/mkspecs/features/unix/thread.prf \ /usr/share/qt4/mkspecs/features/moc.prf \ /usr/share/qt4/mkspecs/features/resources.prf \ @@ -139,6 +144,7 @@ Makefile: aliendefender.pro /usr/share/qt4/mkspecs/linux-g++/qmake.conf /usr/sh /usr/share/qt4/mkspecs/features/default_post.prf \ /usr/share/qt4/mkspecs/features/warn_on.prf \ /usr/share/qt4/mkspecs/features/qt.prf \ + /usr/share/qt4/mkspecs/features/unix/opengl.prf \ /usr/share/qt4/mkspecs/features/unix/thread.prf \ /usr/share/qt4/mkspecs/features/moc.prf \ /usr/share/qt4/mkspecs/features/resources.prf \ @@ -146,7 +152,11 @@ Makefile: aliendefender.pro /usr/share/qt4/mkspecs/linux-g++/qmake.conf /usr/sh /usr/share/qt4/mkspecs/features/yacc.prf \ /usr/share/qt4/mkspecs/features/lex.prf \ /usr/share/qt4/mkspecs/features/include_source_dir.prf \ + /usr/lib/libQtXmlPatterns.prl \ + /usr/lib/libQtXml.prl \ + /usr/lib/libQtOpenGL.prl \ /usr/lib/libQtGui.prl \ + /usr/lib/libQtNetwork.prl \ /usr/lib/libQtCore.prl $(QMAKE) -spec /usr/share/qt4/mkspecs/linux-g++ -unix CONFIG+=debug -o Makefile aliendefender.pro /usr/share/qt4/mkspecs/common/g++.conf: @@ -161,6 +171,7 @@ Makefile: aliendefender.pro /usr/share/qt4/mkspecs/linux-g++/qmake.conf /usr/sh /usr/share/qt4/mkspecs/features/default_post.prf: /usr/share/qt4/mkspecs/features/warn_on.prf: /usr/share/qt4/mkspecs/features/qt.prf: +/usr/share/qt4/mkspecs/features/unix/opengl.prf: /usr/share/qt4/mkspecs/features/unix/thread.prf: /usr/share/qt4/mkspecs/features/moc.prf: /usr/share/qt4/mkspecs/features/resources.prf: @@ -168,14 +179,18 @@ Makefile: aliendefender.pro /usr/share/qt4/mkspecs/linux-g++/qmake.conf /usr/sh /usr/share/qt4/mkspecs/features/yacc.prf: /usr/share/qt4/mkspecs/features/lex.prf: /usr/share/qt4/mkspecs/features/include_source_dir.prf: +/usr/lib/libQtXmlPatterns.prl: +/usr/lib/libQtXml.prl: +/usr/lib/libQtOpenGL.prl: /usr/lib/libQtGui.prl: +/usr/lib/libQtNetwork.prl: /usr/lib/libQtCore.prl: qmake: FORCE @$(QMAKE) -spec /usr/share/qt4/mkspecs/linux-g++ -unix CONFIG+=debug -o Makefile aliendefender.pro dist: @$(CHK_DIR_EXISTS) .tmp/aliendefender1.0.0 || $(MKDIR) .tmp/aliendefender1.0.0 - $(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/aliendefender1.0.0/ && $(COPY_FILE) --parents base_types.h map.h game_data.h aliens.h towers.h splashes.h adcore.h player.h settreader.h .tmp/aliendefender1.0.0/ && $(COPY_FILE) --parents images.qrc .tmp/aliendefender1.0.0/ && $(COPY_FILE) --parents map.cpp game_data.cpp aliens.cpp towers.cpp main.cpp splashes.cpp adcore.cpp player.cpp settreader.cpp .tmp/aliendefender1.0.0/ && (cd `dirname .tmp/aliendefender1.0.0` && $(TAR) aliendefender1.0.0.tar aliendefender1.0.0 && $(COMPRESS) aliendefender1.0.0.tar) && $(MOVE) `dirname .tmp/aliendefender1.0.0`/aliendefender1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/aliendefender1.0.0 + $(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/aliendefender1.0.0/ && $(COPY_FILE) --parents base_types.h map.h game_data.h aliens.h towers.h splashes.h adcore.h player.h settreader.h loader.h .tmp/aliendefender1.0.0/ && $(COPY_FILE) --parents images.qrc .tmp/aliendefender1.0.0/ && $(COPY_FILE) --parents map.cpp game_data.cpp aliens.cpp towers.cpp main.cpp splashes.cpp adcore.cpp player.cpp settreader.cpp loader.cpp .tmp/aliendefender1.0.0/ && (cd `dirname .tmp/aliendefender1.0.0` && $(TAR) aliendefender1.0.0.tar aliendefender1.0.0 && $(COMPRESS) aliendefender1.0.0.tar) && $(MOVE) `dirname .tmp/aliendefender1.0.0`/aliendefender1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/aliendefender1.0.0 clean:compiler_clean @@ -194,9 +209,9 @@ mocclean: compiler_moc_header_clean compiler_moc_source_clean mocables: compiler_moc_header_make_all compiler_moc_source_make_all -compiler_moc_header_make_all: moc_map.cpp moc_game_data.cpp moc_aliens.cpp moc_towers.cpp moc_splashes.cpp moc_adcore.cpp moc_player.cpp +compiler_moc_header_make_all: moc_map.cpp moc_game_data.cpp moc_aliens.cpp moc_towers.cpp moc_splashes.cpp moc_adcore.cpp moc_player.cpp moc_loader.cpp compiler_moc_header_clean: - -$(DEL_FILE) moc_map.cpp moc_game_data.cpp moc_aliens.cpp moc_towers.cpp moc_splashes.cpp moc_adcore.cpp moc_player.cpp + -$(DEL_FILE) moc_map.cpp moc_game_data.cpp moc_aliens.cpp moc_towers.cpp moc_splashes.cpp moc_adcore.cpp moc_player.cpp moc_loader.cpp moc_map.cpp: base_types.h \ settreader.h \ map.h @@ -241,6 +256,7 @@ moc_adcore.cpp: aliens.h \ settreader.h \ towers.h \ splashes.h \ + loader.h \ adcore.h /usr/bin/moc-qt4 $(DEFINES) $(INCPATH) adcore.h -o moc_adcore.cpp @@ -250,6 +266,14 @@ moc_player.cpp: map.h \ player.h /usr/bin/moc-qt4 $(DEFINES) $(INCPATH) player.h -o moc_player.cpp +moc_loader.cpp: game_data.h \ + player.h \ + map.h \ + base_types.h \ + settreader.h \ + loader.h + /usr/bin/moc-qt4 $(DEFINES) $(INCPATH) loader.h -o moc_loader.cpp + compiler_rcc_make_all: qrc_images.cpp compiler_rcc_clean: -$(DEL_FILE) qrc_images.cpp @@ -329,7 +353,8 @@ main.o: main.cpp adcore.h \ base_types.h \ settreader.h \ towers.h \ - splashes.h + splashes.h \ + loader.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o main.cpp splashes.o: splashes.cpp splashes.h \ @@ -348,7 +373,8 @@ adcore.o: adcore.cpp adcore.h \ base_types.h \ settreader.h \ towers.h \ - splashes.h + splashes.h \ + loader.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o adcore.o adcore.cpp player.o: player.cpp player.h \ @@ -360,6 +386,14 @@ player.o: player.cpp player.h \ settreader.o: settreader.cpp settreader.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o settreader.o settreader.cpp +loader.o: loader.cpp loader.h \ + game_data.h \ + player.h \ + map.h \ + base_types.h \ + settreader.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o loader.o loader.cpp + moc_map.o: moc_map.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_map.o moc_map.cpp @@ -381,6 +415,9 @@ moc_adcore.o: moc_adcore.cpp moc_player.o: moc_player.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_player.o moc_player.cpp +moc_loader.o: moc_loader.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_loader.o moc_loader.cpp + qrc_images.o: qrc_images.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o qrc_images.o qrc_images.cpp diff --git a/adcore.cpp b/adcore.cpp index 557afea..974e21d 100644 --- a/adcore.cpp +++ b/adcore.cpp @@ -4,23 +4,27 @@ adCore::adCore(QObject *parent) : QThread(parent) { step = 0; - admap = new Map(1); - addata = new Game_Data(admap); - Player * pl1 = new Player(0); - Player * pl2 = new Player(0); - addata->players.push_back(pl1); - addata->players.push_back(pl2); - adaliens = new Aliens(addata); - adtowers = new Towers(addata); - adsplashes = new Splashes(addata); - connect(admap,SIGNAL(RecreateAlienPath(bool*)),adaliens,SLOT(retrace(bool*))); - adaliens->AddAlien(0); - adaliens->AddAlien(0); - adaliens->AddAlien(0); - for (int i=0; imapsize.width(),admap->mapsize.height()); i++) - adtowers->AddTower(0,0,QPoint(i,i)); - for (int i=0; imapsize.height();i++) - adtowers->AddTower(1,0,QPoint(admap->mapsize.width()-2,i)); + //admap = new Map(1); + //addata = new Game_Data(admap); + adload = new Loader(); + //admap->load(); + //adload->create(); + //adload->readAliens(); +// Player * pl1 = new Player(0); +// Player * pl2 = new Player(0); +// addata->players.push_back(pl1); +// addata->players.push_back(pl2); +// adaliens = new Aliens(addata); +// adtowers = new Towers(addata); +// adsplashes = new Splashes(addata); +// connect(admap,SIGNAL(RecreateAlienPath(bool*)),adaliens,SLOT(retrace(bool*))); +// adaliens->AddAlien(0); +// adaliens->AddAlien(0); +// adaliens->AddAlien(0); +// for (int i=0; imapsize.width(),admap->mapsize.height()); i++) +// adtowers->AddTower(0,0,QPoint(i,i)); +// for (int i=0; imapsize.height();i++) +// adtowers->AddTower(1,0,QPoint(admap->mapsize.width()-2,i)); } diff --git a/adcore.h b/adcore.h index d0df86a..4731c71 100644 --- a/adcore.h +++ b/adcore.h @@ -7,6 +7,7 @@ #include "aliens.h" #include "towers.h" #include "splashes.h" +#include "loader.h" class adCore : public QThread { @@ -19,6 +20,7 @@ public: Aliens *adaliens; Towers *adtowers; Splashes *adsplashes; + Loader * adload; int step; signals: diff --git a/aliendefender.pro b/aliendefender.pro index 3a8f4f1..5272a74 100644 --- a/aliendefender.pro +++ b/aliendefender.pro @@ -6,7 +6,8 @@ HEADERS += base_types.h \ splashes.h \ adcore.h \ player.h \ - settreader.h + settreader.h \ + loader.h SOURCES += map.cpp \ game_data.cpp \ aliens.cpp \ @@ -15,8 +16,18 @@ SOURCES += map.cpp \ splashes.cpp \ adcore.cpp \ player.cpp \ - settreader.cpp + settreader.cpp \ + loader.cpp RESOURCES += images.qrc OTHER_FILES += map.conf \ example16x16.map \ - example16x12.map + example16x12.map \ + data.xml \ + schema.xml \ + example16x16_64.map +QT += core \ + gui \ + network \ + opengl \ + xml \ + xmlpatterns diff --git a/aliendefender.pro.user b/aliendefender.pro.user index 7a5b14d..e497b48 100644 --- a/aliendefender.pro.user +++ b/aliendefender.pro.user @@ -58,6 +58,7 @@ Debug 2 0 + 2 @@ -66,7 +67,7 @@ Debug - DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-oJVJLhEuxX,guid=dd326939f06256af8e013dce4c50f54e + DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-5i8Go7nPio,guid=870ffe971971ceac89206f0e4c5facbd DEFAULTS_PATH=/usr/share/gconf/gnome.default.path DESKTOP_SESSION=gnome DISPLAY=:0.0 @@ -74,7 +75,7 @@ GDM_KEYBOARD_LAYOUT=us GDM_LANG=ru_RU.UTF-8 GNOME_DESKTOP_SESSION_ID=this-is-deprecated - GNOME_KEYRING_CONTROL=/tmp/keyring-UECX54 + GNOME_KEYRING_CONTROL=/tmp/keyring-7vXnOW GTK_MODULES=canberra-gtk-module HOME=/home/andrey LANG=ru_RU.UTF-8 @@ -85,17 +86,17 @@ PATH=/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games PWD=/home/andrey QTDIR=/usr/share/qt4 - SESSION_MANAGER=local/buull-eeePC:@/tmp/.ICE-unix/1144,unix/buull-eeePC:/tmp/.ICE-unix/1144 + SESSION_MANAGER=local/buull-eeePC:@/tmp/.ICE-unix/1124,unix/buull-eeePC:/tmp/.ICE-unix/1124 SHELL=/bin/bash SPEECHD_PORT=6561 - SSH_AGENT_PID=1178 - SSH_AUTH_SOCK=/tmp/keyring-UECX54/ssh + SSH_AGENT_PID=1158 + SSH_AUTH_SOCK=/tmp/keyring-7vXnOW/ssh USER=andrey USERNAME=andrey - XAUTHORITY=/var/run/gdm/auth-for-andrey-SArBRZ/database + XAUTHORITY=/var/run/gdm/auth-for-andrey-HWCXAG/database XDG_CONFIG_DIRS=/etc/xdg/xdg-gnome:/etc/xdg XDG_DATA_DIRS=/usr/share/gnome:/usr/local/share/:/usr/share/ - XDG_SESSION_COOKIE=f0649decca52f2beb55c9ea74ad1d028-1280374094.93008-1317282182 + XDG_SESSION_COOKIE=f0649decca52f2beb55c9ea74ad1d028-1281338556.676663-803309736 /home/andrey/AD/aliendefender/aliendefender.pro @@ -114,7 +115,7 @@ Debug - DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-oJVJLhEuxX,guid=dd326939f06256af8e013dce4c50f54e + DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-5i8Go7nPio,guid=870ffe971971ceac89206f0e4c5facbd DEFAULTS_PATH=/usr/share/gconf/gnome.default.path DESKTOP_SESSION=gnome DISPLAY=:0.0 @@ -122,7 +123,7 @@ GDM_KEYBOARD_LAYOUT=us GDM_LANG=ru_RU.UTF-8 GNOME_DESKTOP_SESSION_ID=this-is-deprecated - GNOME_KEYRING_CONTROL=/tmp/keyring-UECX54 + GNOME_KEYRING_CONTROL=/tmp/keyring-7vXnOW GTK_MODULES=canberra-gtk-module HOME=/home/andrey LANG=ru_RU.UTF-8 @@ -133,17 +134,17 @@ PATH=/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games PWD=/home/andrey QTDIR=/usr/share/qt4 - SESSION_MANAGER=local/buull-eeePC:@/tmp/.ICE-unix/1144,unix/buull-eeePC:/tmp/.ICE-unix/1144 + SESSION_MANAGER=local/buull-eeePC:@/tmp/.ICE-unix/1124,unix/buull-eeePC:/tmp/.ICE-unix/1124 SHELL=/bin/bash SPEECHD_PORT=6561 - SSH_AGENT_PID=1178 - SSH_AUTH_SOCK=/tmp/keyring-UECX54/ssh + SSH_AGENT_PID=1158 + SSH_AUTH_SOCK=/tmp/keyring-7vXnOW/ssh USER=andrey USERNAME=andrey - XAUTHORITY=/var/run/gdm/auth-for-andrey-SArBRZ/database + XAUTHORITY=/var/run/gdm/auth-for-andrey-HWCXAG/database XDG_CONFIG_DIRS=/etc/xdg/xdg-gnome:/etc/xdg XDG_DATA_DIRS=/usr/share/gnome:/usr/local/share/:/usr/share/ - XDG_SESSION_COOKIE=f0649decca52f2beb55c9ea74ad1d028-1280374094.93008-1317282182 + XDG_SESSION_COOKIE=f0649decca52f2beb55c9ea74ad1d028-1281338556.676663-803309736 false diff --git a/aliens.cpp b/aliens.cpp index 1b32dde..3fe8ca8 100644 --- a/aliens.cpp +++ b/aliens.cpp @@ -7,17 +7,16 @@ Aliens::Aliens(Game_Data *gd, QObject *parent) : { gameData = gd; nextId = 0; - Alien al; - al.speed = 0.1f; - al.health = 10; - al.type = 0; - gameData->srcAliens.push_back(al); } void Aliens::AddAlien(int srcId) { - if (srcId < 0 || srcId >= gameData->srcAliens.size()) qDebug("ERROR out of aliens range"),exit(-1); + if (srcId < 0 || srcId >= gameData->srcAliens.size()) + { + qCritical("ERROR out of aliens range"); + return; + } Alien al = gameData->srcAliens.at(srcId); al.Id = nextId; al.finish = gameData->map->finishs.at(qrand()%gameData->map->finishs.size()); @@ -25,21 +24,21 @@ void Aliens::AddAlien(int srcId) al.pos = QPointF(gameData->map->starts.at(qrand()%gameData->map->starts.size())); al.path = gameData->map->CreatePath(al.pos.toPoint(),al.finish); al.pathIndex = 1; - if (al.path.isEmpty()) qDebug("ERROR create path"),exit(-1); + if (al.path.isEmpty()) qFatal("ERROR create path"); qDebug() << al.path; - gameData->map->printMap(); + //gameData->map->printMap(); + gameData->curAliens.insert(al.Id,al); nextId++; - gameData->curAliens.push_back(al); } void Aliens::retrace(bool *OK) { - qDebug("retarce!"); + qDebug("re-trace!"); gameData->map->removeAliensPath(); for (int i=0; icurAliens.size(); i++) { - Alien al = gameData->curAliens.at(i); + Alien al = gameData->curAliens.take(i); al.path = gameData->map->CreatePath(al.pos.toPoint(),al.finish); al.pathIndex = 1; if (al.path.isEmpty()) *OK = false; @@ -47,33 +46,18 @@ void Aliens::retrace(bool *OK) } -void Aliens::DelAlien(int index) +void Aliens::DelAlien(int Id) { - gameData->curAliens.remove(index); -} - - -void Aliens::DelAlienById(int Id) -{ - DelAlien(AlienIndex(Id)); -} - - -int Aliens::AlienIndex(int alienId) -{ - int i=-1; - for (i=0; icurAliens.size(); i++) - if (gameData->curAliens.at(i).Id==alienId) return i; - return i; + gameData->curAliens.remove(Id); } void Aliens::update() { - QVector missIndex; + QList missIndex; for (int i=0; icurAliens.size(); i++) { - Alien al = gameData->curAliens.at(i); + Alien al = gameData->curAliens.values().at(i); //qDebug() << i; //if (al.health < 0) emit AlienKill(); float tmpdx,tmpdy,angl,arctg = 0; @@ -117,11 +101,11 @@ void Aliens::update() al.pos.setY(al.pos.y() -al.speed*std::cos(arctg)); //return true; - gameData->curAliens[i] = al; + gameData->curAliens[al.Id] = al; } for (int j=0; jmissingAliens++; - DelAlienById(missIndex.at(j)); + DelAlien(missIndex.at(j)); } } diff --git a/aliens.h b/aliens.h index 1e41018..eaea7e9 100644 --- a/aliens.h +++ b/aliens.h @@ -14,13 +14,11 @@ public: void AddAlien(int srcId); void nextWave(); void update(); - int AlienIndex(int alienId); int size() const {return gameData->curAliens.size();} signals: public slots: - void DelAlienById(int Id); - void DelAlien(int index); + void DelAlien(int Id); void retrace(bool * OK); private: Game_Data * gameData; diff --git a/base_types.h b/base_types.h index 1d9ab22..a80a638 100644 --- a/base_types.h +++ b/base_types.h @@ -2,11 +2,13 @@ #define BASE_TYPES_H #include +#include #include struct Alien { - int Id; + int Id; // uses for QHash + QString name; int type; QPointF pos; float angle; // -180 .. 180 @@ -15,19 +17,19 @@ struct Alien QPoint finish; QVector path; int pathIndex; - unsigned int gold; + unsigned int prise; }; struct Tower { - int Id; + QString name; int type; int AlienId; // aim alien int PlayerId; // tower's owner QPoint pos; // not QPointF because tower fixed on grid float angle; // -180 .. 180 - float range; + float range; // in cells float reload; // time for reload in ticks }; @@ -35,11 +37,12 @@ struct Tower struct Splash { int Id; + QString name; int type; - int TowerId; // parent tower + QPoint TowerId; // parent tower (-1;-1) for null parent int AlienId; // aim alien (different from tower.AlienId) int lifetime; // in ticks - float radius; + float radius; // in cells float angle; // -180 .. 180 QPointF pos; }; @@ -48,8 +51,8 @@ struct Splash struct Wave { int Id; - QVector types; // some types of aliens (e.g. 2 fly and 3 grount in one wave) - QVector counts; // count aliens of each type + QList types; // some types of aliens (e.g. 2 fly and 3 grount in one wave) + QList counts; // count aliens of each type int wait_time; // time in ticks unsigned int gold; }; diff --git a/data.xml b/data.xml new file mode 100644 index 0000000..6d65cc8 --- /dev/null +++ b/data.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example16x16_64.map b/example16x16_64.map new file mode 100644 index 0000000..5b1b119 --- /dev/null +++ b/example16x16_64.map @@ -0,0 +1 @@ +AAAERHicY2BgEGAA4v///0hQgmFmAGlGcjCxZuCTHzUDuxkMDOr85JrBwKC0A8kMJlwYagYOeYgZ+NXgNwMtPEbNINIMIsynOO8DAG0r1Q0= \ No newline at end of file diff --git a/game_data.h b/game_data.h index 4f23646..bfd0e7d 100644 --- a/game_data.h +++ b/game_data.h @@ -2,6 +2,7 @@ #define GAME_DATA_H #include +#include #include "player.h" @@ -10,12 +11,13 @@ class Game_Data : public QObject Q_OBJECT public: explicit Game_Data(Map * map, QObject *parent = 0); - QVector srcAliens; - QVector curAliens; - QVector curTowers; - QVector curSplashes; - QVector waves; - QVector players; + QList srcAliens; + QList srcTowers; + QHash curAliens; + QHash curTowers; + QHash curSplashes; + QList waves; + QList players; Map * map; int curWave; int missingAliens; diff --git a/loader.cpp b/loader.cpp new file mode 100644 index 0000000..c4b5bf2 --- /dev/null +++ b/loader.cpp @@ -0,0 +1,401 @@ +#include "loader.h" + +Loader::Loader(QObject *parent) : + QObject(parent) +{ + doc = new QDomDocument("data"); + //create(); + load(); +} + + +void Loader::load() +{ + validate(); + file = new QFile("data.xml"); + if (!file->open(QIODevice::ReadOnly)) + qFatal("No file data.xml found!"); + if (!doc->setContent(file)) + { + file->close(); + qFatal("Error parsing data.xml"); + } + readAliens(); + readMaps(); + readLevels(); + //readMorphs(); + //readSplashes(); + //readTowers(); + //readLevTowers(); + //readTriggers(); + readWaves(); + readWaveParts(); + readLevWaves(); + + file->close(); +} + + +void Loader::create() +{ + QFile cfile("data.xml"); + if (!cfile.open(QIODevice::WriteOnly)) + return; + cfile.resize(0); + // if (!doc.setContent(&file)) { + // file.close(); + // return; + // } + QDomElement elem; + QDomElement root = doc->createElement("ADdata"); + doc->appendChild(root); + QDomElement child = doc->createElement("aliens"); + root.appendChild(child); + elem = doc->createElement("alien"); + child.appendChild(elem); + elem.setAttribute("name","my alien"); + elem.setAttribute("speed",0.012); + elem.setAttribute("health",100); + elem.setAttribute("prise",0); + elem.setAttribute("id",10); + elem.setAttribute("imageType",1); + elem = doc->createElement("alien"); + child.appendChild(elem); + elem.setAttribute("name","MONSTR"); + elem.setAttribute("speed",0.0099); + elem.setAttribute("health",200); + elem.setAttribute("prise",1); + elem.setAttribute("id",12); + elem.setAttribute("imageType",1); + child = doc->createElement("towers"); + root.appendChild(child); + elem = doc->createElement("tower"); + child.appendChild(elem); + elem.setAttribute("name","my tower"); + elem.setAttribute("imageType",1); + elem.setAttribute("reload",20); + elem.setAttribute("buildTime",100); + elem.setAttribute("price",10); + elem.setAttribute("radius",1.2); + elem.setAttribute("splashType",0); + elem.setAttribute("id",0); + elem = doc->createElement("tower"); + child.appendChild(elem); + elem.setAttribute("name","Wall"); + elem.setAttribute("imageType",1); + elem.setAttribute("buildTime",300); + elem.setAttribute("reload",0); + elem.setAttribute("price",9); + elem.setAttribute("radius",0); + elem.setAttribute("splashType",0); + elem.setAttribute("id",1); + child = doc->createElement("maps"); + root.appendChild(child); + elem = doc->createElement("map"); + child.appendChild(elem); + elem.setAttribute("name","Map 16x16"); + elem.setAttribute("maxPlayers","2"); + elem.setAttribute("id",1); + elem.setAttribute("imageType",1); + elem.setAttribute("data",CreateMapExample()); + child = doc->createElement("splashes"); + root.appendChild(child); + elem = doc->createElement("splash"); + child.appendChild(elem); + elem.setAttribute("name","shot"); + elem.setAttribute("imageType",1); + elem.setAttribute("damage",2.5); + elem.setAttribute("speed",100); + elem.setAttribute("autoControl","true"); + elem.setAttribute("radius",1.2); + elem.setAttribute("id",0); + + cfile.write(doc->toByteArray()); + cfile.close(); +} + + +QString Loader::CreateMapExample() +{ + QVector < QVector < int > > Cells; + Cells.resize(16); + for (int i=0; ielementsByTagName("alien"); + for (int i=0; ielementsByTagName("wave"); + for (int i=0; ielementsByTagName("wavePart"); + for (int i=0; ielementsByTagName("waveOnLevel"); + for (int i=0; ielementsByTagName("level"); + for (int i=0; ielementsByTagName("splash"); + for (int i=0; ielementsByTagName("tower"); + for (int i=0; ielementsByTagName("map"); + for (int i=0; i> m.cells; + maps.insert(m.id,m); + qDebug() << tr("Map %1 id=%2 imgType=%3 maxPlayers=%5").arg(m.name).arg(m.id).arg(m.imgType).arg(m.maxPlayers); + for (int k=0; k +#include +#include +#include +#include +#include +#include +#include "game_data.h" + +struct tbAlien +{ + int id; + QString name; + float speed; + float health; + float armor; + float regeneration; + int imgType; + unsigned int prise; +}; + +struct tbSplash +{ + int id; + QString name; + float speed; + float radius; + unsigned int lifetime; + bool autoControl; + int imgType; +}; + +struct tbTrigger +{ + enum triggerType + { + onDestination, + onTimer, + onAlienInRadius + }; + int id; + float damage; + triggerType type; + unsigned int timer; + int count; + float randomPosRadius; +}; + +struct tbTower +{ + int id; + QString name; + float radius; + unsigned int price; + unsigned int reload; + unsigned int buildTime; + float expByShot; + float expByKill; + float expByDamage; + int splashId; +}; + +struct tbMorph +{ + int fromId; + int toId; + int cost; + float expRequired; +}; + +struct tbWavePart +{ + int waveId; + int alienId; + unsigned int count; +}; + +struct tbWave +{ + int id; + unsigned int timeout; + unsigned int prise; + int type; +}; + +struct tbWaveOnLevel +{ + int levelId; + int waveId; +}; + +struct tbMap +{ + int id; + QString name; + unsigned int maxPlayers; + QVector < QVector > cells; + int imgType; +}; + +struct tbTowerOnLevel +{ + int levelId; + int towerId; + int enableWaveId; +}; + +struct tbLevel +{ + int id; + QString name; + int mapId; +}; + + +class Loader : public QObject +{ + Q_OBJECT +public: + explicit Loader(QObject *parent = 0); + void create(); + void reload(); + void loadlevel(Game_Data * gd); +signals: + +public slots: + +private: + QDomDocument * doc; + QFile * file; + + QHash aliens; + QHash maps; + QHash levels; + QHash morphs; + QHash splashes; + QHash towers; + QHash levTowers; + QHash triggers; + QHash waves; + QMultiHash levWaves; + QMultiHash waveParts; + + void readAliens(); + void readMaps(); + void readLevels(); + void readMorphs(); + void readSplashes(); + void readTowers(); + void readLevTowers(); + void readTriggers(); + void readWaves(); + void readLevWaves(); + void readWaveParts(); + + void validate(); + void load(); + QString CreateMapExample(); +}; + +#endif // LOADER_H diff --git a/main.cpp b/main.cpp index 6bfee11..1789fac 100644 --- a/main.cpp +++ b/main.cpp @@ -8,8 +8,8 @@ int main(int argc, char *argv[]) { adCore core; QApplication a(argc, argv); - QTimer * timer = new QTimer(); - QObject::connect(timer,SIGNAL(timeout()),&core,SLOT(next())); - timer->start(100); - return a.exec(); + //QTimer * timer = new QTimer(); + //QObject::connect(timer,SIGNAL(timeout()),&core,SLOT(next())); + //timer->start(100); + //return a.exec(); } diff --git a/map.cpp b/map.cpp index 92ead4a..f0890e1 100644 --- a/map.cpp +++ b/map.cpp @@ -4,7 +4,12 @@ Map::Map(int Id, QObject *parent) : QObject(parent) { mapId=Id; - ReadSettings(); +} + + +void Map::load() +{ + //ReadSettings(); //CreateMapExample(); for (int i=0; iopen(QIODevice::ReadWrite); - QDataStream s(f); - s << Cells; + f->resize(0); + QByteArray ba; + QDataStream tmps(&ba,QIODevice::ReadWrite); + tmps << Cells; + ba = qCompress(ba); + ba = ba.toBase64(); + QString str(ba); +// QDataStream s(f); +// s << ba; + f->write(str.toUtf8()); + f->close(); delete f; } diff --git a/map.h b/map.h index 876b445..f9684b4 100644 --- a/map.h +++ b/map.h @@ -3,7 +3,7 @@ #include #include -#include +#include #include #include #include @@ -11,6 +11,8 @@ #include "base_types.h" #include "settreader.h" +// Maximum map is 65530 x 65530 because qHash may be repeat and towers has same Id + class Map : public QObject { Q_OBJECT @@ -37,10 +39,8 @@ public: // -1000 - it is wall or some place where you can't build QVector < QVector > Cells; - QVector < QVector > TmpCells; - QVector starts; - QVector finishs; - QSize mapsize; + QList starts; + QList finishs; int maxPlayers; explicit Map(int Id, QObject *parent = 0); @@ -50,7 +50,7 @@ public: void removeAliensPath(); QVector CreatePath(QPoint start, QPoint finish); QSize size() const {return mapsize;} - void ReadSettings(); + void load(); signals: void RecreateAlienPath(bool * pathOK); public slots: @@ -58,10 +58,13 @@ public slots: private: int mapId; + QSize mapsize; + QVector < QVector > TmpCells; QVector InvWaveTrace(QPoint finish, int cnt); int WaveTrace(QPoint start, QPoint finish); void CreateMapExample(); + void ReadSettings(); }; #endif // MAP_H diff --git a/player.h b/player.h index 94b712a..675ff13 100644 --- a/player.h +++ b/player.h @@ -12,8 +12,8 @@ public: explicit Player(int Id, QObject *parent = 0); unsigned long int adMoney; int selectAlienId; - QVector srcTowers; - QVector srcSplashes; + QList srcTowers; + QList srcSplashes; int playerId; signals: diff --git a/schema.xml b/schema.xml new file mode 100644 index 0000000..d484e27 --- /dev/null +++ b/schema.xml @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/towers.cpp b/towers.cpp index 221bcce..8d7e89a 100644 --- a/towers.cpp +++ b/towers.cpp @@ -4,7 +4,6 @@ Towers::Towers(Game_Data *gd, QObject *parent) : QObject(parent) { gameData = gd; - nextId = 0; Tower tw; for (int i=0; iplayers.size(); i++) gameData->players[i]->srcTowers.push_back(tw); @@ -12,42 +11,36 @@ Towers::Towers(Game_Data *gd, QObject *parent) : bool Towers::AddTower(int playerId, int srcId, QPoint pos) { - if (playerId < 0 || playerId >= gameData->players.size()) qDebug("ERROR out of players range"),exit(-1); - if (srcId < 0 || srcId >= gameData->players.at(playerId)->srcTowers.size()) qDebug("ERROR out of towers range"),exit(-1); + //QByteArray ar; + //ar << pos; + if (playerId < 0 || playerId >= gameData->players.size()) + { + qCritical("ERROR out of players range"); + return false; + } + if (srcId < 0 || srcId >= gameData->players.at(playerId)->srcTowers.size()) + { + qCritical("ERROR out of towers range"); + return false; + } Tower tw = gameData->players.at(playerId)->srcTowers.at(srcId); - tw.Id = nextId; if (gameData->map->addTowerOnMap(playerId,pos)) { tw.pos = pos; gameData->map->printMap(); - nextId++; - gameData->curTowers.push_back(tw); + gameData->curTowers.insert(tw.pos,tw); return true; } return false; } -void Towers::DelTower(int index) +void Towers::DelTower(QPoint pos) { - gameData->curTowers.remove(index); + gameData->curTowers.remove(pos); } -void Towers::DelTowerById(int Id) -{ - DelTower(TowerIndex(Id)); -} - - -int Towers::TowerIndex(int towerId) -{ - int i=-1; - for (i=0; icurTowers.size(); i++) - if (gameData->curTowers.at(i).Id==towerId) return i; - return i; -} - void Towers::update() { diff --git a/towers.h b/towers.h index 8940bed..ce7c36d 100644 --- a/towers.h +++ b/towers.h @@ -11,10 +11,7 @@ Q_OBJECT public: explicit Towers(Game_Data * gd, QObject *parent = 0); bool AddTower(int playerId, int srcId, QPoint pos); - void DelTowerById(int Id); - void DelTowerByPos(QPoint pos); - void DelTower(int index); - int TowerIndex(int towerId); + void DelTower(QPoint pos); void update(); int size() const {return gameData->curTowers.size();} signals: @@ -23,8 +20,11 @@ public slots: private: Game_Data * gameData; - - int nextId; }; +inline uint qHash(const QPoint &pos) +{ + return qHash(pos.x()) + (qHash(pos.y()) << 16); +} + #endif // TOWERS_H