From 001f1d11e977d5586fe8496821b3a1e4bf76f10c Mon Sep 17 00:00:00 2001 From: manuel Date: Thu, 14 Apr 2011 20:37:53 +0200 Subject: place actors at random positions --- pacman-c++/mainwidget.cpp | 46 +++++++++++++++++++----------------- pacman-c++/server.cpp | 4 ++++ pacman-c++/util.cpp | 60 ++++++++++++++++++++++++++++++++++++++++------- pacman-c++/util.h | 2 ++ 4 files changed, 81 insertions(+), 31 deletions(-) diff --git a/pacman-c++/mainwidget.cpp b/pacman-c++/mainwidget.cpp index a77daab..1fc7687 100644 --- a/pacman-c++/mainwidget.cpp +++ b/pacman-c++/mainwidget.cpp @@ -25,10 +25,12 @@ MainWidget::MainWidget(QWidget *parent) /* call updateMap after m_color ist set! */ createGui(); - Transmission::map_t map = Util::createDemoMap(); - m_scene->updateMap(map); - Util::deleteMap(map); - map = NULL; + + /* wait for the server to send the first map update (initial map) + * WARNING: this will block the gui + */ + m_socket->waitForReadyRead(); + tick(); connect(m_socket, SIGNAL(readyRead()), this, SLOT(tick())); @@ -84,7 +86,7 @@ void MainWidget::createGui() QGraphicsView *window = new QGraphicsView(m_scene, this); window->setFrameStyle(0); - window->setFixedSize(Constants::map_size_pixel.width, Constants::map_size_pixel.height); + window->setFixedSize(m_scene->sceneRect().size().toSize()); window->setWindowFlags(window->windowFlags() & ~Qt::WindowMaximizeButtonHint); window->setFocusPolicy(Qt::NoFocus); layout->addWidget(window, 0, Qt::AlignCenter); @@ -140,27 +142,27 @@ Transmission::field_t MainWidget::translateKey(int key) void MainWidget::tick() { - QSharedPointer data = Util::receivePacket(m_socket); - bool worked = m_updatepacket.ParseFromArray(data->data(), data->size()); - Q_ASSERT(worked); - Q_UNUSED(worked); - Transmission::map_t map = Util::createUninitialisedMap(); - Q_ASSERT(m_updatepacket.field_size() == (int) (Constants::map_size.width * Constants::map_size.height)); - int i = 0; - for (unsigned int x = 0; x < Constants::map_size.width; ++x) + while (m_socket->bytesAvailable() > (qint64)sizeof(qint64)) { - for (unsigned int y = 0; y < Constants::map_size.height; ++y) + QSharedPointer data = Util::receivePacket(m_socket); + bool worked = m_updatepacket.ParseFromArray(data->data(), data->size()); + Q_ASSERT(worked); + Q_UNUSED(worked); + Transmission::map_t map = Util::createUninitialisedMap(); + Q_ASSERT(m_updatepacket.field_size() == (int) (Constants::map_size.width * Constants::map_size.height)); + int i = 0; + for (unsigned int x = 0; x < Constants::map_size.width; ++x) { - map[x][y] = m_updatepacket.field(i); - ++i; + for (unsigned int y = 0; y < Constants::map_size.height; ++y) + { + map[x][y] = m_updatepacket.field(i); + ++i; + } } + m_scene->updateMap(map); + Util::deleteMap(map); + updateScore(m_updatepacket); } - m_scene->updateMap(map); - Util::deleteMap(map); - updateScore(m_updatepacket); - - if (m_socket->bytesAvailable() > (qint64)sizeof(qint64)) - tick(); } void MainWidget::keyPressEvent(QKeyEvent* event) diff --git a/pacman-c++/server.cpp b/pacman-c++/server.cpp index e09d126..a045cad 100644 --- a/pacman-c++/server.cpp +++ b/pacman-c++/server.cpp @@ -23,8 +23,12 @@ bool Server::run() if (!waitForClientConnections()) return false; + qDebug() << "[Server] Creating map..."; Transmission::map_t map = Util::createDemoMap(); + Util::placeActors(map, m_maxplayers, Color::order); + Util::makePoints(map); updateMap(map); + sendUpdate(map); Util::deleteMap(map); map = NULL; diff --git a/pacman-c++/util.cpp b/pacman-c++/util.cpp index eaf18e4..31d2e79 100644 --- a/pacman-c++/util.cpp +++ b/pacman-c++/util.cpp @@ -33,7 +33,6 @@ namespace Util delete[] map; } - // temporary Transmission::map_t createDemoMap() { Transmission::map_t map = createEmptyMap(); @@ -67,19 +66,64 @@ namespace Util if (tmpl[y][x] == '#') cur |= Color::none | Transmission::block; /* this is a simple hack to create areas where no - * autoplaced points will be placed (see below) + * autoplaced points/actors will be placed (see makePoints) */ else if (tmpl[y][x] == '.') cur |= Transmission::point; } } + return map; + } + + void placeActors(Transmission::map_t map, unsigned int players, const Color::Color *colors) + { + int mindistance = 5; + /* this outer loop is used if there are no more valid places left + * so we can change mindistance + */ + for(unsigned int i = 0; i < players; ++i) + { + /* get list of valid positions */ + QList validpos; + for (unsigned int x = 0; x < Constants::map_size.width; ++x) + { + for (unsigned int y = 0; y < Constants::map_size.height; ++y) + { + Transmission::field_t &cur = map[x][y]; + if (cur == Transmission::none) + validpos.append(QPoint(x, y)); + } + } + + /* place actors at map */ + for(i = 0; i < players; ++i) + { + int rand = (int) (validpos.size() * (qrand() / (RAND_MAX + 1.0))); + QPoint newpos = validpos.at(rand); + map[newpos.x()][newpos.y()] = colors[i] | Transmission::pacman | Transmission::direction_none; + validpos.removeAt(rand); - map[0][0] |= Transmission::bonuspoint; - map[1][0] |= Color::red | Transmission::pacman | Transmission::direction_right; - //map[23][0] = Color::blue | Transmission::pacman | Transmission::direction_none; - //map[24][0] = Color::green | Transmission::pacman | Transmission::direction_none; - //map[25][0] = Color::yellow | Transmission::pacman | Transmission::direction_none; + QMutableListIterator j(validpos); + while(j.hasNext()) + { + j.next(); + QPoint tmp = j.value() - newpos; + if (tmp.manhattanLength() < mindistance) + j.remove(); + } + if (validpos.empty()) + { + qWarning() << "There are no more valid positions for actors left on the map"; + mindistance -= 2; + break; + } + } + } + } + + void makePoints(Transmission::map_t map) + { /* auto place normal points*/ for (unsigned int x = 0; x < Constants::map_size.width; ++x) { @@ -92,8 +136,6 @@ namespace Util cur = Transmission::none; } } - - return map; } Transmission::field_t actorMovementToTransmission(Actor::Movement mov, Transmission::field_t def) diff --git a/pacman-c++/util.h b/pacman-c++/util.h index 87dbd86..5ea2953 100644 --- a/pacman-c++/util.h +++ b/pacman-c++/util.h @@ -11,6 +11,8 @@ namespace Util { Transmission::map_t createUninitialisedMap(); Transmission::map_t createDemoMap(); + void placeActors(Transmission::map_t map, unsigned int players, const Color::Color *colors); + void makePoints(Transmission::map_t map); Transmission::map_t createEmptyMap(); void deleteMap(Transmission::map_t map); -- cgit v1.2.3