Пример #1
0
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);
}
Пример #2
0
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);
        }
    }