#include "mainGameScene.h"
#include "startGameTitle.h"
#include "heroMiner.h"
#include "pauseMenu.h"
#include "HelloWorldScene.h"
#include "cocostudio/CocoStudio.h"
#include "ui/CocosGUI.h"
USING_NS_CC;
using namespace cocos2d::ui;
using namespace cocostudio::timeline;
#define AMOUNT1 100
#define LEVEL_ACOUNT 2
mainGameScene::mainGameScene(void)
{
}
mainGameScene::~mainGameScene(void)
{
//删除自定义事件
_eventDispatcher->removeCustomEventListeners("continueGame");
_eventDispatcher->removeCustomEventListeners("nextGame");
_eventDispatcher->removeCustomEventListeners("exitGame");
}
mainGameScene* mainGameScene::addMyself()
{
mainGameScene* mgs=new mainGameScene();
if (mgs&&mgs->createScene())
{
return mgs;
}
else
{
delete mgs;
mgs=nullptr;
return NULL;
}
}
Scene* mainGameScene::createScene()
{
Scene* scene=Scene::createWithPhysics();
// scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);//调试
scene->getPhysicsWorld()->setGravity(Vec2::ZERO);
mainGameScene* mgs=mainGameScene::create();
scene->addChild(mgs);
return scene;
}
bool mainGameScene::init()
{
if (!LayerColor::initWithColor(Color4B::WHITE))
{
return false;
}
isShakeClaw=false;
clawHeight=20;
timeNumber=60;
clawRate=10;
this->setTouchEnabled(true);
gold=nullptr;
Size visibleSize=Director::getInstance()->getVisibleSize();
Size size=Director::getInstance()->getWinSize();
//创建物理世界
node=Node::create();
node->setPhysicsBody(PhysicsBody::createEdgeBox(size));
node->setContentSize(size);
node->setAnchorPoint(Vec2(0.5,0.5));
node->setPosition(size.width/2,size.height/2);
node->getPhysicsBody()->setContactTestBitmask(10);
node->getPhysicsBody()->setCategoryBitmask(10);
node->getPhysicsBody()->setCollisionBitmask(10);
this->addChild(node);
node->setTag(AMOUNT1);//设置标记
int level=UserDefault::getInstance()->getIntegerForKey("level");
// Node* gameScene=CSLoader::createNode(String::createWithFormat("level_%d.csb",level)->getCString());
// this->addChild(gameScene);
Node* gameScene;
switch (level%LEVEL_ACOUNT)
{
case 1:
gameScene=CSLoader::createNode("level.csb");
this->addChild(gameScene);
break;
case 0:
gameScene=CSLoader::createNode("level_2.csb");
this->addChild(gameScene);
break;
default:
break;
}
brand=CSLoader::createNode("brand.csb");
this->addChild(brand);
claw=CSLoader::createNode("claw.csb");
this->addChild(claw);
claw->setPosition(Vec2(visibleSize.width/2,visibleSize.height/2+150));
//获取基础容器的各个节点
vector=Helper::seekWidgetByName(static_cast<Widget*>(gameScene),"Panel")->getChildren();
//配置物理盒子
this->currentNodeFromPanel();
textMiney=static_cast<Text*>(Helper::seekWidgetByName(static_cast<Widget*>(brand),"Text_1"));
textCurLevel=static_cast<Text*>(Helper::seekWidgetByName(static_cast<Widget*>(brand),"Text_2"));
textMiney->setText("0");
switch (level%LEVEL_ACOUNT)
{
case 1:
textCurLevel->setText("600");
break;
case 0:
textCurLevel->setText("1200");
break;
default:
break;
}
sgt=startGameTitle::create();
this->addChild(sgt);
//获取绳子
imageClaw=static_cast<ImageView*>(Helper::seekWidgetByName(static_cast<Widget*>(claw),"rope"));
this->scheduleOnce(CC_SCHEDULE_SELECTOR(mainGameScene::beginGame),3);
return true;
}
void mainGameScene::beginGame(float dlt)
{
//碰撞事件监测
auto contactEvent=EventListenerPhysicsContact::create();
contactEvent->onContactBegin=[this](PhysicsContact& contact)
{
//this->scheduleClawDown();
circle->setPhysicsBody(nullptr);//解除绑定
shapeB=contact.getShapeB()->getBody()->getNode();
if (shapeB->getTag()!=AMOUNT1)
{
ropeRate(shapeB->getName());//确定钩到的东西然后确定钩子回收速度(有)
this->clawClosed();//合拢
gold=golds::createGold(shapeB->getName());
if (gold)
{
this->setGoldPosition(shapeB->getName());//确定金块位置
circle->addChild(gold);//加入circle可以随绳子移动
shapeB->removeFromParent();//移除
}
else
{
gold=nullptr;
}
}
else
{
ropeRate("WORD");//确定钩到的东西然后确定钩子回收速度(无)
}
return true;
};
_eventDispatcher->addEventListenerWithSceneGraphPriority(contactEvent,this);
//触摸事件响应
auto touchEvent=EventListenerTouchOneByOne::create();
touchEvent->onTouchBegan=[this](Touch* touch,Event* event)
{
if (!isShakeClaw)
{
this->scheduleClawUp();
}
return false;
};
_eventDispatcher->addEventListenerWithSceneGraphPriority(touchEvent,this);
//暂停
auto pause=static_cast<Button*>(Helper::seekWidgetByName(static_cast<Widget*>(brand),"pause"));
pause->addTouchEventListener([this](Ref* ref,Widget::TouchEventType type)
{
if (type==Widget::TouchEventType::ENDED)
{
this->onExit();//暂停游戏
auto menu=pauseMenu::create();
Director::getInstance()->getRunningScene()->addChild(menu);
}
});
//自定义事件
_eventDispatcher->addCustomEventListener("continueGame",[this](EventCustom* event)
{
this->onEnter();
});
_eventDispatcher->addCustomEventListener("exitGame",[this](EventCustom* event)
{
this->onEnter();
this->scheduleOnce(CC_SCHEDULE_SELECTOR(mainGameScene::overGameTitle),1.0f);
});
_eventDispatcher->addCustomEventListener("nextGame",[this](EventCustom* event)
{
this->onEnter();
this->scheduleOnce(CC_SCHEDULE_SELECTOR(mainGameScene::nextGameTitle),1.0f);
});
//旋转钩子
this->shakeClaw();
//显示牌子
auto brandTimeLine=CSLoader::createTimeline("brand.csb");
brand->runAction(brandTimeLine);
brandTimeLine->gotoFrameAndPlay(0,30,false);
//显示倒计时和关卡数
showTimeAndBarrier();
//移除清理
sgt->removeAllChildren();
}
void mainGameScene::scheduleClawUp()
{
isShakeClaw=!isShakeClaw;
imageClaw->stopAllActions();
this->schedule(CC_SCHEDULE_SELECTOR(mainGameScene::setClawHeightUp),0.025f);
}
void mainGameScene::setClawHeightUp(float dlt)
{
circle=static_cast<ImageView*>(Helper::seekWidgetByName(static_cast<Widget*>(claw),"circle"));
circle->setPhysicsBody(PhysicsBody::createCircle(6));
circle->getPhysicsBody()->setContactTestBitmask(10);
circle->getPhysicsBody()->setCategoryBitmask(10);
circle->getPhysicsBody()->setCollisionBitmask(10);
clawHeight+=10;
imageClaw->setSize(Size(3,clawHeight));
}
void mainGameScene::scheduleClawDown(int rate)
{
clawRate=rate;
this->unschedule(CC_SCHEDULE_SELECTOR(mainGameScene::setClawHeightUp));//关闭定时器
this->schedule(CC_SCHEDULE_SELECTOR(mainGameScene::setClawHeightDown),0.025f);
}
void mainGameScene::setClawHeightDown(float dlt)
{
clawHeight-=clawRate;
imageClaw->setSize(Size(3,clawHeight));
if (clawHeight<=20)
{
imageClaw->setSize(Size(3,20));
isShakeClaw=!isShakeClaw;//可以启用钩子
if (shapeB->getTag()!=AMOUNT1)
{
this->clawShutDown();//张开
}
//移除gold
if (gold)
{
//粒子特效
fire=ParticleFire::create();
this->addChild(fire);
fire->setPosition(Vec2(212.5f,560.0f));
this->scheduleOnce(CC_SCHEDULE_SELECTOR(mainGameScene::showOutFire),1.5f);
this->addScore(shapeB->getName());
gold->removeFromParent();
gold=nullptr;
}
this->shakeClaw();//旋转
this->unschedule(CC_SCHEDULE_SELECTOR(mainGameScene::setClawHeightDown));//关闭定时器
}
}
void mainGameScene::shakeClaw()
{
//爪子旋转
imageClaw->setAnchorPoint(Vec2(0.5f,1.0f));
imageClaw->setRotation(0.0f);
auto rotate1=RotateBy::create(1.2f,-85);
auto rotate2=RotateBy::create(2.4f,170);
auto rotate3=RotateBy::create(1.2f,-85);
imageClaw->runAction(RepeatForever::create(Sequence::create(rotate1,rotate2,rotate3,nullptr)));
}
void mainGameScene::addScore(std::string str)
{
if (str=="bigGold")
{
std::string str=textMiney