cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第六步--金币&岩石加入而且管理
说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x
2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记
这一步基本思路也是借鉴了前辈重写的泰然教程,金币和岩石抽象出一个基类,可是总的细节设计和前辈的非常大的不同,后面写完,我认为事实上Runner也能够继承自那个基类,只是因为自己还有其它事。就没去尝试啦。
那么这里我是这样设计的:基类Base ,主要就是 setSprite,和 getSprite,以及getConSize--这个主要是为了后面金币和岩石的物理刚体绑定,那么金币Coin里面就 initBody--初始物理刚体。createAnimate--创建金币的旋转动画。Rock里面就是一个initBody。。
当时因为这里是自己设计的。想得比較乱,然后发现,事实上initBody 也能够抽象在基类里面。这里就没有改了。
然后,有了Coin 和 Rock,它们的出现,隐藏。以及位置放置,我们就用一个BaseManager来完毕,那么这里我是学习了 笨木头的方法: 为了反复的 create 金币,每次金币走出屏幕外。或者被主角吃了,我们就让它不可见,然后在BaseManager里面用一个update函数。对于不可见的金币我们让它重现江湖。。
。
。
OK上马:Base.h & Base.cpp
- #ifndef __Base__H__
- #define __Base__H__
- #include "cocos2d.h"
- class Base : public cocos2d::Node{
- public:
- Base();
- void setSprite(cocos2d::Sprite* sprite);
- cocos2d::Sprite* getSprite();
- cocos2d::Size getConSize();
- private:
- cocos2d::Sprite* m_sprite;
- };/**/
- #endif
- #include "Base.h"
- USING_NS_CC;
- Base::Base(){
- m_sprite = NULL;
- }
- void Base::setSprite(Sprite* sprite){
- m_sprite = sprite;
- //要加入到子节点中 ,才干被显示出来
- this->addChild(m_sprite);
- }
- Sprite* Base::getSprite(){
- return m_sprite;
- }
- Size Base::getConSize(){
- return m_sprite->getContentSize();
- }
金币 Coin.h & .cpp
- #ifndef __Coin__H__
- #define __Coin__H__
- #include "Base.h"
- class Coin : public Base{
- public:
- virtual bool init();
- CREATE_FUNC(Coin);
- //金币动作
- cocos2d::Animate* createAnimate(cocos2d::SpriteFrameCache* frameCache);
- //物理刚体
- void initBody();
- private:
- };/**/
- #endif
- ------------------------.cpp---------------------------------
- #include "Coin.h"
- USING_NS_CC;
- bool Coin::init(){
- if(!Node::init()){
- return false;
- }
- //缓存池
- auto frameCache = SpriteFrameCache::getInstance();
- frameCache->addSpriteFramesWithFile("parkour.plist","parkour.png");
- auto sprite = Sprite::createWithSpriteFrameName("coin0.png");
- //绑定
- setSprite(sprite);
- //运行动作
- getSprite()->runAction(createAnimate(frameCache));
- //绑定刚体
- initBody();
- return true;
- }
- Animate* Coin::createAnimate(SpriteFrameCache* frameCache){
- SpriteFrame* frame = NULL;
- //数组不行 要用vector
- //auto frameArray = Array::create();
- //frameArray->retain();
- Vector<SpriteFrame*>frameArray;
- // 用一个列表保存全部SpriteFrame对象
- for(int i = 0; i <= 7; i++) {
- /* 从SpriteFrame缓存池中获取CCSpriteFrame对象 */
- frame = frameCache->spriteFrameByName(String::createWithFormat("coin%d.png", i)->getCString());
- frameArray.pushBack(frame);
- }
- /* 使用SpriteFrame列表创建动画对象 */
- auto animation = Animation::createWithSpriteFrames(frameArray);
- animation->setLoops(-1);
- animation->setDelayPerUnit(0.1f);
- /* 将动画包装成一个动作 */
- auto action = Animate::create(animation);
- return action;
- }
- void Coin::initBody(){
- auto phyBody = PhysicsBody::createEdgeBox(getSprite()->getContentSize());
- phyBody->setCategoryBitmask(1);
- phyBody->setCollisionBitmask(1);
- phyBody->setContactTestBitmask(1);
- this->setPhysicsBody(phyBody);
- }
岩石Rock.h & .cpp
- <span style="font-size:14px;">#ifndef __Rock__H__
- #define __Rock__H__
- #include "Base.h"
- #include "cocos2d.h"
- class Rock : public Base{
- public:
- virtual bool init();
- CREATE_FUNC(Rock);
- void initBody();
- };/**/
- #endif
- -------------------------------------------
- #include "Rock.h"
- USING_NS_CC;
- bool Rock::init(){
- if(!Node::init()){
- return false;
- }
- auto frameCache = SpriteFrameCache::getInstance();
- frameCache->addSpriteFramesWithFile("parkour.plist","parkour.png");
- auto sprite = Sprite::createWithSpriteFrameName("rock.png");
- setSprite(sprite);
- initBody();
- return true;
- }
- void Rock::initBody(){
- auto phyBody = PhysicsBody::createEdgeBox(getSprite()->getContentSize());
- phyBody->setCategoryBitmask(1);
- phyBody->setCollisionBitmask(1);
- phyBody->setContactTestBitmask(1);
- this->setPhysicsBody(phyBody);
- }</span><span style="font-size:18px;">
- </span>
那么这里主要重点看 管理类BaseManager.h & .cpp
- #ifndef __BaseManager__H__
- #define __BaseManager__H__
- #include "cocos2d.h"
- #include "Coin.h"
- #include "Rock.h"
- #define coinNum 4
- #define coinTag 2 //这里关于Tag 用于后面的碰撞检測
- #define rockNum 2
- #define rockTag 3
- class BaseManager : public cocos2d::Node{
- public:
- CREATE_FUNC(BaseManager);
- virtual bool init();
- virtual void update(float dt);
- private:
- void createCoin();
- cocos2d::Array* m_coinArr;
- void createRock();
- cocos2d::Array* m_rockArr;
- };/**/
- #endif
- --------------------------------------------------------
- #include "BaseManager.h"
- #define ground_hight 59
- USING_NS_CC;
- bool BaseManager::init(){
- if(!Node::init()){
- return false;
- }
- createCoin();
- createRock();
- this->scheduleUpdate();
- return true;
- }
- void BaseManager::createCoin(){
- m_coinArr = Array::create();
- m_coinArr->retain();
- Coin* coin = NULL;
- for(int i = 1; i <= coinNum; ++ i){
- coin = Coin::create();
- coin->setVisible(false);
- coin->setTag(coinTag);
- //记得加入
- this->addChild(coin);
- m_coinArr->addObject(coin);
- }/**/
- }
- void BaseManager::createRock(){
- m_rockArr = Array::create();
- m_rockArr->retain();
- Rock* rock = NULL;
- float dis = 960;//两岩石的间距
- for(int i = 1; i <= rockNum; ++ i){
- rock = Rock::create();
- rock->setTag(rockTag);
- rock->setPosition(dis,ground_hight+rock->getConSize().height/2);
- dis += 640;
- //记得加入
- this->addChild(rock);
- m_rockArr->addObject(rock);
- }/**/
- }
- void BaseManager::update(float dt){
- Ref* obj = NULL;
- Coin* coin = NULL;
- //须要重置金币的个数
- int setNum = 0;
- CCARRAY_FOREACH(m_coinArr,obj){
- coin = (Coin*)obj;
- //不在屏幕
- if(coin->getPositionX() < -coin->getConSize().width/2){
- coin->setVisible(false);
- }
- //要是不可见,要不就是不在屏幕里,要不就是被碰撞了
- if( !coin->isVisible() ){
- setNum ++;
- }
- //让金币移动
- coin->setPositionX(coin->getPositionX()-2);
- }
- //4个所有重置
- if(setNum == 4){
- int i = 0;
- float posX = 640+50;
- float posY = ground_hight + 15 + CCRANDOM_0_1()*60;
- CCARRAY_FOREACH(m_coinArr,obj){
- coin = (Coin*)obj;
- //不在屏幕
- if(coin->getPositionX() < -coin->getConSize().width/2){
- coin->setVisible(false);
- }
- //要是不可见。要不就是不在屏幕里。要不就是被碰撞了
- if( !coin->isVisible() ){
- //两个两个一起
- if(i < 2){
- posX += 30;//两个金币同一高度,间隔30
- }else{
- //又一次重置位置
- i = -1;
- posY = ground_hight + 15 + CCRANDOM_0_1()*60;
- posX += 400;
- }
- i ++;//重置金币个数记录
- //
- coin->setVisible(true);
- coin->setPosition(posX,posY);
- }
- }
- }
- Ref* rockObj = NULL;
- Rock* rock = NULL;
- CCARRAY_FOREACH(m_rockArr,rockObj){
- rock = (Rock*)rockObj;
- if(rock->getPositionX() < -rock->getConSize().width/2){
- rock->setVisible(false);
- }
- if(rock->isVisible() == false){
- float posX = 1280;
- float posY = ground_hight + rock->getConSize().height/2;
- if(CCRANDOM_MINUS1_1() > 0){
- posY += 50;
- }
- rock->setPosition(posX,posY);
- rock->setVisible(true);
- }
- rock->setPositionX(rock->getPositionX()-2);
- }
- }
代码中,我们主要看看 两个Create 函数,以及update函数。
createCoin :我们先确定整个过程仅仅有4个金币,而且一開始都设置为 不可见,那么在update 函数中,我们对全部的金币遍历,假设是不可见,那么我们就让它可见,而且两个一起 间隔30 ,同一高度放置,然后 高度不一致。可能出现地面,可能须要主角跳起来才可以到,而createRock。我们整个屏幕就放两个就够了。这两个也有两个位置,一个在地面。一个在空中须要主角crouch或者Jump也可以。。。事实上这里的位置放置算法(应该算是有点算法的味道吧)
写得非常乱,这里就所有是我自己设计的。。
。感觉金币岩石出现的非常没有 美观。
。
。
只是也还算是能够执行。
。。。。
那么我们能够測试一下。在PlayScene中加入成员
BaseManager* m_manager;
然后在init函数中 create 增加 this的addChild中
可是这里的话,我们建议把 Coin & Rock 两个类里面的 init 函数中的 initBody 先凝视掉,然后再測试。不然带着刚体,主角跑起来非常不顺利。測试例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWllZMTczNTMzODMy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" style="border:none; max-width:100%">
以下就要来利用物理碰撞检測了---全部的也就快结束啦
个人愚昧观点,欢迎指正与讨论
cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第六步--金币&岩石加入而且管理的更多相关文章
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》 完结篇--源代码放送
说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》第一步--- 开始界面
说明:这里是平局:晓风残月前辈的博客.他是将泰然网的跑酷教程.用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第三步---主角开跑&同一时候带着刚体
说明:这里是借鉴:晓风残月前辈的博客.他是将泰然网的跑酷教程.用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》第七步--物理碰撞检測(1)
说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第五步--button控制主角Jump&Crouch
说明:这里是借鉴:晓风残月前辈的博客.他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》移植到android手机
说明:这里是借鉴:晓风残月前辈的博客.他是将泰然网的跑酷教程.用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...
- coco2d-x 3.0游戏实例学习笔记 《跑酷》 第二步---游戏界面&全新的3.0物理世界
说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程.用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写.并做相关笔记 ...
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》第四步--地图循环&主角加入动作
说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...
- cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第二步---编辑器(1)--触摸加入点
/* 说明: **1.本次游戏实例是<cocos2d-x游戏开发之旅>上的最后一个游戏,这里用3.0重写并做下笔记 **2.我也问过木头本人啦,他说:随便写,第一别全然照搬代码:第二能够说 ...
随机推荐
- selenium3 + python - select定位
一.Select模块(index) 1.导入Select模块.直接根据属性或索引定位 2.先要导入select方法:from selenium.webdriver.support.se ...
- C# 对象克隆,DataTable转LIST
public class ConvertHelper<T> where T : new() { private static string module = "ConvertHe ...
- Spring Boot (3) 热部署devtools
热部署:当发现程序修改时自动启动应用程序. spring boot为开发者提供了一个名为spring-boot-devtools的模块来使sring boot应用支持热部署,提高开发者的开发效率,无需 ...
- C#动态验证码
验证码定义: 就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能 项目中,我们登录注册 ...
- Redis学习笔记(五)- 数据类型之set类型
Redis 的set是string类型的无序集合.set元素最大可以包含(2的32次方-1)个元素.set的是通过hash table实现的,所以添加,删除,查找的复杂度都是O(1).hash tab ...
- Java 基本的递归写法
1.首先我们得有一个树状结构的表,类似这种结构.必须得有 id,pid 其他的根据需要来. 我们叫它treeTbl表吧.这里pid为0的表示是顶级节点. 2.接着select * from tree ...
- SQlserver 当输入参数为可选条件
以前很懒,都是用拼接字符串的方式,加上if 语句,根据输入参数是否为空来判断是否需要在where 后加上对应字段的条件限制 但是拼接字符串很烦,又总是被转义符搞得很烦 '''' 所以想了其他办法 分 ...
- 【Oracle】体系结构
1. 理解实例和数据库 ☞ 实例是一组后台进程和共享内存 ☞ 数据库是磁盘上存储的数据集合 ☞ 实例“一生”只能装载并打开一个数据库 ☞ 数据库可以由一个或多个实例(RAC)装载和打开 [oracle ...
- OpenCV:Adaboost训练时数据扩增
更准确的模型需要更多的数据,对于传统非神经网络机器学习方法,不同的特征需要有各自相符合的数据扩增方法. 1. 在使用opencv_traincascade.exe 过程中,图像读取在 classi ...
- Maya API编程快速入门
一.Maya API编程简介 Autodesk® Maya® is an open product. This means that anyone outside of Autodesk can ch ...