cocos2d-x 3.0游戏实例学习笔记 《跑酷》第四步--地图循环&主角添加动作
来源:互联网 发布:微商和淘宝哪个东西贵 编辑:程序博客网 时间:2024/05/16 19:40
说明:这里是借鉴:晓风残月 前辈的博客,他是将泰然网的跑酷教程,用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();//背景1bgSprite1 = Sprite::create("Map00.png");bgSprite1->setPosition(visibleSize.width/2,visibleSize.height/2);this->addChild(bgSprite1);//地面1groundSprite1 = Sprite::create("Ground00.png");groundSprite1->setPosition(visibleSize.width/2,groundSprite1->getContentSize().height/2);this->addChild(groundSprite1);//背景2bgSprite2 = Sprite::create("Map01.png");bgSprite2->setPosition(bgSprite1->getContentSize().width+visibleSize.width/2,visibleSize.height/2);this->addChild(bgSprite2);//地面2groundSprite2 = 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();//开启updatethis->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 而不是用ArrayVector<SpriteFrame*>frameVector;/* 1.----------------加载跑动的Animation-----------------*/for(int i = 0; i <= 7; i ++) {//从缓存池中加载精灵到Vectorframe = 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);//不应该是 等于 0if(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到这里,我们主角的动作都准备好了,下面就开始添加 按钮,来控制主角执行这些动作啦!!
个人愚昧观点,欢迎指正与讨论(好像也没人会和我讨论,,哎)
8 1
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》第四步--地图循环&主角添加动作
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第三步---主角开跑&同时带着刚体
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第五步--按钮控制主角Jump&Crouch
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》第七步--物理碰撞检测(2)--主角吃金币
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第六步--金币&岩石添加并且管理
- cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第二步---编辑器(1)--触摸添加点
- cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第四步---编辑器(3)--坐标保存&加载文件操作
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》第七步--物理碰撞检测(1)
- cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第六步---炮台&点击炮台添加英雄&英雄升级
- cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第五步---着手打造游戏界面
- cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第九步---英雄发动攻击
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》 前言
- cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第0步---知识点总结&效果预览&设计思路
- cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第三步---编辑器(2)---更方便更多操作更像编辑器
- cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第七步---英雄要升级&属性--解析csv配置文件
- cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第十步---发射子弹&怪物受伤---所有源码和资源完结下载
- 【Cocos2d-x 3.0学习笔记】动作,动画
- 【Cocos2d-x 3.0学习笔记】动作,动画
- Spring 零碎整理 以后自己用的到
- MySQL查询优化-explain
- vdsm(1)安装
- PAT 1004. Counting Leaves (30)
- 学习笔记 Java_毕向东_语言基础_程序流程控制 2014.7.29
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》第四步--地图循环&主角添加动作
- 减税:牛市的真正号角与中国经济逃生之门
- POJ 1258-Agri-Net(最小生成树prim)
- word list 16 to 18
- 判断当前页面是否为post页面
- 状况进行和高科技啊说得好高科技啊萨丹哈果壳就阿红
- 浅谈枚举
- 状况进行和高科技啊说得好高科技啊萨丹哈果壳就阿红
- 状况进行和高科技啊说得好高科技啊萨丹哈果壳就阿红