void GameScene::setLevel(int level) { m_level = level; qDebug() << "Starting level" << level; lastSpecialSpawnTime = 0; setTimeFactor(normalTimeFactor); foreach(QGraphicsItem *item, items()) { if(Particle* particle = qgraphicsitem_cast<Particle*>(item)) { removeItem(particle); delete particle; // Delete the particle completely. Should (hopefully) not be referenced anywhere else. } } if(gameMode() == ModeClassic && level == 1) { setRemainingPositiveCharges(20); setRemainingNegativeCharges(20); setLevelTime(27); } else if(gameMode() == ModeClassic) { setLevelTime(baseTime + (int)(timeIncrement * level)); setRemainingPositiveCharges(baseChargeNum + (int)(incrementChargeNum * level)); setRemainingNegativeCharges(baseChargeNum + (int)(incrementChargeNum * level)); } else if(gameMode() == ModeParty) { setLevelTime(baseTimeParty + (int)(timeIncrementParty * level)); setRemainingPositiveCharges(baseChargeNumPositiveParty + (int)(incrementChargeNumParty * level)); setRemainingNegativeCharges(baseChargeNumNegativeParty + (int)(incrementChargeNumParty * level)); specialParticles()->clear(); if(level == 14) { specialParticles()->append(Particle::ParticleTransfer); } setRemainingSpecialCharges(specialParticles()->count()); } else { qWarning() << "Some unknown mode is set!"; } // set text of remaining charges updateRemainingChargeText(); // add player player = new Particle(this); #ifndef BENCHMARK addItem(player); #endif player->setCharge(playerCharge * (1 + levelChargeFactor * pow((double)level,2))); player->setParticleType(Particle::ParticlePlayer); if(gameMode() == ModeClassic && level == 1) { player->setPosition(QVector2D(gameRectF().width() * 0.9,gameRectF().height() * 0.9)); } else { player->setPosition(QVector2D(gameRectF().width() / 2,gameRectF().height() / 2)); } // add enemies addEnemies(); // Notify everyone about the level change emit levelChanged(level); }
//NEED TO FIX: //CONDITION WILL ALWAYS BE 1 IT CAUSE INFINITY LOOP void meun(int playerChoose) { int condition = 1; switch (playerChoose) { case 1: condition = gameMode(); //start game break; case 2: //open record mode condition = leaderboardMode(); break; case 3: //option condition = optionMode(); break; case 4: //exit program condition = exitMode(); break; default: condition = 1; break; } }
void GameScene::advance() { if(gameState() == GameRunning) { currentTime = time.elapsed(); if(firstStep) { m_dt = 0; firstStep = false; } else { m_dt = timeFactor() * (currentTime - lastFrameTime) / 1000.0; } if(m_dt > 0.01) { m_dt = 0.01; } if(gameMode() == ModeParty) { checkAddSpecialParticle(); } #ifdef BENCHMARK dtSum += realDt; if(frameNumber == 99) { qDebug() << "FPS: " << frameNumber / dtSum; dtSum = 0; frameNumber = 0; } frameNumber++; #endif QGraphicsScene::advance(); lastFrameTime = currentTime; } }
void GameScene::updateLevelTime() { setLevelTime(levelTime() - 1); if(levelTime() < 1) { setLevelUpgrade(true); setGameState(GamePaused); setLevel(m_level + 1); if(highestLevel() < level()) { setHighestLevel(level()); } if(gameMode() == GameScene::ModeClassic) { if(settings.value("highestLevel", 1).toInt() < level()) { settings.setValue("highestLevel", level()); } } else { if(settings.value("highestLevelParty", 1).toInt() < level()) { settings.setValue("highestLevelParty", level()); } } #ifdef OS_IS_ANDROID qDebug() << "Force syncing settings"; settings.sync(); #endif } }
void GameScene::addEnemies() { /* Available regions. The player starts in the center, and all the "touching" regions are not allowed for enemies. Only the edges are available to the enemies. _____________ |1 |11|7 |3 | |5_|__|__|9_| |10|__|__|2_| |4_|8_|12|6_| */ int areaNumber = 1; int numberOfEnemies = 1; qreal enemyChargeLevel = enemyCharge * (1 + levelChargeFactor * pow((double)level(),2)); if(gameMode() == ModeClassic) { numberOfEnemies = level(); } else if(gameMode() == ModeParty) { numberOfEnemies = 3 + level(); } for(int i=0; i<numberOfEnemies; i++) { // 1 new enemy per level Particle *enemy = new Particle(this); addItem(enemy); // should the particle spawn at the topleft, topright, bottomleft or bottomright? int left = 0; int top = 0; switch(areaNumber) { case 1: left = 0; top = 0; break; case 2: left = 3; top = 2; break; case 3: left = 3; top = 0; break; case 4: left = 0; top = 3; break; case 5: left = 0; top = 1; break; case 6: left = 3; top = 3; break; case 7: left = 2; top = 0; break; case 8: left = 1; top = 3; break; case 9: left = 3; top = 1; break; case 10: left = 0; top = 2; break; case 11: left = 1; top = 0; break; case 12: left = 2; top = 3; break; } // make sure that no enemies spawn in the middle region (close to the player) QRectF spawnRect(gameRectF().left() + gameRectF().width()/4.0 * left, gameRectF().top() + gameRectF().height()/4.0 * top, gameRectF().width()/4.0, gameRectF().height()/4.0); // now, let's find a random position within this region qreal xrand = (qreal)qrand()/(qreal)RAND_MAX; qreal yrand = (qreal)qrand()/(qreal)RAND_MAX; enemy->setPosition(QVector2D(spawnRect.left() + xrand*spawnRect.width(), spawnRect.top() + yrand*spawnRect.height())); enemy->setParticleType(Particle::ParticleEnemy); if(gameMode() == ModeClassic) { if(level() < 7) { enemy->setSticky(true); } else if(level() < 15) { enemy->setElectroSticky(true); } } else { enemy->setSticky(false); enemy->setElectroSticky(false); } enemy->setMass(26.0); enemy->setCharge(enemyChargeLevel); areaNumber++; if(areaNumber > 12) { areaNumber = 1; } } }