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.我也问过木头本人啦,他说:随便写,第一别全然照搬代码:第二能够说 ...
随机推荐
- codeforces——思路与规律
codeforces 804B http://codeforces.com/problemset/problem/804/B /* 题意:给定一个只含ab的序列,每次操作可将ab变为bba 问 ...
- Android PopWindow的替代品BasePopup
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/109 背景描述 最近一段时间,又看到了这个开源项目Base ...
- Chrome 最小化恢复之后部分黑屏
解决办法:设置->显示高级设置->关闭硬件加速
- jorgchart,帮助你生成组织结构图的
下载地址: http://yunpan.cn/c6pfenkmmFV2q 访问密码 8e29 演示链接: http://www.gbtags.com/gb/share/546.htm jstree. ...
- itext 生成doc文档 小结(自己备忘)
1.引入maven <dependency> <groupId>com.lowagie</groupId> <artifactId>itext</ ...
- B - Bit++
Problem description The classic programming language of Bitland is Bit++. This language is so peculi ...
- 文字水平居中和垂直居中的CSS
首先选择一个需要显示文字的选择器,我这里选择的是微信小程序里面的<view>选择器,在其他语言(如html)的选择器里是一样的做法: <view class="btn-it ...
- Hibernate多表映射(三)
一对多|多对一 一个分类对应多个商品,一个商品只属于一个分类 创建分类表 products用set装,set特点值不能够重复 package com.hibernate.domain; import ...
- sql server数据库可疑状态解决方法
前段时间客户数据服务器断电,开机后发现数据库状态标记为可疑,可能是断电引起的数据库日志文件损坏,修复方法如下: 只有mdf文件,重建日志: --注:example为测试用数据库,相应的Example_ ...
- Data mapping-数据映射
数据映射:根据数据的结构信息建立数据间的映射操作机制. 数据映射的要素: 一.数据 1.源数据: 2.目标数据: 3.数据间关系: 4.数据的元数据(结构信息). 5.元素类型的对应关系. 二.元数据 ...