Example #1
0
    void move()
    {
        if (gameover)
            return;

        if (timer.isPeriod(period))
        {
            if (!tryUpdatePos(0, -1))
            {
                for (int i = 0; i < curFigure.geom.size(); ++i)
                {
                    IntVec2 fullPos = curPos + curFigure.geom[i];
                    field[fullPos.x][fullPos.y] = textureIds[i];
                }
                
                vector<int> rawsToBurn;
                for (int y = 0; y < 20; ++y)
                {
                    bool hasHole = false;
                    for (int x = 0; x < 10; ++x)
                    {
                        if (field[x][y] == -1)
                            hasHole = true;
                    }
                    if (!hasHole)
                        rawsToBurn.push_back(y);
                }

                for (auto it = rawsToBurn.rbegin(); it != rawsToBurn.rend(); ++it)
                {
                    int rawY = *it;
                    for (int x = 0; x < 10; ++x)
                        fieldLayout->removeObject(field[x][rawY]);
                    for (int y = rawY; y < 19; ++y)
                    {
                        for (int x = 0; x < 10; ++x)
                        {
                            field[x][y] = field[x][y + 1];
                            if (field[x][y] != -1)
                                adjustTile(field[x][y], IntVec2(x, y));
                        }
                    }
                    for (int x = 0; x < 10; ++x)
                        field[x][19] = -1;
                }

                switch (rawsToBurn.size())
                {
                case 1: score += 100; break;
                case 2: score += 300; break;
                case 3: score += 700; break;
                case 4: score += 1500; break;
                }

                if (!rawsToBurn.empty())
                {
                    design->getChild<StaticLabel>("#score")->setText(
                        boost::lexical_cast<string>(score));
                }

                newFigure();
            }
        }

        if (m_inputRegister.keys.isJustPressed(13) || m_inputRegister.keys.isJustPressed('s'))
        {
            if (period != 50)
            {
                timer.start();
                period = 50;
            }
        }

        if (m_inputRegister.keys.isJustPressed('a'))
            tryUpdatePos(-1, 0);
        if (m_inputRegister.keys.isJustPressed('d'))
            tryUpdatePos(1, 0);

        if (m_inputRegister.keys.isJustPressed('q'))
        {
            Figure newFigure = curFigure;
            newFigure.rotateLeft();
            if (canPlace(curPos, newFigure))
            {
                curFigure = newFigure;
                adjustCurTiles();
            }
        }

        if (m_inputRegister.keys.isJustPressed('e'))
        {
            Figure newFigure = curFigure;
            newFigure.rotateRight();
            if (canPlace(curPos, newFigure))
            {
                curFigure = newFigure;
                adjustCurTiles();
            }
        }
    }