Browse Source

Ädicioando contador de níveis e regracao de fase baseada no tempo

capellaresumo 7 years ago
parent
commit
c8ef55d638

+ 0 - 7
Classes/Ball.cpp

@@ -12,17 +12,11 @@
 
 USING_NS_CC;
 
-// on "init" you need to initialize your instance
 bool Ball::init() {
     auto ball_draw = DrawNode::create();
     ball_draw->drawDot(Vec2(0, 0), BALL_SIZE, Color4F(COLOR_grey));
     this->addChild(ball_draw);
     
-//    ParticleSun* m_emitter = ParticleSun::create();
-//    m_emitter->setPosition(Vec2(0, 0));
-//    this->addChild(m_emitter);
-    //
-    
     auto material = PHYSICSBODY_MATERIAL_DEFAULT;
     material.density = 0.0f;
     material.restitution = 1.005f;
@@ -32,7 +26,6 @@ bool Ball::init() {
     physicsBody->setGravityEnable(false);
     physicsBody->setVelocity(Vec2(0,0));
     physicsBody->setLinearDamping(0.0);
-    //physicsBody->setRotationEnable(false);
     physicsBody->setMass(1000.0f);
     
     physicsBody->setContactTestBitmask(0xFFFFFFFF);

+ 1 - 4
Classes/BlocksLayer.cpp

@@ -11,8 +11,6 @@
 
 USING_NS_CC;
 
-
-
 void BlocksLayer::setLevel(int level) {
     auto visibleSize = Director::getInstance()->getVisibleSize();
     Vec2 center = Vec2(visibleSize.width/2, visibleSize.height/2);
@@ -22,6 +20,7 @@ void BlocksLayer::setLevel(int level) {
     double size = CORE_RADIUS*0.75;
     int delta = 15;
     
+    // Codigo feio para gerar fases aleatorias
     for (i = 0; count <= level; i++) {
         for (j = 0; count <= level && j <= i; j++) {
             if (i + 1 > delta) {
@@ -31,8 +30,6 @@ void BlocksLayer::setLevel(int level) {
             }
             circles_n = i + 1;
             p_indus = j * 0.035;
-            
-            CCLOG("> %d %d", i+1, j);
             count++;
         }
     }

+ 65 - 7
Classes/GameScene.cpp

@@ -43,6 +43,12 @@ Scene* GameScene::createScene(int level) {
     layer->addChild(blocks, 20);
     
     layer->setLevel(level);
+    
+    auto delay = DelayTime::create(10.0);
+    CallFunc *runCallback = CallFunc::create(CC_CALLBACK_0(GameScene::saveLevel, layer));
+    auto seq = Sequence::create(delay, runCallback, nullptr);
+    layer->runAction(seq);
+    
     return scene;
 }
 
@@ -54,6 +60,8 @@ bool GameScene::init() {
         return false;
     }
     
+    this->over = false;
+    
     // https://www.freesound.org/people/schademans/sounds/13290/
     FileUtils::getInstance()->addSearchPath("res");
     auto audio = CocosDenshion::SimpleAudioEngine::getInstance();
@@ -89,6 +97,7 @@ bool GameScene::init() {
     physicsBody->setGravityEnable(false);
     physicsBody->setDynamic(false);
     physicsBody->setContactTestBitmask(0xFFFFFFFF);
+    raquete->setTag(RACKET_TAG);
     raquete->addComponent(physicsBody);
     
     this->addChild(raquete);
@@ -130,11 +139,6 @@ bool GameScene::init() {
     contactListener->onContactBegin = CC_CALLBACK_1(GameScene::onContactBegin, this);
     _eventDispatcher->addEventListenerWithSceneGraphPriority(contactListener, this);
     
-    UserDefault *userdata = UserDefault::getInstance();
-    //int level = userdata->getIntegerForKey("level");
-    userdata->setIntegerForKey("level", 0);
-    userdata->flush();
-    
     return true;
 }
 
@@ -142,9 +146,15 @@ bool GameScene::onContactBegin(PhysicsContact& contact) {
     auto nodeA = contact.getShapeA()->getBody()->getNode();
     auto nodeB = contact.getShapeB()->getBody()->getNode();
     
-    if (nodeA && nodeB && nodeA->getTag() != nodeB->getTag()) {
+    if (nodeA && nodeB && nodeA->getTag() != nodeB->getTag() && !this->over) {
         //CCLOG("%d %d", nodeB->getTag(), nodeA->getTag());
         
+        if (nodeB->getTag() > nodeA->getTag()) {
+            auto tmp = nodeB;
+            nodeB = nodeA;
+            nodeA = tmp;
+        }
+        
         // sempre B < A
         if (nodeB->getTag() == BLOCK_TAG) {
             auto audio = CocosDenshion::SimpleAudioEngine::getInstance();
@@ -159,12 +169,28 @@ bool GameScene::onContactBegin(PhysicsContact& contact) {
             ball_core(nodeB, nodeA);
         }  else if (nodeB->getTag() == BALL_TAG && nodeA->getTag() == CORE_TAG) {
             ball_core(nodeA, nodeB);
+        }  else if (nodeB->getTag() == SAVE_TAG && nodeA->getTag() == RACKET_TAG) {
+            
+            CCLOG(">>> %d", this->level);
+            
+            Size visibleSize = Director::getInstance()->getVisibleSize();
+            // Salva o nivel!
+            UserDefault *userdata = UserDefault::getInstance();
+            userdata->setIntegerForKey("level", this->level);
+            userdata->setDoubleForKey("time", (double) time(NULL));
+            userdata->flush();
+            nodeB->removeFromParentAndCleanup(true);
+            auto text = Label::createWithTTF("Level Saved!", "fonts/Marker Felt.ttf", 40);
+            text->setPosition(visibleSize.width/2, visibleSize.height/2);
+            this->addChild(text);
+            text->runAction(FadeOut::create(3));
         }
     }
     return true;
 }
 
 void GameScene::ball_collision (Node *ball) {
+    this->over = true;
     auto visibleSize = Director::getInstance()->getVisibleSize();
     auto text = Label::createWithTTF("Game Over...", "fonts/Marker Felt.ttf", 40);
     text->setPosition(visibleSize.width/2, visibleSize.height/2);
@@ -209,7 +235,7 @@ void GameScene::ball_core (Node *core, Node *ball) {
     ball->removeFromParentAndCleanup(true);
 }
 
-void GameScene::NextLevel(cocos2d::Ref *pSender) {
+void GameScene::NextLevel(Ref *pSender) {
     auto scene = GameScene::createScene(this->level + 1);
     Director::getInstance()->replaceScene(scene);
     //Director::getInstance()->end();
@@ -224,3 +250,35 @@ void GameScene::setLevel(int level) {
     text->setPosition(10, 10);
     this->addChild(text);
 }
+
+void GameScene::saveLevel() {
+    if (rand_0_1() < DROP_LEVEL_SAVE && this->over == false){
+        Size visibleSize = Director::getInstance()->getVisibleSize();
+        auto ball_draw = DrawNode::create();
+        ball_draw->drawDot(Vec2(0, 0), BALL_SIZE/3.0, Color4F(COLOR_green));
+    
+        auto material = PHYSICSBODY_MATERIAL_DEFAULT;
+        material.density = 0.0f;
+        material.restitution = 1.0f;
+        material.friction = 0.0f; //set friction here
+    
+        auto physicsBody = PhysicsBody::createCircle(BALL_SIZE/3.0, material);
+        physicsBody->setGravityEnable(true);
+        physicsBody->setVelocity(Vec2(0,0));
+        physicsBody->setLinearDamping(0.0);
+        physicsBody->setMass(1.0f);
+        physicsBody->setContactTestBitmask(0xFFFFFFFF);
+        physicsBody->setGroup(-1);
+        ball_draw->addComponent(physicsBody);
+        ball_draw->setTag(SAVE_TAG);
+        
+        ball_draw->setPosition(visibleSize.width * rand_0_1(), visibleSize.height);
+        this->addChild(ball_draw);
+    }
+    
+    auto delay = DelayTime::create(rand_0_1()*10.0+3.0);
+    CallFunc *runCallback = CallFunc::create(CC_CALLBACK_0(GameScene::saveLevel, this));
+    auto seq = Sequence::create(delay, runCallback, nullptr);
+    this->runAction(seq);
+    
+}

+ 3 - 1
Classes/GameScene.h

@@ -21,8 +21,10 @@ class GameScene : public cocos2d::Layer {
     private:
         void ball_collision (cocos2d::Node *ball);
         void ball_core (cocos2d::Node *core, cocos2d::Node *ball);
-        void NextLevel(Ref *pSender);
+        void NextLevel(cocos2d::Ref *pSender);
         int level;
+        void saveLevel ();
+        bool over; // salva se o jogo acabou!
 };
 
 

+ 42 - 1
Classes/HelloWorldScene.cpp

@@ -74,7 +74,7 @@ bool HelloWorld::init() {
     
     auto menu_item_start = MenuItemFont::create("Start", CC_CALLBACK_1(HelloWorld::Play, this));
 
-    menu_item_start->setPosition(Point(visibleSize.width / 2, (visibleSize.height / 2)));
+    menu_item_start->setPosition(Point(visibleSize.width / 2, (visibleSize.height*0.25)));
     
     auto *menu = Menu::create(menu_item_start, NULL);
     menu->setPosition(Point(0, 0));
@@ -86,6 +86,47 @@ bool HelloWorld::init() {
         ball->throwBall();
         this->addChild(ball);
     }
+    
+    auto core = DrawNode::create();
+    core->drawDot(Vec2(0, 0), CORE_RADIUS*4, Color4F(COLOR_red));
+    core->setPosition(Point(visibleSize.width / 2, (visibleSize.height*0.75)));
+    this->addChild(core);
+    
+    auto physicsBody = PhysicsBody::createCircle(CORE_RADIUS*4, PhysicsMaterial(0.1f, 0.9f, 0.0f));
+    physicsBody->setDynamic(false);
+    core->addComponent(physicsBody);
+    
+    
+    auto text = Label::createWithTTF("RedCore", "fonts/Marker Felt.ttf", 100);
+    text->setPosition(core->getPosition());
+    this->addChild(text);
+    
+    double last, diff;
+    int level;
+    
+    UserDefault *userdata = UserDefault::getInstance();
+    level = userdata->getIntegerForKey("level");
+    last = userdata->getDoubleForKey("time");
+    unsigned long int sec = time(NULL);
+    diff = 3600 * 12 + last - sec;
+    
+    if (last < 0) {
+        int c = last/(3600 * 12); // quantas vidas ja se passaram
+        last += c*3600.0*12.0;
+        userdata->setDoubleForKey("time", last);
+        level -= c;
+        userdata->setIntegerForKey("level", level);
+        diff = 3600 * 12 + last - sec;
+    }
+    
+    char level_text[256];
+    if (level != 0) {
+        sprintf(level_text,"You are at level %d. In %.1f hour(s) you will regrow a level.", level, diff/3600.0);
+    
+        auto textlevel = Label::createWithTTF(level_text, "fonts/Marker Felt.ttf", 20);
+        textlevel->setPosition(menu_item_start->getPositionX(), menu_item_start->getPositionY()-60);
+        this->addChild(textlevel);
+    }
 
     return true;
 }

+ 7 - 0
Classes/params.h

@@ -37,5 +37,12 @@
 #define CORE_TAG 11
 #define BOTTOM_TAG 12
 #define INDESTRUCTIBLE_BLOCK_TAG 13
+#define RACKET_TAG 14
+
+#define THREE_BALLS_TAG 9
+#define SAVE_TAG 8
+
+// Probabilitys
+#define DROP_LEVEL_SAVE 0.05
 
 #endif /* params_h */

BIN
proj.ios_mac/RedCore2.xcodeproj/project.xcworkspace/xcuserdata/capella.xcuserdatad/UserInterfaceState.xcuserstate


+ 6 - 6
proj.ios_mac/RedCore2.xcodeproj/xcuserdata/capella.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -10,11 +10,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "../Classes/Ball.cpp"
-            timestampString = "517971880.956134"
+            timestampString = "518216424.556933"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "18"
-            endingLineNumber = "18"
+            startingLineNumber = "17"
+            endingLineNumber = "17"
             landmarkName = "Ball::init()"
             landmarkType = "7">
          </BreakpointContent>
@@ -26,11 +26,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "../Classes/BlocksLayer.cpp"
-            timestampString = "518213096.585336"
+            timestampString = "518216640.132506"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "158"
-            endingLineNumber = "158"
+            startingLineNumber = "155"
+            endingLineNumber = "155"
             landmarkName = "BlocksLayer::createSegment (double r_internal, double r_externa, double begin, double end, bool especial)"
             landmarkType = "7">
          </BreakpointContent>