Browse Source

Separando paddle do jogo

capellaresumo 7 years ago
parent
commit
3becb2d45d

+ 8 - 72
Classes/GameScene.cpp

@@ -10,6 +10,7 @@
 #include "SimpleAudioEngine.h"
 #include "GameScene/BlocksLayer.h"
 #include "GameScene/Ball.h"
+#include "GameScene/Paddle.h"
 #include "params.h"
 
 USING_NS_CC;
@@ -95,50 +96,12 @@ bool GameScene::init() {
     auto bg = LayerColor::create(COLOR_back);
     addChild(bg);
     
-    paddle = DrawNode::create();
-    paddle_size = PADDLE_WIDTH;
-    float py = PADDLE_HEIGHT/2.0;
-    float pxl = - PADDLE_WIDTH/2;
-    float pxr =  PADDLE_WIDTH/2;
-    paddle->drawSegment(Vec2(pxl, py), Vec2(pxr, py), py, Color4F(COLOR_grey));
+    paddle = Paddle::create();
     paddle->setPositionX(width/2);
-    paddle->setPositionY(PADDLE_ALTURA);
-    
-    auto bsize = Size(PADDLE_WIDTH+PADDLE_HEIGHT, PADDLE_HEIGHT);
-    auto physicsBody = PhysicsBody::createBox(bsize, PhysicsMaterial(0.1f, 1.0f, 0.0f));
-    physicsBody->setPositionOffset(Vec2(0, PADDLE_HEIGHT/2));
-    physicsBody->setGravityEnable(false);
-    physicsBody->setDynamic(false);
-    physicsBody->setContactTestBitmask(0xFFFFFFFF);
-    paddle->setTag(RACKET_TAG);
-    paddle->addComponent(physicsBody);
-    paddle_size = PADDLE_WIDTH;
-    
+    paddle->listen(width);
     addChild(paddle);
     
-    auto listener1 = EventListenerTouchOneByOne::create();
-    
-    // trigger when you push down
-    listener1->onTouchBegan = [=](Touch* touch, Event* event){
-        paddle->setPositionX(touch->getLocation().x);
-        float px = touch->getLocation().x;
-        if (px >= paddle_size/2 && px < width - paddle_size/2)
-            paddle->setPositionX(touch->getLocation().x);
-        return true; // if you are consuming it
-    };
-    
-    // trigger when moving touch
-    listener1->onTouchMoved = [=](Touch* touch, Event* event){
-        float px = touch->getLocation().x;
-        if (px >= PADDLE_WIDTH/2 && px <= width - PADDLE_WIDTH/2)
-            paddle->setPositionX(touch->getLocation().x);
-    };
-    
-    
-    // Add listener
-    _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, this);
-    
-    // Evento no contato das bolas
+    // Registra evento de contato de objetos
     auto contactListener = EventListenerPhysicsContact::create();
     contactListener->onContactBegin = CC_CALLBACK_1(GameScene::onContactBegin, this);
     _eventDispatcher->addEventListenerWithSceneGraphPriority(contactListener, this);
@@ -364,40 +327,13 @@ void GameScene::paddleBallAppearance() {
  */
 void GameScene::caseRaqueteBall(Node *powerup_ball) {
     if (!over) {
-        
         if (rand_0_1() < 0.5) {
-            if (paddle_size <= PADDLE_WIDTH * 2) {
-                alert(MSG_DOUBLE_PADDLE);
-                paddle_size *= 2;
-            }
+            alert(MSG_DOUBLE_PADDLE);
+            paddle->doubleSize();
         } else {
-            if (paddle_size >= PADDLE_WIDTH / 2) {
-                alert(MSG_HALF_PADDLE);
-                paddle_size /= 2;
-            }
+            alert(MSG_HALF_PADDLE);
+            paddle->halfSize();
         }
-        
-        //cria uma nova paddle e substitui a antiga paddle
-        auto new_paddle = DrawNode::create();
-        float py = PADDLE_HEIGHT/2.0;
-        float pxl = - paddle_size/2;
-        float pxr =  paddle_size/2;
-        new_paddle->drawSegment(Vec2(pxl, py), Vec2(pxr, py), py, Color4F(COLOR_grey));
-        new_paddle->setPositionX(paddle->getPositionX());
-        new_paddle->setPositionY(PADDLE_ALTURA);
-        
-        auto bsize = Size(paddle_size+PADDLE_HEIGHT, PADDLE_HEIGHT);
-        auto physicsBody = PhysicsBody::createBox(bsize, PhysicsMaterial(0.1f, 1.0f, 0.0f));
-        physicsBody->setPositionOffset(Vec2(0, PADDLE_HEIGHT/2));
-        physicsBody->setGravityEnable(false);
-        physicsBody->setDynamic(false);
-        physicsBody->setContactTestBitmask(0xFFFFFFFF);
-        new_paddle->setTag(RACKET_TAG);
-        new_paddle->addComponent(physicsBody);
-        
-        paddle->removeFromParentAndCleanup(true);
-        paddle = new_paddle;
-        addChild(paddle);
     }
     powerup_ball->removeFromParentAndCleanup(true);
 }

+ 2 - 2
Classes/GameScene.h

@@ -10,6 +10,7 @@
 #define GameScene_h
 
 #include "cocos2d.h"
+#include "GameScene/Paddle.h"
 
 class GameScene : public cocos2d::Layer {
     public:
@@ -32,8 +33,7 @@ class GameScene : public cocos2d::Layer {
         void addAndThrowBall();
         int level;
         bool over; // salva se o jogo acabou!
-        cocos2d::DrawNode * paddle;
-        int paddle_size; // tamanho atual da raquete
+        Paddle * paddle;
         cocos2d::Node* balls; // Bolas
         double height, width; // tamanho do quadro
         int last_touch; // ultima vez que a bola colidiu com algo

+ 1 - 0
Classes/GameScene/Ball.cpp

@@ -2,6 +2,7 @@
 //  Ball.cpp
 //  RedCore
 //
+
 #include "Ball.h"
 #include "params.h"
 #include "SimpleAudioEngine.h"

+ 1 - 4
Classes/GameScene/BlocksLayer.cpp

@@ -1,9 +1,6 @@
 //
 //  BlocksLayer.cpp
-//  RedCore2
-//
-//  Created by Gabriel Capella on 01/06/17.
-//
+//  RedCore
 //
 
 #include "BlocksLayer.h"

+ 1 - 4
Classes/GameScene/BlocksLayer.h

@@ -1,9 +1,6 @@
 //
 //  BlocksLayer.h
-//  RedCore2
-//
-//  Created by Gabriel Capella on 01/06/17.
-//
+//  RedCore
 //
 
 #ifndef BlocksLayer_h

+ 1 - 4
Classes/GameScene/GameScene.h

@@ -1,9 +1,6 @@
 //
 //  GameScene.h
-//  RedCore2
-//
-//  Created by Gabriel Capella on 31/05/17.
-//
+//  RedCore
 //
 
 #ifndef GameScene_h

+ 137 - 4
Classes/GameScene/Paddle.cpp

@@ -1,9 +1,6 @@
 //
 //  BlocksLayer.cpp
-//  RedCore2
-//
-//  Created by Gabriel Capella on 01/06/17.
-//
+//  RedCore
 //
 
 #include "Paddle.h"
@@ -11,3 +8,139 @@
 
 USING_NS_CC;
 
+bool Paddle::init() {
+    // Double size paddle
+    double_paddle = DrawNode::create();
+    float py = PADDLE_HEIGHT/2.0;
+    float pxl = - PADDLE_WIDTH/2;
+    float pxr =  PADDLE_WIDTH/2;
+    double_paddle->drawSegment(Vec2(pxl*2, py), Vec2(pxr*2, py), py, Color4F(COLOR_grey));
+    double_paddle->setPositionY(PADDLE_ALTURA);
+    
+    auto double_size = Size((PADDLE_WIDTH+PADDLE_HEIGHT)*2, PADDLE_HEIGHT);
+    auto doubleBody = PhysicsBody::createBox(double_size, PhysicsMaterial(0.1f, 1.0f, 0.0f));
+    doubleBody->setPositionOffset(Vec2(0, PADDLE_HEIGHT/2));
+    doubleBody->setGravityEnable(false);
+    doubleBody->setDynamic(false);
+    doubleBody->setContactTestBitmask(0xFFFFFFFF);
+    double_paddle->setTag(RACKET_TAG);
+    double_paddle->addComponent(doubleBody);
+    addChild(double_paddle);
+    
+    // Normal size paddle
+    normal_paddle = DrawNode::create();
+    normal_paddle->drawSegment(Vec2(pxl, py), Vec2(pxr, py), py, Color4F(COLOR_grey));
+    normal_paddle->setPositionY(PADDLE_ALTURA);
+    
+    auto normal_size = Size(PADDLE_WIDTH+PADDLE_HEIGHT, PADDLE_HEIGHT);
+    auto normalBody = PhysicsBody::createBox(normal_size, PhysicsMaterial(0.1f, 1.0f, 0.0f));
+    normalBody->setPositionOffset(Vec2(0, PADDLE_HEIGHT/2));
+    normalBody->setGravityEnable(false);
+    normalBody->setDynamic(false);
+    normalBody->setContactTestBitmask(0xFFFFFFFF);
+    normal_paddle->setTag(RACKET_TAG);
+    normal_paddle->addComponent(normalBody);
+    addChild(normal_paddle);
+    
+    // Half size paddle
+    half_paddle = DrawNode::create();
+    half_paddle->drawSegment(Vec2(pxl/2.0, py), Vec2(pxr/2.0, py), py, Color4F(COLOR_grey));
+    half_paddle->setPositionY(PADDLE_ALTURA);
+    
+    auto half__size = Size((PADDLE_WIDTH+PADDLE_HEIGHT)/2.0, PADDLE_HEIGHT);
+    auto half_Body = PhysicsBody::createBox(half__size, PhysicsMaterial(0.1f, 1.0f, 0.0f));
+    half_Body->setPositionOffset(Vec2(0, PADDLE_HEIGHT/2));
+    half_Body->setGravityEnable(false);
+    half_Body->setDynamic(false);
+    half_Body->setContactTestBitmask(0xFFFFFFFF);
+    half_paddle->setTag(RACKET_TAG);
+    half_paddle->addComponent(half_Body);
+    addChild(half_paddle);
+    
+    normalSize();
+    
+    return true;
+}
+
+void Paddle::listen(double width) {
+    
+    // Registra eventos touch
+    auto listener = EventListenerTouchOneByOne::create();
+    
+    // trigger when you push down
+    listener->onTouchBegan = [=](Touch* touch, Event* event){
+        setPX(touch->getLocation().x, width);
+        return true; // if you are consuming it
+    };
+    
+    // trigger when moving touch
+    listener->onTouchMoved = [=](Touch* touch, Event* event){
+        setPX(touch->getLocation().x, width);
+    };
+    
+    // Add listener
+    _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
+    
+}
+
+void Paddle::setPX(double px, double width) {
+    double paddle_x =  PADDLE_WIDTH/2;
+    switch (stade) {
+        case HALF:
+            paddle_x /=  2.0;
+            break;
+        case DOUBLE:
+            paddle_x *=  2.0;
+            break;
+    }
+    if (px >= paddle_x && px < width - paddle_x)
+        this->setPositionX(px);
+}
+
+void Paddle::doubleSize() {
+    if (stade == HALF) {
+        normalSize();
+        return;
+    }
+    stade = DOUBLE;
+    double_paddle->getPhysicsBody()->setEnabled(true);
+    double_paddle->setVisible(true);
+    normal_paddle->getPhysicsBody()->setEnabled(false);
+    normal_paddle->setVisible(false);
+    half_paddle->getPhysicsBody()->setEnabled(false);
+    half_paddle->setVisible(false);
+    startNormalTimer();
+}
+
+void Paddle::halfSize() {
+    if (stade == DOUBLE) {
+        normalSize();
+        return;
+    }
+    stade = HALF;
+    double_paddle->getPhysicsBody()->setEnabled(false);
+    double_paddle->setVisible(false);
+    normal_paddle->getPhysicsBody()->setEnabled(false);
+    normal_paddle->setVisible(false);
+    half_paddle->getPhysicsBody()->setEnabled(true);
+    half_paddle->setVisible(true);
+    startNormalTimer();
+
+}
+
+void Paddle::normalSize() {
+    stade = NORMAL;
+    double_paddle->getPhysicsBody()->setEnabled(false);
+    double_paddle->setVisible(false);
+    normal_paddle->getPhysicsBody()->setEnabled(true);
+    normal_paddle->setVisible(true);
+    half_paddle->getPhysicsBody()->setEnabled(false);
+    half_paddle->setVisible(false);
+}
+
+void Paddle::startNormalTimer() {
+    auto delay = DelayTime::create(POWER_UP_PADDLE_SECONDS);
+    CallFunc *runCallback = CallFunc::create(CC_CALLBACK_0(Paddle::normalSize, this));
+    auto seq = Sequence::create(delay, runCallback, nullptr);
+    runAction(seq);
+}

+ 20 - 6
Classes/GameScene/Paddle.h

@@ -1,9 +1,6 @@
 //
 //  BlocksLayer.h
-//  RedCore2
-//
-//  Created by Gabriel Capella on 01/06/17.
-//
+//  RedCore
 //
 
 #ifndef Paddle_h
@@ -11,9 +8,26 @@
 
 #include "cocos2d.h"
 
+#define HALF 1
+#define NORMAL 2
+#define DOUBLE 3
+
 class Paddle : public cocos2d::Node {
-    
-};
+    public:
+        virtual bool init();
+        void doubleSize();
+        void halfSize();
+        void listen(double width); // começa escutar eventos do touch
+        CREATE_FUNC(Paddle);
+    private:
+        cocos2d::DrawNode* double_paddle;
+        cocos2d::DrawNode* normal_paddle;
+        cocos2d::DrawNode* half_paddle;
+        int stade; // armaze em que tamanho esta
+        void setPX (double px, double width); // arruma a posicao de todas as raquetes
+        void normalSize();
+        void startNormalTimer(); // Inicia o timer para voltar ao normal
 
+};
 
 #endif /* Paddle_h */

+ 5 - 2
Classes/params.h

@@ -45,8 +45,11 @@
 
 // Probabilities
 #define DROP_LEVEL_SAVE 0
-#define DROP_TRIPLE_BALL 1
-#define DROP_RACKET_BALL 0
+#define DROP_TRIPLE_BALL 0
+#define DROP_RACKET_BALL 1
+
+
+#define POWER_UP_PADDLE_SECONDS 10
 
 // Hours to lose level
 #define LOSE_IS 12

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


+ 3 - 3
proj.ios_mac/RedCore.xcodeproj/xcuserdata/capella.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -42,11 +42,11 @@
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "../Classes/GameScene.cpp"
-            timestampString = "518737798.551734"
+            timestampString = "518829544.113316"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "49"
-            endingLineNumber = "49"
+            startingLineNumber = "50"
+            endingLineNumber = "50"
             landmarkName = "GameScene::createScene(int level)"
             landmarkType = "7">
          </BreakpointContent>