Field::Field(QGraphicsScene *scene) //: QObject() { m_scene = scene; m_animating = false; m_pathItems.fill(NULL, W * H); ResourceLoader *loader = ResourceLoader::instance(); for (int i = 0; i < W; i++) { for (int j = 0; j < H; j++) { QGraphicsObject *item = new SvgRendererItem(loader->tile()); item->setPos(i * CELL_SIZE, j * CELL_SIZE); #ifdef QT_DEBUG //if (j % 2 && i % 2) // item->setScale(0.5); #endif item->setZValue(0); m_scene->addItem(item); item = new SvgRendererItem(loader->pathmarker()); item->setPos(i * CELL_SIZE, j * CELL_SIZE); item->setZValue(2); item->setVisible(false); m_scene->addItem(item); setVectorAt(m_pathItems, i, j, item); } } m_sel = QPoint(-1, -1); m_selItem = new SvgRendererItem(loader->select()); m_selItem->setZValue(1); m_selItem->setVisible(false); m_scene->addItem(m_selItem); m_field.fill(0, W * H); m_fieldItems.fill(NULL, W * H); m_next.fill({ QPoint(-1, -1), 0, NULL, NULL }, 3); }
void Field::throwBalls(int num, bool directly) { QVector<QPoint> free; free.fill(QPoint(0, 0), W * H); int nFree = 0; for (int i = 0; i < W; i++) for (int j = 0; j < H; j++) if (at(i, j) == 0) { free[nFree] = QPoint(i, j); nFree++; } #ifdef QT_DEBUG for (int i = 0; i < W * H; i++) { //qDebug("%d, %d", free[i].x(), free[i].y()); } #endif //return; QList<SuggestedBall> ballsToThrow; for (int n = 0; n < num; n++) { if (nFree > 0) { int at = qrand() % nFree; ballsToThrow.append({ free[at], qrand() % COLORS + 1, NULL, NULL }); free.removeAt(at); nFree--; } else ballsToThrow.append({ QPoint(-1, -1), qrand() % COLORS + 1, NULL, NULL }); } if (directly) { // This is needed on startup only, therefore do nothing except placing balls foreach (auto ball, ballsToThrow) { setAt(ball.pt, ball.color); QGraphicsObject *item = new SvgRendererItem(ResourceLoader::instance()->ball(ball.color)); item->setPos(ball.pt * CELL_SIZE); item->setZValue(3); m_scene->addItem(item); setVectorAt(m_fieldItems, ball.pt, item); } }