【Cocos2d-x3.0学习笔记 07】游戏时间到LitterRunner02

来源:互联网 发布:sql do while的用法 编辑:程序博客网 时间:2024/04/30 20:12

1.用CocoStudio UI编辑按钮

设置画布大小800x500(奇怪的分辨率)

添加按钮,导出

将整个导出的文件夹复制到Resources文件夹下

添加需要的库文件,编辑附加包含目录,添加引用

D:\worktools\cocostests\HongGG\cocos2d\cocos\editor-support\cocostudio\proj.win32\libCocosStudio.vcxproj

D:\worktools\cocostests\HongGG\cocos2d\cocos\ui\proj.win32\libGUI.vcxproj

编辑TollgateScene.h,加入头文件

#include "editor-support/cocostudio/CCSGUIReader.h"#include "ui/CocosGUI.h"using namespace cocostudio;using namespace cocos2d::ui;

加入loadUI和jumpEvent方法

void loadUI();//加载控件void jumpEvent(Ref*,TouchEventType type);//跳跃函数
编辑cpp文件,记得在init方法中调用loadUI哦

void TollgateScene::loadUI(){//加载编辑好的uiauto hUI = cocostudio::GUIReader::getInstance()->widgetFromJsonFile("LitterRunnerUI\LitterRunnerUI_1.ExportJson");this->addChild(hUI);//根据名字找到控件Button* jumpBtn = (Button*)Helper::seekWidgetByName(hUI,"jumpBtn");//设置监听事件jumpBtn->addTouchEventListener(this,toucheventselector(TollgateScene::jumpEvent));}void TollgateScene::jumpEvent(Ref*,TouchEventType type){switch (type){//当点击结束的时候,调用主角的jump方法case TouchEventType::TOUCH_EVENT_ENDED:m_player->jump();break;default:break;}}


接下来,在主角类中加入jump方法吧
在头文件中加入public:void jump();//跳跃函数private:bool m_isJumping;//标记主角是否在跳跃
cpp文件中实现方法

#include "Player.h"Player::Player(){m_isJumping = false;//初始化}Player::~Player(){}bool Player::init(){return true;}void Player::jump(){//没有精灵时结束方法if (getSprite() == NULL){return;}//正在跳跃时结束方法if (m_isJumping){return;}m_isJumping = true;//执行2s,原地跳跃,跳跃高度200,执行1次JumpBy* jumpBy = JumpBy::create(2.0f,Point(0,0),200,1);auto endFunc = [&](){m_isJumping = false;};auto callFunc = CallFunc::create(endFunc);Action* actions = Sequence::create(jumpBy,callFunc,NULL);this->runAction(actions);}
至此,运行项目,点击按钮,主角已经可以跳跃了哦


2.加入怪物

在实体筛选器下新建怪物筛选器,新建怪物类

#ifndef _MONSTER_H_#define _MONSTER_H_#include "Entity.h"#include "Player.h"class Monster:public Entity{public:Monster();~Monster();CREATE_FUNC(Monster);virtual bool init();public:void show();//显示怪物void hide();//隐藏怪物void reset();//重置怪物bool isAlive();//是否是活动状态bool isCollideWithPlayer(Player* player);//碰撞比较private:bool m_isAlive;};#endif

#include "Monster.h"Monster::Monster(){m_isAlive = false;}Monster::~Monster(){}bool Monster::init(){return true;}void Monster::show(){//如果怪物存在if (getSprite() != NULL){//设置为可见状态this->setVisible(true);m_isAlive = true;}}void Monster::hide(){if (getSprite() != NULL){this->setVisible(false);reset();m_isAlive = false;}}void Monster::reset(){if (getSprite() != NULL){this->setPosition(Point(800+CCRANDOM_0_1()*2000,200-CCRANDOM_0_1()*100));}}bool Monster::isAlive(){return m_isAlive;}bool Monster::isCollideWithPlayer(Player* player){//获取碰撞检测对象的boundingBoxRect rect = player->getBoundingBox();Point point = this->getPosition();//判断是否有交集return rect.containsPoint(point);}
新建一个管理筛选器,在下面建一个怪物管理筛选器

#ifndef _MONSTER_MANGER_H_#define _MONSTER_MANGER_H_#include "cocos2d.h"#include "Monster.h"USING_NS_CC;#define MAX_MONSTER_NUM 10//最多10个怪物class MonsterManger:public Node{public:MonsterManger();~MonsterManger();CREATE_FUNC(MonsterManger);virtual bool init();virtual void update(float dt);//更新函数void bindPlayer(Player* player);private:void createMonsters();//创建怪物对象Vector<Monster*> monsters;//存放怪物对象Player* m_player;//主角};#endif

#include "MonsterManger.h"MonsterManger::MonsterManger(){}MonsterManger::~MonsterManger(){}bool MonsterManger::init(){createMonsters();//创建怪物对象this->scheduleUpdate();//开启update函数的调用return true;}void MonsterManger::createMonsters(){Monster* monster = NULL;for (int i=0;i<MAX_MONSTER_NUM;i++){//创建怪物对象monster = Monster::create();monster->bindSprite(Sprite::create("monster.png"));monster->reset();//将怪物添加进控制层?????this->addChild(monster);//保存怪物monsters.pushBack(monster);}}//刷新界面void MonsterManger::update(float dt){for (auto monster:monsters)//遍历每一个怪物{if (monster->isAlive())//如果怪物是活动的{int speed = 4;//定义一个速度,向左移动monster->setPositionX(monster->getPositionX()-speed);if (monster->getPositionX()<0)//怪物已经移出界面了{monster->hide();//隐藏掉}else if(monster->isCollideWithPlayer(m_player)){m_player->hit();//掉血monster->hide();//隐藏}}else{monster->show();//不是活动的话就显示}}}void MonsterManger::bindPlayer(Player* player){this->m_player = player;}


0 0