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(); } } }