仿《雷霆战机》飞行射击手游开发--GameObject
转载请注明:http://www.cnblogs.com/thorqq/p/5646509.html
项目首页:https://www.oschina.net/p/raiden
在上一篇中,我们介绍了各种游戏对象的功能及类的集成关系,现在我们来看看GameObject的源代码
碰撞体
GameObject.h
class GameObject : public Sprite
{
public:
GameObject(); virtual void setBodySize(const Size& s);
virtual void setBodySize(float w, float h);
virtual const Size& getBodySize();
virtual const Size& getOrignBodySize() const; virtual void setBodyCenter(const Vec2& v);
virtual void setBodyCenter(float x, float y);
virtual const Vec2& getBodyCenter() const; //获取世界坐标下的body的位置和大小
virtual Rect getBodyBox() const; protected:
//用于碰撞检测的刚体大小和位置
Vec2 m_bodyCenter; //刚体的中心点坐标(相对于精灵锚点的坐标)
Size m_bodySize; //刚体的宽高
};
GameObject.cpp
void GameObject::setBodySize(const Size& s)
{
m_bodySize = s;
} void GameObject::setBodySize(float w, float h)
{
setBodySize(Size(w, h));
} const Size& GameObject::getBodySize()
{
return m_bodySize;
} void GameObject::setBodyCenter(const Vec2& v)
{
m_bodyCenter = v;
} void GameObject::setBodyCenter(float x, float y)
{
m_bodyCenter = Vec2(x, y);
} const Vec2& GameObject::getBodyCenter() const
{
return m_bodyCenter;
} //获取世界坐标下的body的位置和大小
Rect GameObject::getBodyBox() const
{
Vec2 pos = getPosition(); return Rect(pos.x + m_bodyCenter.x - m_bodySize.width * getAnchorPoint().x,
pos.y + m_bodyCenter.y - m_bodySize.height * getAnchorPoint().y,
m_bodySize.width,
m_bodySize.height);
}
碰撞体的定义很简单,中心坐标+宽高,然后加上常见的get/set方法。其中比较有用的是getBodyBox()方法。由于碰撞体的中心坐标是相对于Sprite锚点的坐标,所以如果要用来判断两个碰撞体是否发生碰撞(是否有重叠区域),必须要获取两个碰撞体在世界坐标下的位置和大小,这时就要调用getBodyBox()方法来得到Rect对象,然后再调用Rect的bool intersectsRect(const Rect& rect)方法来判断两个碰撞体是否发生了碰撞。
暂停/恢复
GameObject.h
virtual void pause() override;
virtual void resume() override;
void pause(Node *pNode);
void resume(Node *pNode);
GameObject.cpp
void GameObject::pause()
{
this->pause(this);
} void GameObject::resume()
{
this->resume(this);
} void GameObject::pause(Node *pNode)
{
Node::pause(); for (auto p : pNode->getChildren())
{
p->pause();
}
} void GameObject::resume(Node *pNode)
{
Node::resume(); for (auto p : pNode->getChildren())
{
p->resume();
}
}
调用pause和resume的同时,会调用所有子节点的pause和resume。这样,当玩家飞机暂停时,僚机作为它的子节点,也会跟着暂停。
初始化
先看代码
bool GameObject::initSpriteWithFileList(const std::vector<std::string>& fileList, float dura)
{
SpriteFrame *frame = SpriteFrameCache::getInstance()->getSpriteFrameByName(fileList.at());
if (NULL == frame)
{
DEBUG_LOG("Error get frame of '%s'", fileList.at().c_str());
CCASSERT(frame, "Error get frame");
}
Sprite::initWithSpriteFrame(frame); //动画
if (fileList.size() > )
{
Animation* animation = Animation::create();
animation->setDelayPerUnit(dura);
for (unsigned i = ; i < fileList.size(); i++)
{
SpriteFrame* pFrame = CCSpriteFrameCache::getInstance()->getSpriteFrameByName(fileList[i]);
if (NULL == pFrame)
{
continue;
}
animation->addSpriteFrame(pFrame);
} //设置重复
Animate* animate = Animate::create(animation);
Repeat* repeat = Repeat::create(animate, CC_REPEAT_FOREVER);
m_pAnimateSequence = Sequence::create(repeat, NULL);
m_pAnimateSequence->retain();
runAction(m_pAnimateSequence);
} return true;
}
这个函数是通过帧序列来初始化。这里有两个输入参数:fileList是图片列表,dura是每张图片之间个时间间隔。如何是骨骼动画呢?看下面这个代码:
bool GameObject::initArmature(const std::string& armatureName, float scale)
{
if (armatureName.length() <= )
{
return true;
} m_pArmature = cocostudio::Armature::create(armatureName);
m_pArmature->setPosition(getContentSize() / );
m_pArmature->getAnimation()->play(GlobalData::getInstance()->getArmatureData(armatureName)->defaultAction);
m_pArmature->setScale(scale); addChild(m_pArmature); return true;
}
首先通过骨骼动画的名称armatureName创建骨骼动画,然后执行默认动作defaultAction(defaultAction是从配置文件中获取的,配置文件的读写将在以后详述)。最后把骨骼动画添加到Sprite上。
这里就有一个疑问了,为什么既要支持帧序列动画,又要支持骨骼动画呢?我们知道骨骼动画的表现形式比帧序列动画更丰富,但是随之而来的问题就是骨骼动画更占资源。如果只有一个简单的动画,或者像子弹那样速度比较快并且数量比较多的游戏对象,应该尽量使用帧序列动画,甚至对于子弹来说,只用单张图片来表现就可以了,根本用不着动画。而对于玩家飞机、boss来说,因为涉及到变形,那就不得不用骨骼动画了。
另外,这里也有一个可以优化的地方。我们可以把GameObject继承自Node,当游戏对象是序列帧动画时,就添加一个Sprite子节点,如果是骨骼动画,就添加一个Armature子节点。
转载请注明:http://www.cnblogs.com/thorqq/p/5646509.html
下一篇开始,我们将逐个介绍GameObject的子类
仿《雷霆战机》飞行射击手游开发--GameObject的更多相关文章
- 《疯狂iOS讲义(下)——iPhone/iPad高级应用与手游开发(含CD光盘1张)》
<疯狂iOS讲义(下)——iPhone/iPad高级应用与手游开发(含CD光盘1张)> 基本信息 作者: 李刚 肖文吉 出版社:电子工业出版社 ISBN:9787121224379 ...
- Cocos2d-x 3.X手游开发实例详解
Cocos2d-x 3.X手游开发实例详解(最新最简Cocos2d-x手机游戏开发学习方法,以热门游戏2048.卡牌为例,完整再现手游的开发过程,实例丰富,代码完备,Cocos2d-x作者之一林顺和泰 ...
- 一 手游开发工具cocos2d-x editor初识
可学习的demo: 7个实战项目 flappybird(飞扬小鸟).popstar(消灭星星).fruitninja(水果忍者).2048(数度消除). moonwarriors(月亮战神).frui ...
- XPlane android 2D手游开发实战
android 飞行射击游戏类 采用 xamarin 跨平台开发技术 纯C#语言编写 操作简单 1.手指拖动飞机 躲避敌机 2.通过吃敌机爆炸后遗落的物品增加各种属性 3.双击战机放大技能 4.目前 ...
- Unity3D手游开发实践
<腾讯桌球:客户端总结> 本次分享总结,起源于腾讯桌球项目,但是不仅仅限于项目本身.虽然基于Unity3D,很多东西同样适用于Cocos.本文从以下10大点进行阐述: 架构设计 原生插件/ ...
- .net程序员转行做手游开发经历(一)
从辞职到自己开发游戏也有几个月的时间了,游戏也已经在AppStore上线了,我觉得我有必要写点东西,算是留下的一些记忆,也可以和广大博友分享下自己的创业经历,这可能不是一篇成功的创业经历,因为故事还在 ...
- (转)Unity3D研究院之手游开发中所有特殊的文件夹(assetbundle与Application.persistentDataPath)
这里列举出手游开发中用到了所有特殊文件夹. 1.Editor Editor文件夹可以在根目录下,也可以在子目录里,只要名子叫Editor就可以.比如目录:/xxx/xxx/Editor 和 /Edi ...
- (转)Unity3D手游开发实践
作者:吴秦出处:http://www.cnblogs.com/skynet/本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名吴秦(包含链接). (转)& ...
- Unity3D研究院之手游开发中所有特殊的文件夹(转)
这里列举出手游开发中用到了所有特殊文件夹. 1.Editor Editor文件夹可以在根目录下,也可以在子目录里,只要名子叫Editor就可以.比如目录:/xxx/xxx/Editor 和 /Edi ...
随机推荐
- 一个简单的小例子让你明白c#中的委托-终于懂了!
模拟主持人发布一个问题,由多个嘉宾来回答这个问题. 分析:从需求中抽出Host (主持人) 类和Guests (嘉宾) 类. 作为问题的发布者,Host不知道问题如何解答.因此它只能发布这个事件,将事 ...
- 关于打包android自己编写的第三方library提供jar
最近公司要求把应用的接口写成sdk提供给别人使用,写好了之后,发现导出来jar包怎么使用也有误,在运行时会报java.lang.NoClassDefFoundError的错,于是纠结了很久,突然在博客 ...
- delphi SpeedButtonDown
的属性 的事件 的方法 设置SpeedButton的Down的属性 AllowAllUp属性 当有多个SpeedButton时 让有2个按钮都能处于按下状态 设置它的GroupIndex ...
- IOS 小技巧积累
转自:http://blog.csdn.net/mars2639/article/details/7352012 1. 使用@property和@synthesize声明一个成员变量,给其赋值是时要在 ...
- java中文件操作
例一:从一个文件读入数据,然后写入另外一个文件 package lipika; import java.io.FileInputStream; import java.io.FileNotFoundE ...
- 深入理解C语言中的指针与数组之指针篇(转载)
前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情 ...
- css笔记08:id选择器之父子选择器
1.父子选择器 (1)01.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...
- 沈逸老师ubuntu速学笔记(2)-- ubuntu16.04下 apache2.4和php7结合编译安装,并安裝PDOmysql扩展
1.编译安装apache2.4.20 第一步: ./configure --prefix=/usr/local/httpd --enable-so 第二步: make 第三步: sudo make i ...
- 奥运会订票系统c语言代写源码下载
制作能够实现2008北京奥运会网上订票的系统,能够实现购票人员注册.购票.管理人员可以设置各个比赛场地的赛事安排及票数. 程序要求实现的功能如下: 购票者信息注册:购票者可以用昵称和身份证进行注册,若 ...
- 怎么删除远程登录连接的ip
通过远程桌面可以登录到远程电脑上进行相应的操作,在登录过后会在本地电脑上留下登录过的IP以及登录用户名相关信息,可能会给远程的电脑带来安全隐患,下面介绍一下清除远程桌面历史记录的方法. 1.删除我的文 ...