发现还没谈到最基本也是最重要的问题,怎么画图,画动画?

在原版cocos2d-x里画动画比较麻烦,见cocos2d-x学习笔记04:简单动画

cocostudio扩展出CCArmature类,就比较简单了

cocos2d::extension::CCArmature *armature = nullptr;
armature = cocos2d::extension::CCArmature::create("name");
armature->getAnimation()->playByIndex();

从游戏逻辑的角度来看的话,比如考察一个RPG游戏的主角,通常他有站立,行走,攻击,受伤,倒地,死亡等动作,有中毒,加攻,加防等状态。一个动画会对应一个动作或状态,但是反过来不一定,一个动作可能包含不止一个动画。比如行走,在横版游戏中有两个方向,两个方向可以用一个翻转的动画来实现,还是一个动画;在ARPG游戏中可能有4个甚至8个方向,这时候行走动作不能用一个动画实现了,可能包含4或8个动画。

因此这里可以把动作/状态抽象出来成为一个类,统称为动作Motion。一个Motion可能是一个静态图形,一个动画或几个动画。Motion和Action的区别在于,Action改变对象属性,客户端/服务器通用,Motion不改变对象属性,仅用于客户端表现。举例来讲,移动,就是一个Action(坐标改变)和一个Motion(行走动画)的组合。

在接口篇里,没有提到Motion的概念。在概念上对象+行为就足以描述游戏逻辑,应该没有必要再增加新的实体,因此希望对Action的操作能导致Motion自动改变。考虑到,如果把“当前动作”作为对象的一个属性的话,可以认为所有Motion(动作+状态)都是随对象属性的改变而改变的,因此对Motion的操作可以通过以下方式进行:Action改变对象属性,属性改变导致动作/状态改变。

一个对象,其所拥有的动作是有限的,可以在配置文件里配置,在对象加载的时候把所有动作一起加载进来。

typedef struct
{
enum E
{
NONE,
STAND, // 站立
MOVE, // 移动 COUNT
};
}Motions; class Motion
{
public:
virtual ~Motion() {} public:
virtual void InitMotion() = ;
virtual void RunWithObject(ObjectView* pObj) = ;
virtual void StopMotion() = ;
}; class ObjectView : public Object
{
public:
ObjectView();
virtual ~ObjectView(); public:
virtual bool LoadObject(const char* fileName);
virtual void OnPropertyChanged(uint32 propertyID, Property& oldValue); virtual Motion* CreateMotion(uint32 motionID); // 工厂方法 protected:
std::map<uint32, Motion*> _motions;
};
void ObjectView::OnPropertyChanged(uint32 propertyID, Property& oldValue)
{
if (Properties::MOTION == propertyID) // 动作改变
{
// 停止旧动作
uint32 oldMotion = oldValue;
if (_motions.find(oldMotion) != _motions.end())
_motions[oldMotion]->StopMotion(); // 播放新动作
uint32 motionID = GetProperty(Properties::MOTION);
if (_motions.find(motionID) != _motions.end())
_motions[motionID]->RunWithObject(this);
}
}

静态图Motion:

class MotionImage : public Motion
{
public:
virtual void InitMotion();
virtual void RunWithObject(ObjectView* pObj);
virtual void StopMotion(); private:
Image _image; // 等于CCSprite
};
void MotionImage::InitMotion()
{
CCTexture2D* pTex = CCTextureCache::sharedTextureCache()->textureForKey(_image._texKey.c_str());
if (pTex)
{
_image._sprite->setTexture(pTex);
_image._sprite->setTextureRect(_image._sprite->getTextureRect());
}
} void MotionImage::RunWithObject(ObjectView* pObj)
{
ObjectCocos2dx::Cast(pObj->GetEngineData())->m_pNode->addChild(_image._sprite);
} void MotionImage::StopMotion()
{
_image._sprite->removeFromParent();
}

有两个方向的动画Motion:

class MotionAnim2 : public Motion
{
public:
MotionAnim2() : _pAnimation(nullptr), _direction(Directions::NONE) {}
virtual ~MotionAnim2(); public:
virtual void InitMotion();
virtual void RunWithObject(ObjectView* pObj);
virtual void StopMotion(); private:
Animate* _pAnimation; // 等于CCArmature
int _direction;
};
void MotionAnim2::InitMotion()
{
cocos2d::extension::CCArmature *armature = nullptr;
armature = cocos2d::extension::CCArmature::create(_pAnimation->_animName.c_str());
_pAnimation->_armature = armature;
} void MotionAnim2::RunWithObject(ObjectView* pObj)
{
int direction = pObj->GetProperty(Properties::DIRECTION); if (_direction != direction)
{
// 镜像动画
float sx = -_pAnimation->_armature->getScaleX();
float sy = _pAnimation->_armature->getScaleY();
_pAnimation->_armature->runAction(CCScaleTo::create(0.0f, sx, sy)); _direction = direction;
} _pAnimation->_armature->getAnimation()->playByIndex();
// 加入对象的CCNode结点
ObjectCocos2dx::Cast(pObj->GetEngineData())->m_pNode->addChild(_pAnimation->_armature);
} void MotionAnim2::StopMotion()
{
_pAnimation->_armature->stopAllActions();
_pAnimation->_armature->removeFromParentAndCleanup(false);
}

一个简单的游戏开发框架(七.动作Motion)的更多相关文章

  1. 一个简单的游戏开发框架(四.舞台Stage)

    首先是StageManager类: class StageManager : public Singleton<StageManager> { friend class Singleton ...

  2. 一个简单的游戏开发框架(六.行为Action)

    Action是cocos2d-x中比较重要的概念,有一个庞大的类族.参见老G写的cocos2d-x学习笔记09:动作2:持续动作 除了各种包装器,剩下的主要是一些持续动作: CCMoveTo:移动到. ...

  3. 一个简单的游戏开发框架(五.对象Object)

    前面提到我们把行为Action从对象Object中分离了出来,用各种不同的行为组合出对象的功能.大家都知道,面向对象的一个类,就是数据和操作的集合.操作(行为)被分离出来了,数据怎么办呢?操作依赖的数 ...

  4. Cocos2d-x-Lua 开发一个简单的游戏(记数字步进白色块状)

    Cocos2d-x-Lua 开发一个简单的游戏(记数字步进白色块状) 本篇博客来给大家介绍怎样使用Lua这门语言来开发一个简单的小游戏-记数字踩白块. 游戏的流程是这种:在界面上生成5个数1~5字并显 ...

  5. 5、使用Libgdx设计一个简单的游戏------雨滴

    (原文:http://www.libgdx.cn/topic/49/5-%E4%BD%BF%E7%94%A8libgdx%E8%AE%BE%E8%AE%A1%E4%B8%80%E4%B8%AA%E7% ...

  6. Prism for WPF 搭建一个简单的模块化开发框架 (一个节点)

    原文:Prism for WPF 搭建一个简单的模块化开发框架 (一个节点) 这里我就只贴图不贴代码了,看看这个节点之前的效果 觉得做的好的地方可以范之前的文章看看 有好的建议也可以说说   填充数据 ...

  7. Prism for WPF 搭建一个简单的模块化开发框架(六)隐藏菜单、导航

    原文:Prism for WPF 搭建一个简单的模块化开发框架(六)隐藏菜单.导航 这个实际上是在聊天之前做的,一起写了,也不分先后了 看一下效果图,上面是模块主导航,左侧是模块内菜单,现在加一下隐藏 ...

  8. Prism for WPF 搭建一个简单的模块化开发框架(四)异步调用WCF服务、WCF消息头添加安全验证Token

    原文:Prism for WPF 搭建一个简单的模块化开发框架(四)异步调用WCF服务.WCF消息头添加安全验证Token 为什么选择wcf?   因为好像wcf和wpf就是哥俩,,, 为什么选择异步 ...

  9. Prism for WPF 搭建一个简单的模块化开发框架(五)添加聊天、消息模块

    原文:Prism for WPF 搭建一个简单的模块化开发框架(五)添加聊天.消息模块 中秋节假期没事继续搞了搞 做了各聊天的模块,需要继续优化 第一步画页面 页面参考https://github.c ...

随机推荐

  1. javaScript 验证表单提交

    <script type="text/javascript">      function $(id) {          return document.getEl ...

  2. Codeforces Round #389 (Div. 2, Rated, Based on Technocup 2017 - Elimination Round 3) D. Santa Claus and a Palindrome STL

    D. Santa Claus and a Palindrome time limit per test 2 seconds memory limit per test 256 megabytes in ...

  3. RANSAC 剔除错误匹配 估计模型

    随机抽样一致,这个算法,我以前一直都没有理解透彻.只知道可以用来直线拟合,网上大多数中文博客也都是写直线拟合的,但是用来匹配二维特征的时候,总还是没弄明白. 基本概念参考 http://www.cnb ...

  4. Surface与SurfaceView、SurfaceHolder

    什么是Surface? android API的解释是:Handle onto a raw buffer that is being managed by the screen compositor ...

  5. OpenCV 计算区域的内部参数

    对于一个区域,怎么进一步针对区域内部特征进行处理呢 ? 首先,我们要提取出来内部的某些特征才能说话,下面提取一些简单的特征,话不多说见代码: 1.平均数及方差参数: Mat tempMean, tem ...

  6. OpenCV计算点到直线的距离 数学法

    我们在检测图像的边缘图时,有时需要检测出直线目标,hough变换检测出直线后怎么能更进一步的缩小区域呢?其中,可以根据距离来再做一判断,就涉及到了点与直线的距离问题. 点到直线距离代码如下: //== ...

  7. centos7 升级内核到最新版本

    centos7 从问世以来,官网提供的镜像始终是3.10 版本,该版本最大的一个问题是对硬件驱动(尤其是无线网卡)的支持不是很好,本人亲测>5种机型,无线网卡均无法正常使用,如果是非主流机型,手 ...

  8. Hprose question

    1 在服务端 接口的开发中 如果定义了index()方法 中间不能够有参数,否则报错. 2 接口方法中的参数 最好使用单参数 如fun($uid ) 或者 如果需要多个参数 fun($param){$ ...

  9. div跟随页面滚动

    $(document).ready(function(){ var timer; $(window).scroll(function (){ clearInterval(timer); var top ...

  10. SQL SERVER 2005 DBCC PAGE命令说明

    夏日福利: 小泽玛利亚的“专业摄影”性感写真集:http://947kan.com/video/player-52475-0-0.html ------------------------------ ...