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.我也问过木头本人啦,他说:随便写,第一别全然照搬代码:第二能够说 ...
随机推荐
- unity3D 使用欧拉角控制视野注意点
变量声明: public PlayerInput p; //表示控制代码用来获得用户是否按下 public float rotateSpeed = 50f; //旋转速度 private GameOb ...
- 计算某个时间段(2017-10-01 2017-12-01)内svn更新文件的MD5
#!/bin/sh svn up svn log -v -r {$1}:{$2} | grep / | grep -v xxx | sort -f -u | uniq | awk -F 'xxxx' ...
- B - Link/Cut Tree
Problem description Programmer Rostislav got seriously interested in the Link/Cut Tree data structur ...
- Last-Modified If-Modified-Since ETag If-None-Match
Last-Modified.If-Modified-Since 有些数据随时都在变化. CNN.com 的主页经常几分钟就更新.另一方面,Google.com 的主页几个星期才更新一次 (当他们上传特 ...
- [实战经验][SQL Sever 2008 (R)解决方法累积
SQL Sever 2008 (R)的安装图解及配置 http://www.soft6.com/v9/2009/jcsj_1030/115821.html 产品密钥,选择“输入产品密钥”,输入:PTT ...
- 【sqli-labs】 less35 GET- Bypass Add Slashes(we dont need them) Integer based (GET型绕过addslashes() 函数的整型注入)
整型注入不用闭合引号,那就更简单了 http://192.168.136.128/sqli-labs-master/Less-35/?id=0 union select 1,database(),3% ...
- 【sqli-labs】 less31 GET- Blind -Impidence mismatch -Having a WAF in front of web application (GET型基于盲注的带有WAF注入)
标题和less30一样 http://192.168.136.128/sqli-labs-master/Less-31/login.php?id=1&id=2" ")闭合的 ...
- HDU_1711_初识KMP算法
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- js消息框
<script> function del(obj, id) { layer.confirm('是否要删除信息!', { btn: ['确定', '取消'] }, function (in ...
- LINUX - getopts
getopts optionString opt; optionString :所有参数组成的-参数串: opt:从optionString 每次取的参数值: 当optionString用[:]开头, ...