diff --git a/apps/tetris/Tetris/bin/data/_Tetris/effects.json b/apps/tetris/Tetris/bin/data/_Tetris/effects.json index 389d7bf..3b601c1 100644 --- a/apps/tetris/Tetris/bin/data/_Tetris/effects.json +++ b/apps/tetris/Tetris/bin/data/_Tetris/effects.json @@ -15,14 +15,6 @@ "sound":"Eisiger Stein.mp3", "type":"stone" }, - { - "state":"big", - "main":"большой камень", - "sub":"(großer Stein)", - "time": 2000, - "sound":"Grosser Stein.mp3", - "type":"stone" - }, { "state":"wind", "main":"ветер", diff --git a/apps/tetris/Tetris/bin/data/_Tetris/params.json b/apps/tetris/Tetris/bin/data/_Tetris/params.json index 66dc0d6..3574a9b 100644 --- a/apps/tetris/Tetris/bin/data/_Tetris/params.json +++ b/apps/tetris/Tetris/bin/data/_Tetris/params.json @@ -3,7 +3,7 @@ "height": 1920, "gameplay":{ "winningHeightMin":0.10, - "winningHeightMax":0.25, + "winningHeightMax":0.25, "maxDuration":80000, "startHeightReduction":20000 }, @@ -36,9 +36,11 @@ }, "tetrisStone": { "density": 1.0, - "produceEveryMilliseconds": 8000, + "stoneCreationIntervalMax" :5000, + "stoneCreationIntervalMin" : 500, "scale":20, - "startVelocity": 10 + "velocityBeforeCollisionMin": 10, + "velocityBeforeCollisionMax": 30 }, "paddle": { "width": 450, diff --git a/apps/tetris/Tetris/src/tetris/GameEvents.h b/apps/tetris/Tetris/src/tetris/GameEvents.h index 579494c..120c9dc 100644 --- a/apps/tetris/Tetris/src/tetris/GameEvents.h +++ b/apps/tetris/Tetris/src/tetris/GameEvents.h @@ -26,7 +26,8 @@ class GameEvents string gamestate = "idle"; float winningHeight = 0.9; - + float velocityBeforeCollision = 10; + float stoneCreationIntervall = 3000; void registerEraseEvent(ofEvent& ev); private: diff --git a/apps/tetris/Tetris/src/tetris/GameObjectContainer.cpp b/apps/tetris/Tetris/src/tetris/GameObjectContainer.cpp index dfce39d..3e37a81 100644 --- a/apps/tetris/Tetris/src/tetris/GameObjectContainer.cpp +++ b/apps/tetris/Tetris/src/tetris/GameObjectContainer.cpp @@ -19,6 +19,11 @@ void GameObjectContainer::initPhysics(float gravity) physics.setFPS(60.0); } +void GameObjectContainer::setPhysics(float gravity) +{ + physics.setGravity(0, gravity); +} + void GameObjectContainer::addGameObject(shared_ptr object) { gameControl.push_back(object); diff --git a/apps/tetris/Tetris/src/tetris/GameObjectContainer.h b/apps/tetris/Tetris/src/tetris/GameObjectContainer.h index 82bd6d4..ffd28f2 100644 --- a/apps/tetris/Tetris/src/tetris/GameObjectContainer.h +++ b/apps/tetris/Tetris/src/tetris/GameObjectContainer.h @@ -18,7 +18,7 @@ class GameObjectContainer void addGameObject(shared_ptr object); void addPaddle(shared_ptr object); void addRule(shared_ptr rule); - + void setPhysics(float gravity); shared_ptr getRule(string name); shared_ptr getPaddle(string name); vector> paddles; diff --git a/apps/tetris/Tetris/src/tetris/rules/GameControlRule.cpp b/apps/tetris/Tetris/src/tetris/rules/GameControlRule.cpp index dcecf76..28dd9ca 100644 --- a/apps/tetris/Tetris/src/tetris/rules/GameControlRule.cpp +++ b/apps/tetris/Tetris/src/tetris/rules/GameControlRule.cpp @@ -65,6 +65,9 @@ void GameControlRule::applyRule() } } else if (gamestate == "countdown3" && isTSwitch) { components->events()->winningHeight = components->params()->settings["gameplay"]["winningHeightMax"].get(); + + components->events()->stoneCreationIntervall = components->params()->settings["tetrisStone"]["stoneCreationIntervalMax"].get(); + components->events()->velocityBeforeCollision = components->params()->settings["tetrisStone"]["velocityBeforeCollisionMin"].get(); changeGamestate("countdown2"); } else if (gamestate == "countdown2" && isTSwitch) { changeGamestate("countdown1"); @@ -79,9 +82,24 @@ void GameControlRule::applyRule() else if (gameControl->paddles[1]->towerHeight > winningHeight) { changeGamestate("end2"); } + //reduce winning height if (now - startState > components->params()->settings["gameplay"]["startHeightReduction"].get()){ + + components->events()->velocityBeforeCollision = + ofMap(now - startState, components->params()->settings["gameplay"]["startHeightReduction"].get(), + components->params()->settings["gameplay"]["maxDuration"].get(), + components->params()->settings["tetrisStone"]["velocityBeforeCollisionMin"].get(), + components->params()->settings["tetrisStone"]["velocityBeforeCollisionMax"].get(),true); + + components->events()->stoneCreationIntervall = + ofMap(now - startState, components->params()->settings["gameplay"]["startHeightReduction"].get(), + components->params()->settings["gameplay"]["maxDuration"].get(), + components->params()->settings["tetrisStone"]["stoneCreationIntervalMax"].get(), + components->params()->settings["tetrisStone"]["stoneCreationIntervalMin"].get(),true); + + components->events()->winningHeight = ofMap(now - startState, components->params()->settings["gameplay"]["startHeightReduction"].get(), components->params()->settings["gameplay"]["maxDuration"].get(), diff --git a/apps/tetris/Tetris/src/tetris/rules/NoGravityRule.cpp b/apps/tetris/Tetris/src/tetris/rules/NoGravityRule.cpp new file mode 100644 index 0000000..92d1413 --- /dev/null +++ b/apps/tetris/Tetris/src/tetris/rules/NoGravityRule.cpp @@ -0,0 +1,25 @@ +#include "NoGravityRule.h" + +NoGravityRule::NoGravityRule(shared_ptr components,int runtime):GameRule("WindRule", components,runtime){ + +} + +void NoGravityRule::applyRule() +{ + + bool disableOnRuleEnd = ofGetElapsedTimef()-getCreationTime() > runtime -5; + + if(!gravityDisabled && !disableOnRuleEnd) { + int i = 0; + // apply on runtime start + + gravityDisabled = true; + } else { + if(disableOnRuleEnd) { + // apply on runtime end + + } + } + + +} diff --git a/apps/tetris/Tetris/src/tetris/rules/NoGravityRule.h b/apps/tetris/Tetris/src/tetris/rules/NoGravityRule.h new file mode 100644 index 0000000..15a05d1 --- /dev/null +++ b/apps/tetris/Tetris/src/tetris/rules/NoGravityRule.h @@ -0,0 +1,12 @@ +#pragma once +#include "GameRule.h" +#include "TetrisStone.h" +class NoGravityRule : + public GameRule +{ +public: + NoGravityRule(shared_ptr components,int runtime); + bool gravityDisabled = false; + void applyRule(); +}; + diff --git a/apps/tetris/Tetris/src/tetris/rules/StoneControlRule.cpp b/apps/tetris/Tetris/src/tetris/rules/StoneControlRule.cpp index 53dfbbc..d738272 100644 --- a/apps/tetris/Tetris/src/tetris/rules/StoneControlRule.cpp +++ b/apps/tetris/Tetris/src/tetris/rules/StoneControlRule.cpp @@ -20,9 +20,10 @@ void StoneControlRule::enableGravity() shared_ptr stone = std::static_pointer_cast(obj); if (!stone->collided) { for (auto& body : stone->getBody()) { - int velocity = components->params()->settings["tetrisStone"]["startVelocity"].get(); + int velocity = components->events()->velocityBeforeCollision; body->setVelocity(0, velocity); body->enableGravity(false); + }; } else { for (auto& body : stone->getBody()) { diff --git a/apps/tetris/Tetris/src/tetris/rules/StoneCreationRule.cpp b/apps/tetris/Tetris/src/tetris/rules/StoneCreationRule.cpp index 128f3f4..193d5d6 100644 --- a/apps/tetris/Tetris/src/tetris/rules/StoneCreationRule.cpp +++ b/apps/tetris/Tetris/src/tetris/rules/StoneCreationRule.cpp @@ -4,7 +4,7 @@ StoneCreationRule::StoneCreationRule(shared_ptr components) :GameRule("StoneControlRule", components) { - produceStoneIntervallInMillis = components->params()->settings["tetrisStone"]["produceEveryMilliseconds"].get(); + produceStoneIntervallInMillis = components->params()->settings["tetrisStone"]["stoneCreationIntervalMax"].get(); ofAddListener(components->gameControl()->physics.contactStartEvents, this, &StoneCreationRule::contactStart); } @@ -14,7 +14,10 @@ StoneCreationRule::~StoneCreationRule() } void StoneCreationRule::applyRule() { - if (components->events()->gamestate == "game") produceStoneByIntervall(); + if (components->events()->gamestate == "game"){ + produceStoneByIntervall(); + produceStoneIntervallInMillis = components->events()->stoneCreationIntervall; + } } void StoneCreationRule::produceStoneByIntervall() { @@ -28,7 +31,7 @@ void StoneCreationRule::produceStoneByIntervall() { void StoneCreationRule::produceStone(int player) { - if (getLastCreatedStone(player) == nullptr || getLastCreatedStone(player)->getBody()[0]->getPosition().y >500) { + if (getLastCreatedStone(player) == nullptr || getLastCreatedStone(player)->getBody()[0]->getPosition().y >300) { //create stone auto stone = GameFactory::makeTetrisStone(components, components->events()->nextCreationRule[player - 1]); stone->setPlayer(player); @@ -130,4 +133,4 @@ void StoneCreationRule::contactStart(ofxBox2dContactArgs &e) { collisionHandler(stone); } } -} \ No newline at end of file +} diff --git a/apps/tetris/Tetris/src/tetris/rules/WindRule.cpp b/apps/tetris/Tetris/src/tetris/rules/WindRule.cpp index fadb4a0..6154bc7 100644 --- a/apps/tetris/Tetris/src/tetris/rules/WindRule.cpp +++ b/apps/tetris/Tetris/src/tetris/rules/WindRule.cpp @@ -1,7 +1,5 @@ #include "WindRule.h" - - WindRule::WindRule(shared_ptr components,int runtime):GameRule("WindRule", components,runtime) {