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.我也问过木头本人啦,他说:随便写,第一别全然照搬代码:第二能够说 ...
随机推荐
- 原生JS---1
js的历史 在上个世纪的1995年,当时的网景公司正凭借其Navigator浏览器成为Web时代开启时最著名的第一代互联网公司. 由于网景公司希望能在静态HTML页面上添加一些动态效果,于是叫Bren ...
- Python 40 数据库-约束
约束 1.什么是约束 ? 除了数据类型以外额外添加的约束 2.为什么要使用约束 ? 为了保证数据的合法性 完整性 分类: 1.not null 非空约束,数据不能为空----------------- ...
- POJ 1111(数字很吉利嘛) 简单BFS
Image Perimeters Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8594 Accepted: 5145 Desc ...
- 最简单的多线程死锁案例代码(Java语言)
package com.thread.test; public class DeadLock { private static Object firstMonitor = new Object(); ...
- Java冒泡,快速,插入,选择排序^_^+二分算法查找
这段时间在学Java,期间学到了一些排序和查找方法.特此写来和大家交流,也方便自己的日后查看与复习. 1.下边是Java的主类: public class Get { public static vo ...
- EnforceLearning-主动强化学习
前言: 被动学习Agent由固定的策略决定其行为.主动学习Agent必须自己决定采取什么行动. 具体方法是: Agent将要学习一个包含所有行动结果概率的完整模型,而不仅仅是固定策略的模型: 接下来, ...
- 本博客基本不再更新,请移步至我的CSDN博客
本博客基本不再更新,请移步至我的CSDN博客:http://blog.csdn.net/wpxu08
- 排序算法Java版
选择排序: public static void selectSort(int[]a) { int minIndex=0; int temp=0; if((a==null)||(a.length==0 ...
- javaee Properties键值对写入和读取方法
package Zjshuchu; import java.util.Properties; import java.util.Set; public class Demo03 { public st ...
- Python 文件操作 day2
一.打开文件的模式1:读.写.追加 1.r读:读模式,只能读,不能写,打开不存在的文件会报错:可省略'r',因为不写默认是读模式 f = open('filename',encoding='utf-8 ...