#include "mainwidget.h" #include "actor.h" #include "block.h" #include "bonuspoint.h" #include "constants.h" MainWidget::MainWidget() : currentKey(0) { setFocusPolicy(Qt::StrongFocus); QVBoxLayout *layout = new QVBoxLayout(this); QHBoxLayout *m_scoreLayout = new QHBoxLayout(); for (unsigned int i = 1; i < 4; ++i) { QGroupBox *scoreBoxI = new QGroupBox(QString("Spieler %1").arg(i), this); m_scoreLayout->addWidget(scoreBoxI); QGridLayout *playerLayout = new QGridLayout(); scoreBoxI->setLayout(playerLayout); playerLayout->addWidget(new QLabel("Rundenpunkte:", this), 0, 0); playerLayout->addWidget(new QLabel("Gesamtpunkte:", this), 1, 0); playerLayout->addWidget(new QLabel("", this), 0, 1); playerLayout->addWidget(new QLabel("", this), 1, 1); m_playerScoreLayouts.append(playerLayout); } m_scene = new QGraphicsScene(0, 0, 500, 500, this); m_scene->setBackgroundBrush(Qt::black); QGraphicsView *window = new QGraphicsView(m_scene, this); window->setFrameStyle(0); window->setAlignment(Qt::AlignLeft | Qt::AlignTop); window->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); window->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); layout->addLayout(m_scoreLayout); layout->addWidget(window); setLayout(layout); setWindowTitle("pacman client"); loadDummyMap(); } void MainWidget::updateScore() { QMapIterator i(m_actors); while (i.hasNext()) { i.next(); int id = i.key() - 1; if (id == 4) { id = 3; } QLabel *turnPointsLbl = dynamic_cast(m_playerScoreLayouts.at(id)->itemAtPosition(0,1)->widget()); QLabel *allPointsLbl = dynamic_cast(m_playerScoreLayouts.at(id)->itemAtPosition(1,1)->widget()); turnPointsLbl->setText(QString::number(id * 100 * qrand())); allPointsLbl->setText(QString::number(id * 200 * qrand())); } } // temporary transmission::map_t createDummyMap() { transmission::map_t map; map = new transmission::field_t*[map_size[0]]; for (unsigned int i = 0; i < map_size[0]; ++i) map[i] = new transmission::field_t[map_size[1]]; for (unsigned int x = 0; x < map_size[0]; ++x) { for (unsigned int y = 0; y < map_size[1]; ++y) { transmission::field_t &cur = map[x][y]; cur = 0; } } map[0][0] |= Color::none ^ transmission::block; map[0][1] |= Color::none ^ transmission::block; map[0][2] |= Color::none ^ transmission::block; map[0][3] |= Color::none ^ transmission::block; map[0][4] |= Color::none ^ transmission::block; map[0][5] |= Color::none ^ transmission::block; map[1][0] |= Color::none ^ transmission::block; map[2][0] |= Color::none ^ transmission::block; map[1][3] |= Color::none ^ transmission::block; map[2][3] |= Color::none ^ transmission::block; map[3][3] |= Color::none ^ transmission::block; map[2][4] |= Color::none ^ transmission::block; map[2][5] |= Color::none ^ transmission::block; map[2][2] |= Color::none ^ transmission::block; map[2][1] |= Color::none ^ transmission::block; map[4][3] |= Color::green ^ transmission::block; map[5][3] |= Color::none ^ transmission::block; map[6][3] |= Color::none ^ transmission::block; map[7][3] |= Color::red ^ transmission::block; map[7][5] |= transmission::bonuspoint; map[5][5] |= Color::blue; map[5][5] |= transmission::pacman; map[5][5] |= transmission::direction_left; return map; } void MainWidget::loadDummyMap() { transmission::map_t map = createDummyMap(); for (unsigned int x = 0; x < map_size[0]; ++x) { for (unsigned int y = 0; y < map_size[1]; ++y) { const transmission::field_t &cur = map[x][y]; if (cur == 0) continue; qDebug() << "not 0 at x=" << x << ", y=" << y << ", val=" << cur; Color::Color color = static_cast(cur & transmission::color_mask); qDebug() << "col=" << color; PixmapItem *item = NULL; if (cur & transmission::block) { unsigned int neighbours = Block::None; // check left side if (x > 0 && map[x - 1][y] & transmission::block) neighbours |= Block::Left; // check right side if (x < map_size[0] && map[x + 1][y] & transmission::block) neighbours |= Block::Right; // check upside if (y > 0 && map[x][y - 1] & transmission::block) neighbours |= Block::Up; // check down side if (y < map_size[1] && map[x][y + 1] & transmission::block) neighbours |= Block::Down; item = new Block(color, neighbours); } else if (cur & transmission::bonuspoint) item = new BonusPoint(); else if (cur & transmission::pacman) { Actor *actor = m_actors.value(color, 0); if (actor == 0) { // 0 entspricht NULL ;) qDebug() << "new actor of col" << color; actor = new Actor(color); m_actors[color] = actor; m_scene->addItem(actor); actor->setPos(mapPositionToCoord(x, y)); } Actor::Movement direction; switch (cur & transmission::direction_mask) { case transmission::direction_none: direction = Actor::None; break; case transmission::direction_left: direction = Actor::Left; break; case transmission::direction_right: direction = Actor::Right; break; case transmission::direction_up: direction = Actor::Up; break; case transmission::direction_down: direction = Actor::Down; break; default: Q_ASSERT(false); } //actor->move(direction, mapPositionToCoord(x, y); } else Q_ASSERT(false); if (item != NULL) { m_scene->addItem(item); item->setPos(mapPositionToCoord(x, y)); } } } updateScore(); } QPoint MainWidget::mapPositionToCoord(unsigned int x, unsigned int y) { return QPoint(x * field_size[0], y * field_size[1]); } transmission::field_t MainWidget::translateKey(int key) { switch(key) { case Qt::Key_Up: return transmission::direction_up; break; case Qt::Key_Down: return transmission::direction_down; break; case Qt::Key_Left: return transmission::direction_left; break; case Qt::Key_Right: return transmission::direction_right; break; default: return 0; } } void MainWidget::keyPressEvent(QKeyEvent* event) { QWidget::keyPressEvent(event); currentKey = translateKey( event->key() ); } void MainWidget::keyReleaseEvent(QKeyEvent* event) { QWidget::keyReleaseEvent(event); transmission::field_t releasedKey = translateKey(event->key()); if (releasedKey == currentKey) { // current key got released // if this is false, a key got released which has already // been replaced by a different key, so this case is disregarded currentKey = 0; } }