cocos2d-x游戏开发系列教程-超级玛丽07-CMGameMap(六)-马里奥跳跃
当w键按下时,马里奥执行跳跃动作
执行跳跃动作也是在MarioMove函数中调用的
aaarticlea/png;base64,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" alt="" />
实际的跳跃则调用了mario对象的OnCtrlJump函数,来看看OnCtrlJump函数吧
void CMMario::OnCtrlJump()
{
//根据马里奥当前状态 来处理
switch(m_eCurMarioStatus)
{
case enMarioStatusStandLeft: //待机 和 跑动 时 马里奥允许跳跃
case enMarioStatusStandRight:
case enMarioStatusRunLeft:
case enMarioStatusRunRight:
{
//播放跳跃动画
switch(m_eCurMarioLevel)
{
case enMarioLevelSmall:
{
m_pCcbReader->getAnimationManager()->runAnimationsForSequenceNamed(_CCB_MARIO_SMALL_JUMP_);
}break;
case enMarioLevelBig:
{
m_pCcbReader->getAnimationManager()->runAnimationsForSequenceNamed(_CCB_MARIO_BIG_JUMP_);
}break;
case enMarioLevelMax:
{
m_pCcbReader->getAnimationManager()->runAnimationsForSequenceNamed(_CCB_MARIO_MAX_JUMP_);
}break;
} if(getActionByTag(enTagOfActionJump)==NULL)
{
//强制瞬间离地
setPositionY(getPositionY()+10.f);
//增加跳跃运动
CCJumpTo *pJump = CCJumpTo::create(_MARIO_BASIC_JUMP_TIME_,ccp(getPositionX(),getPositionY()-10.f),_MARIO_BASIC_JUMP_HEIGHT_,1);
if(pJump==NULL)
{
CCAssert(false,"Can't Create Jump!");
return;
}
//为Jump设置独立的Tag
pJump->setTag(enTagOfActionJump);
runAction(pJump); m_fMarioJumpMaxHeight = -100.f;
}
//将Mario状态设置为悬空
SetMarioStatus(m_bFaceToRight?enMarioStatusOnAirRight:enMarioStatusOnAirLeft); }break;
}
}
在代码中可以看到,如果马里奥已经在空中,就不能再跳跃了,只有在马里奥站立和行走时候可以跳跃。
当可以跳跃时,首先让马里奥对象播放跳跃动画,这个动画指马里奥本身的变化,比如马里奥的胳膊和腿,并不是马里奥跳跃的动作
跳跃的动作是pJump这个Action。
在runAction之前,先判断了这个action是否存在,如果这个action存在,则不需要再执行action了,这个也有避免连续两次跳跃的意思
和之前的状态判断差不多,去掉这个判断也是可以的,但是这样判断鲁棒性更好些吧。
最后根据马里奥的方向,设置马里奥的状态。
这里涉及新的知识点了,一个是执行动作runAction,一个是马里奥对象,我们分两个文章来介绍这两个知识。
cocos2d-x游戏开发系列教程-超级玛丽07-CMGameMap(六)-马里奥跳跃的更多相关文章
- cocos2d-x游戏开发系列教程-超级玛丽10-怪物与马里奥冲突检测
在超级玛丽游戏中,马里奥在移动,怪物也在移动,当他们遇见时,需要判断是马里奥身亡还是怪物身亡. 这个判断的代码在怪物类的检测函数实现中. 比如蘑菇怪的冲突检测函数: bool CMMonsterMus ...
- cocos2d-x游戏开发系列教程-超级玛丽07-CMGameMap(三)-按键处理
在地图初始化好了之后,就开始移动马里奥吧,我在windows下,是使用键盘来移动马里奥的 w是跳,d是前进,a是后退,那么在程序里是怎么来获取这个按键的呢? 普通的windows程序,在按键之后,会有 ...
- cocos2d-x游戏开发系列教程-超级玛丽01-前言
前言 上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实现,并以一些篇幅来详细讲述遇到的具体问题和具体的 ...
- cocos2d-x游戏开发系列教程-超级玛丽07-CMGameMap
背景 在上一篇博客中,我们提到CMGameScene,但是CMGameScene只是个框架,实际担任游戏逻辑的是CMGameMap类,这个博文就来了解下CMGameMap 头文件 class CMGa ...
- cocos2d-x游戏开发系列教程-超级玛丽06-CMGameScene
背景 在CMMenuScene中,当用户点击开始游戏时,导演让场景进入到CMGameScene 头文件 class CMGameScene : public cocos2d::CCLayer,publ ...
- cocos2d-x游戏开发系列教程-超级玛丽08-消息机制
在超级玛丽游戏里,地图类CMGameMap负责所有的程序逻辑,它包含了背景地图,包含了游戏元素精灵,当游戏中的精灵之间发生碰撞时,比如马里奥撞上砖头这种事情发生时,马里奥对象本身不知道怎么处理这个逻辑 ...
- cocos2d-x游戏开发系列教程-超级玛丽05-CMMenuScene
代码下载链接 http://download.csdn.net/detail/yincheng01/6864893 解压密码:c.itcast.cn 背景 上一篇博文提到appDelegate,在该类 ...
- cocos2d-x游戏开发系列教程-超级玛丽09-怪物激活与移动
在游戏中,很多怪物本身是会移动的,这里主要有蘑菇怪,乌龟等. 说起怪物的移动,首先在游戏里先要考虑怪物的抽象和设计. 在CMMonster.h中,有个类CMMonsterBasic,这个类抽象了所有的 ...
- cocos2d-x游戏开发系列教程-超级玛丽07-CMGameMap(五)-地图卷动
马里奥在平移的过程中,涉及到地图的卷动问题. 在这个游戏里,地图比窗口大,窗口只是显示了地图的一部分,因此马里奥在移动的时候,移动到一定位置之后要卷动地图,否则马里奥移动到窗口右边之后......那结 ...
- cocos2d-x游戏开发系列教程-超级玛丽04-AppDelegate
代码下载链接 http://download.csdn.net/detail/yincheng01/6864893 解压密码:c.itcast.cn 背景 上一篇博文提到在CCApplication: ...
随机推荐
- C/C++指针的指针(**p)和指针的引用(*&)使用案例分析
#include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <stdlib.h> ...
- Oracle中NVARCHAR2与VARCHAR2的差别
NVARCHAR2在计算长度时和字符集相关的: 比如数据库是中文字符集时以长度10为例, 1.NVARCHAR2(10)是能够存进去10个汉字的.假设用来存英文也仅仅能存10个字符. 2.而VARCH ...
- ListView中响应item的点击事件并且刷新界面
---恢复内容开始--- 最近在在实现listview功能中遇到了这个问题: 点击事件写在了adapter的item中,不知道如何在listview的点击事件中更新数据的显示: 总结:1.要使用not ...
- 零行代码为App添加异常加载占位图
前文提要 近期准备重构项目,需要重写一些通用模块,正巧需要设置App异常加载占位图的问题,心血来潮设想是否可以零行代码解决此问题,特在此分享实现思路. 思路分享 对于App占位图,通常需要考虑的控件有 ...
- untiy 播放视频
利用 MovieTexture 类 放入视频 视频不能使flv的 建立一个平面 作为屏幕,利用Material 播放动画,剩下的就是将平面放大和屏幕一样/ public MovieTexture My ...
- Java如何实现对Mysql数据库的行锁
场景如下: 用户账户有余额,当发生交易时,需要实时更新余额.这里如果发生并发问题,那么会造成用户余额和实际交易的不一致,这对公司和客户来说都是很危险的. 那么如何避免: 网上查了下,有 ...
- BZOJ 1016: [JSOI2008]最小生成树计数( kruskal + dfs )
不同最小生成树中权值相同的边数量是一定的, 而且他们对连通性的贡献是一样的.对权值相同的边放在一起(至多10), 暴搜他们有多少种方案, 然后乘法原理. ----------------------- ...
- Linux 中 java 访问 windows共享目录
有两个方案: 1.将windows共享目录,挂载到linux系统下,通过使用本地目录访问windows共享目录 2.通过samba的java实现包,不过需要开个windows共享目录的账户 http ...
- java 实现 一个账号只能在一个地方登陆,其他地方被下线
其实方法有很多的,我这献丑了. 使用理解java 四大作用域. 思路:理解java 四大作用域的关键. 第一个地方登陆: 1.得到请求的SessionId 和 登陆的 用户名 2.把SessionId ...
- 微信上传素材返回 '{"errcode":41005,"errmsg":"media data missing"}',php5.6返回
问题描述: php5.5已经把通过@加文件路径上传文件的方式给放入到Deprecated中了.php5.6默认是不支持这种方式了 解决办法curl处理 function curl_post($url, ...