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.我也问过木头本人啦,他说:随便写,第一别全然照搬代码:第二能够说 ...
随机推荐
- Gym - 101981I The 2018 ICPC Asia Nanjing Regional Contest I.Magic Potion 最大流
题面 题意:n个英雄,m个怪兽,第i个英雄可以打第i个集合里的一个怪兽,一个怪兽可以在多个集合里,有k瓶药水,每个英雄最多喝一次,可以多打一只怪兽,求最多打多少只 n,m,k<=500 题解:显 ...
- JPA实体关联关系,一对一以及转换器
现有两张表 room (rid,name,address,floor) room_detail (rid,roomid,type) 需要创建房间实体,但是也要包含type属性 @Data //lamb ...
- 图像局部显著性—点特征(FREAK)
参考文章:Freak特征提取算法 圆形区域分割 一.Brisk特征的计算过程(参考对比): 1.建立尺度空间:产生8层Octive层. 2.特征点检测:对这8张图进行FAST9-16角点检测,得到具 ...
- 读书笔记「Python编程:从入门到实践」_4.操作列表
4.1 遍历整个列表 4.1.1 深入地研究循环 4.1.2 在for循环中执行更多的操作 4.1.3 在for循环结束后执行一些操作 例 magicians = ['alice', ' ...
- window path 的基本配置
%JAVA_HOME%\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\ ...
- 模拟登录新浪微博(Python)
PC 登录新浪微博时, 在客户端用js预先对用户名.密码都进行了加密, 而且在POST之前会GET 一组参数,这也将作为POST_DATA 的一部分. 这样, 就不能用通常的那种简单方法来模拟POST ...
- kernel学习单
lock (spin_lock, mutex, rw_mutex/spinlock) waitqueue, tasklet, softIRQ, hardIRQ basic struct (atomic ...
- javascript实现:在N个字符串中找出最长的公子串
'use strict' module.exports = function 找出最长公子串 (...strings) { let setsOfSubstrings = [] strings.redu ...
- 挑战程序设计第二版PDF高清完整版免费下载
挑战程序设计pdf 网上有些地方的资源获取比较麻烦,本着共享的原则将此书pdf发出来,希望有条件的同学支持正版. 链接:https://pan.baidu.com/s/16S-5QOjoNxSGQx- ...
- Nginx服务(端口80)
Nginx安装: 一.编译安装 1.安装相应软件 yum install pcre pcre-devel openssl openssl-devel -y 2.检查: rpm -aq pcre pcr ...