说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x
2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记

这一步其中,我们主要完毕下面功能:

1.地图的无限滚动---让主角看起来真的是在跑动

2.给主角加入Jump跳跃和crouch下蹲动作

那么首先来让背景滚动起来,在PlayScene.h中加入:

//初始化背景
void initBG();
//用update函数让地图滚动
virtual void update(float dt); //背景精灵
cocos2d::Sprite* bgSprite1;
cocos2d::Sprite* bgSprite2;
cocos2d::Sprite* groundSprite1;
cocos2d::Sprite* groundSprite2;

然后.Cpp文件里:

void PlayScene::initBG(){
auto visibleSize = Director::getInstance()->getVisibleSize();
//背景1
bgSprite1 = Sprite::create("Map00.png");
bgSprite1->setPosition(visibleSize.width/2,visibleSize.height/2);
this->addChild(bgSprite1); //地面1
groundSprite1 = Sprite::create("Ground00.png");
groundSprite1->setPosition(visibleSize.width/2,groundSprite1->getContentSize().height/2);
this->addChild(groundSprite1); //背景2
bgSprite2 = Sprite::create("Map01.png");
bgSprite2->setPosition(bgSprite1->getContentSize().width+visibleSize.width/2,visibleSize.height/2);
this->addChild(bgSprite2); //地面2
groundSprite2 = Sprite::create("Ground01.png");
groundSprite2->setPosition(bgSprite1->getContentSize().width+visibleSize.width/2,groundSprite2->getContentSize().height/2);
this->addChild(groundSprite2);
} void PlayScene::update(float dt){
int posX1 = bgSprite1->getPositionX();
int posX2 = bgSprite2->getPositionX(); posX1 -= 2;
posX2 -= 2; auto mapSize = bgSprite1->getContentSize(); if(posX1 < -mapSize.width/2){
posX1 = mapSize.width + mapSize.width/2;
posX2 = mapSize.width/2;
}
if(posX2 < -mapSize.width/2){
posX2 = mapSize.width + mapSize.width/2;
posX1 = mapSize.width/2;
} bgSprite1->setPositionX(posX1);
bgSprite2->setPositionX(posX2);
groundSprite1->setPositionX(posX1);
groundSprite2->setPositionX(posX2);
}

完毕这些,我们就在PlayScene中的init函数:

bool PlayScene::init(){
if(!Layer::init()){
return false;
} SimpleAudioEngine::getInstance()->playBackgroundMusic("background.mp3",true); initPhysicWorld(); initBG(); //开启update
this->scheduleUpdate(); m_runner = Runner::create();
m_runner->setPosition(runner_posX,ground_hight+m_runner->getRunJumpSize().height/2);
m_runner->Run(); this->addChild(m_runner); return true;
}

这里要注意:我们应该把背景的初始化放置在主角创建的前面,由于先创建主角,就等于在屏幕上先画出主角,然后再画背景,那么主角就会被挡住。当然,这里也能够设置绘画的层次,那么执行例如以下图:

这里任然不是 动态的截图,所以看不出地图滚动的效果,求指导。。。

以下来为主角加入除开跑动的其它动作:

在Runner的 initActionSet函数中,我们先加入其它的帧动画:

void Runer::initActionSet(SpriteFrameCache* frameCache){
SpriteFrame* frame = NULL;
//3.0中改用vector 而不是用Array
Vector<SpriteFrame*>frameVector; /* 1.----------------载入跑动的Animation-----------------*/
for(int i = 0; i <= 7; i ++) {
//从缓存池中载入精灵到Vector
frame = frameCache->spriteFrameByName(String::createWithFormat("runner%d.png",i)->getCString());
frameVector.pushBack(frame);
} //用vector里面的SpriteFrame列表创建Animation 以及设置一些參数
auto run_animation = Animation::createWithSpriteFrames(frameVector,0.1f,-1);
//将跑动的 Animation 取名为 running
AnimationCache::getInstance()->addAnimation(run_animation,"running"); /*4------------------载入跳跃过程中上升的动画---------------------------*/
frameVector.clear();
for(int i = 0; i <= 3; i ++){
frame = frameCache->spriteFrameByName(String::createWithFormat("runnerJumpUp%d.png",i)->getCString());
frameVector.pushBack(frame);
}
auto jumpUp_animation = Animation::createWithSpriteFrames(frameVector,0.2);//不设置无限循环
AnimationCache::getInstance()->addAnimation(jumpUp_animation,"jumpUp"); /*------------------载入跳跃过程中下落的动画----------------------------*/
frameVector.clear();
for(int i = 0; i <= 1; i ++){
frame = frameCache->spriteFrameByName(String::createWithFormat("runnerJumpDown%d.png",i)->getCString());
frameVector.pushBack(frame);
}
auto jumpDown_animation = Animation::createWithSpriteFrames(frameVector,0.3);
AnimationCache::getInstance()->addAnimation(jumpDown_animation,"jumpDown"); /*------------------载入下蹲-------------------------------------------*/
frameVector.clear();
frame = frameCache->spriteFrameByName("runnerCrouch0.png");
frameVector.pushBack(frame);
auto crouch_animation = Animation::createWithSpriteFrames(frameVector,0.3);//不设置无限循环
AnimationCache::getInstance()->addAnimation(crouch_animation,"crouch"); }

加入Jump,Crouch函数,以及update函数:

void Jump();

void Crouch();

virtual void update(float dt);

实现:

void Runner::Jump(){
//仅仅有在跑动时才干起跳
if(m_state == running){
m_state = jumpUp; auto mass = this->getPhysicsBody()->getMass()*150;// 力大小 this->getPhysicsBody()->applyImpulse(Vect(0,mass)); m_runner->stopAllActions(); doAction("jumpUp");
}
} void Runner::update(float dt){
auto vel = this->getPhysicsBody()->getVelocity();
if(m_state == jumpUp){
if(vel.y < 0.1){
m_state = jumpDown;
m_runner->stopAllActions();
doAction("jumpDown");
}
} if(m_state == jumpDown){
CCLOG("%f",vel.y);
//不应该是 等于 0
if(vel.y > 0){
m_state = running;
m_runner->stopAllActions();
doAction("running");
}
}
} void Runner::Crouch(){
//仅仅能在跑动的时候蹲下
if(m_state == running){
m_state = crouch;
m_runner->stopAllActions();
initBody();
doAction("crouch");
}
}

这里的Jump 我们就给主角一个向上的力,而且这个力是瞬时力,这样主角就会上升,可是加速度向下,慢慢到达最高点然后 因为重力而下落;

这里的update函数用来做这个事: 当主角向上跳到最高点的时候,就应该下落,切换下落状态,运行下落帧动画,这里是借鉴了前辈的,首先在JumpUp状态下,假设y速度小于 0.1 那么我们觉得它到了最高点,切换下落。在JumpDown状态下,y速度大于0,我们就觉得它到达了地面,切换跑动状态。 前辈的推断中是 vel.y == 0 过程中我调试了,由于速度是float,== 0这样的推断非常不精确,然后我的主角就一直处于下落的那个动作状态啦。。。。。



Ok到这里,我们主角的动作都准备好了,以下就開始加入 button,来控制主角运行这些动作啦!!

个人愚昧观点,欢迎指正与讨论(好像也没人会和我讨论,,哎)

cocos2d-x 3.0游戏实例学习笔记 《跑酷》第四步--地图循环&amp;主角加入动作的更多相关文章

  1. cocos2d-x 3.0游戏实例学习笔记 《跑酷》 完结篇--源代码放送

    说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...

  2. cocos2d-x 3.0游戏实例学习笔记 《跑酷》第一步--- 开始界面

    说明:这里是平局:晓风残月前辈的博客.他是将泰然网的跑酷教程.用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...

  3. cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第三步---主角开跑&amp;同一时候带着刚体

    说明:这里是借鉴:晓风残月前辈的博客.他是将泰然网的跑酷教程.用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...

  4. cocos2d-x 3.0游戏实例学习笔记 《跑酷》第七步--物理碰撞检測(1)

    说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...

  5. cocos2d-x 3.0游戏实例学习笔记 《跑酷》移植到android手机

    说明:这里是借鉴:晓风残月前辈的博客.他是将泰然网的跑酷教程.用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...

  6. coco2d-x 3.0游戏实例学习笔记 《跑酷》 第二步---游戏界面&amp;全新的3.0物理世界

    说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程.用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写.并做相关笔记 ...

  7. cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第六步--金币&amp;岩石加入而且管理

    说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...

  8. cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第五步--button控制主角Jump&amp;Crouch

    说明:这里是借鉴:晓风残月前辈的博客.他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...

  9. cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第二步---编辑器(1)--触摸加入点

    /* 说明: **1.本次游戏实例是<cocos2d-x游戏开发之旅>上的最后一个游戏,这里用3.0重写并做下笔记 **2.我也问过木头本人啦,他说:随便写,第一别全然照搬代码:第二能够说 ...

随机推荐

  1. 【干货】免费获得WebStorm软件

    内容提要: 1.WebStorm简介 2.如何免费获得WebStorm 3.利用学生身份免费获得正式版WebStorm WebStorm简介 WebStorm 是一款前端开发 IDE(集成开发环境), ...

  2. 简单搜索dfs, 简单的修剪搜索

    选择最合适的语言做一个项目是非常重要的.但,熟练的掌握自己的武器,这也是非常重要的. ========================================================= ...

  3. Android.9图片评论(一个)

    什么是.9图片 至于什么是.9图片这里就简单提一下,即图片后缀名前有.9的图片,如pic.9.png.pic1.9.jgp,诸如此类的图片就称为.9图片. .9图片的作用 ①.9图片的作用是在图片拉伸 ...

  4. App山寨疯狂 爱加密Apk加密平台防破解

    App山寨疯狂 爱加密Apk加密平台防破解,Android系统由于其开源性,眼下已占领全球智能机近80%的市场,远超微软的WP系统和苹果的IOS系统.然而也正是由于开源性,Android盗版App在国 ...

  5. crm创建报告补充导航

    报告导航实现动态交互体验报告. 通过使用各种类型的操作的,报告允许用户导航到特定的报告.Microsoft Dynamics CRM 记录或其它网站 动态钻取到 Microsoft Dynamics ...

  6. SVD奇异值分解的几何物理意义资料汇总

    学习SVD奇异值分解的网上资料汇总: 1. 关于svd的一篇概念文,这篇文章也是后续几篇文章的鼻祖~ http://www.ams.org/samplings/feature-column/fcarc ...

  7. ubuntu 14.04 安装搜狗拼音输入法

    原文:ubuntu 14.04 安装搜狗拼音输入法 ubuntu桌面系统下终于有了好用的拼音法-搜狗拼音输入法,欲在ubuntu 14.04下安装搜狗拼音输入法相当的简单. 先到搜狗拼音官网下载对应的 ...

  8. 第13章 模版方法模式(Template Method)

    原文  第13章 模版方法模式(Template Method) 模板模式 模板模式 举例:模拟下数据库的update方法,先删除在插入. 1 2 3 4 5 6 7 8 9 10 11 12 13 ...

  9. POJ1743---Musical Theme(+后缀数组二分法)

    Description A musical melody is represented as a sequence of N (1<=N<=20000)notes that are int ...

  10. TypeScript 基本语法

    TypeScript 基本语法   TypeScript 是微软开发的 JavaScript 的超集,TypeScript兼容JavaScript,可以载入JavaScript代码然后运行.TypeS ...