`
webcenterol
  • 浏览: 967932 次
文章分类
社区版块
存档分类
最新评论

【转】【翻译】Orx官方教程:07.特效(FX)

 
阅读更多

本文译自 orx tutorials FX胡四娃 译最新版本见Orx 官方Wiki中文教程 。转载自:胡四娃的博客 。原文链接在http://www.cppblog.com/Husiwa/archive/2010/07/07/119534.aspx


综述

这篇教程介绍了什么是特效以及 如何创建它们

特效是将曲线及其组合而成的一组数据(正弦线、三角型边、矩形或者线性),应用在不同类型的参数 中。如: 缩放 、旋转、位置、速度、颜色等。

特效在配置文件中设置,仅仅只 需要一行代码就可以在对象上使用这些特效。

可以有最多8条任意类型的曲线组合在一起形成一个特效。

在同一时间,可以有最多4个特 效应用于同一个对象上面。

特效可以使用绝对值或者相对值,这取决于配置文件中Absolute标签。

控制曲线的周期、相位、和振幅 都是允许的。

对于位置和速度特效来说,输出值可以使用对象的方向 和/或 缩放值,以相对方式应用于对象目前的状态。

这也就允许我们创造极其拉风的视觉特效。

除非特效已经缓存在内存中,否 则特效参数全部在配置文件中进行调整,并且使用退格键来即时重载。 (cf.通过 ''KeepInCache'' 属性来实现内存的缓存).

比如说:你不能调整正在运行的 循环特效,因为他已经在默认的配置文件中定义好了。在这个测试程序运行的时候,所有其它的特效能够被更新。

通常说来,随机值的使用可以给 特效带来更多的变化。

比如, 晃动方式的缩放(the wobble scale), 带颜色的闪光(the flash color) 和 攻击式的移动(the "attack" move) 等特效就使用了少量的随机值。

就像显示事件一样,我们也可以 注册特效的开始播放和停止的事件。

因为循环时间是永远不会停下来的,所以对应的停止事件 (''orxFX_EVENT_STOP'')永远不会发生.

们也会简单的介绍一下如何一些个性数据(仅仅包 含一个布尔值的结构)添加到orxOBJECT中。((九天注:这里作者有点穿越了,需要看下面的例子才能懂,作者定义了一个仅包含一个Bool值的结构 MyObject))

在事件的回调函数中,我们通过它,在特效开始的时候为对象加锁,在结束的时候解锁。

我们使用锁是为了让 soldier(士兵)在同一时刻只有一个特效在发挥作用。

把这些东西写在这里,仅仅具有教育意义。 ((九天注:本来一个对象可以同时有4个特效发 生,这里作者仅仅是告诉你怎么使用“个性数据”才这样做的,所以说仅仅具有教育意义。))



详细内容

通常,我们先载入配置文件,创 建一个时钟,然后注册更新函数,最后,创建我们的soldier和盒对象。请在之前的教程中获取更多信息。

注册 输入和特效事件


orxEvent_AddHandler(orxEVENT_TYPE_FX, EventHandler);

orxEvent_AddHandler(orxEVENT_TYPE_INPUT, EventHandler);

大家可以看到,在这两个事件中,我们使用了同一个回调函数 (EventHandler).

现在我们迅速的扫一眼自己的“对象”数据结构。


typedef struct MyObject
{
orxBOOL bLock;

} MyObject;

接下来,看看如何用 orxObject_SetUserData()将它绑定到soldier上


MyObject *pstMyObject;

pstMyObject = orxMemory_Allocate(sizeof (MyObject), orxMEMORY_TYPE_MAIN);
pstMyObject->bLock = orxFALSE;


orxObject_SetUserData(pstSoldier, pstMyObject);

现在看看如何在Update函数中使用特效


orxSTRING zSelectedFX;

if (orxInput_IsActive("SelectWobble" ))
{
zSelectedFX = "WobbleFX" ;
}
else if (orxInput_IsActive("SelectCircle" ))
{
zSelectedFX = "CircleFX" ;
}

[...]

// Soldier not locked?
if (!((MyObject *)orxObject_GetUserData(pstSoldier))->bLock)
{
if (orxInput_IsActive("ApplyFX" ) && orxInput_HasNewStatus("ApplyFX" ))
{
orxObject_AddFX(pstSoldier, zSelectedFX);
}

}

可以看到,我们通过orxObject_GetUserData()这个函数得到了 我们想要的数据,向solder里添加特效的方法跟添加声音的方法如出一辙,用的都是这个函数orxObject_AddFX()。

接下来,看看EventHandler这个函数

首先是输入方面,这里只展示了每次输入时哪个按 键被使用了。


if (_pstEvent->eType == orxEVENT_TYPE_INPUT)
{
if (_pstEvent->eID == orxINPUT_EVENT_ON)
{
orxINPUT_EVENT_PAYLOAD *pstPayload;

pstPayload = (orxINPUT_EVENT_PAYLOAD *)_pstEvent->pstPayload;

if (pstPayload->aeType[1 ] != orxINPUT_TYPE_NONE)
{
orxLOG("[ %s ] triggered by ' %s ' + ' %s '." , pstPayload->zInputName, orxInput_GetBindingName(pstPayload->aeType[0 ], pstPayload->aeID[0 ]), orxInput_GetBindingName(pstPayload->aeType[1 ], pstPayload->aeID[1 ]));
}
else
{
orxLOG("[ %s ] triggered by ' %s '." , pstPayload->zInputName, orxInput_GetBindingName(pstPayload->aeType[0 ], pstPayload->aeID[0 ]));
}
}

}

正如你所见,我们通过按下的是一个单键还是一个组合键来判断展示不同的信息。

我们仅使用了两个首次输入点,因为我们知道,我 们的配置文件中没有超过两个的组合键。尽管orx支持最多四个组合键来做为一个单键。

orxInput_GetBindingName() 函数给了我们一个输入的文字显示。

注意:这些名称在配置文件中也绑定到了对应的按键上面。

现在来看下如何处理这个事件



if (_pstEvent->eType == orxEVENT_TYPE_FX)
{
orxFX_EVENT_PAYLOAD *pstPayload;
orxOBJECT *pstObject;

pstPayload = _pstEvent->pstPayload;
pstObject= orxOBJECT(_pstEvent->hRecipient);

switch (_pstEvent->eID)
{
case orxFX_EVENT_START:
orxLOG("FX < %s >@< %s > has started!" , pstPayload->zFXName, orxObject_GetName(pstObject));

if (pstObject == pstSoldier)
{
// Locks it
((MyObject *)orxObject_GetUserData(pstObject))->bLock = orxTRUE;
}
break ;

case orxSOUND_EVENT_STOP:
orxLOG("FX < %s >@< %s > has stoped!" , pstPayload->zFXName, orxObject_GetName(pstObject));

if (pstObject == pstSoldier)
{
// Unlocks it
((MyObject *)orxObject_GetUserData(pstObject))->bLock = orxFALSE;
}
break ;
}
}

在soldier上的动画开始 的时候,我们用自己的数据结构来锁定它,相应的,停止的时候解锁。

看完了代码部分,我们再去看看配置文件。

首先看个简单的特效 :盒子上旋转的特效。


[RotateLoopFX]
SlotList= Rotate
Loop= true

[Rotate]
Type= rotation
StartTime = 0.0
EndTime = 2.0
Curve = sine
Pow = 2.0
StartValue= 0
EndValue= 360

[Box]

FXList = RotateLoopFX

看到了吧,特效是在它创建之初 直接应用在盒对象上面的,而不是在代码中。

RotateLoopFX包含仅包含一个时间段(Rotate)并且一直循环 (attribute Loop)

然后定义Rotates时间段。时间的单位都是秒,角度的单位都是度。

定义这个旋转动画的时候,我们使用了一个正弦曲 线,让他每两秒旋转360度。

下面看下我们的摇摆特效。


[WobbleFX]
SlotList = Wobble

[Wobble]
Type= scale
StartTime = 0.0
EndTime = 1.0
Period= 0.2
Curve = sine
Amplification = 0.0
StartValue= (1.0, 1.0, 1.0)

EndValue= (2.0, 2.0, 1.0) ~ (6.0, 6.0, 1.0)

我们修改了scale属性,并赋予它一个 ''StartValue''(开始值)和''EndValue''(结束值)。

他们都是用向量来表示的,如果不想使用任何 各向异性 的值(译者注:专业名 词anisotropic (各向异性)去知道确切意思)的话,也可是使用 float类型来表示。

虽然看起来我们正在使用一个 isotropic(各向同性 ) ((Z值不影响2D元素))的值,这个EndValue也 不过是一个随机值。

也就是说,它的X和Y部分可能是完全统统的随机值!

除此之外,我们使用了一个简单的周期为0.2秒 的正弦曲线,它将会播放1秒钟。

看到了吧,我们将Amplification(增幅) 的值设为0,这就是说,随着时间的推进,曲线的振幅会逐渐变低。

注意:默认的Amplification是1,表示不随时间变化,保持稳定,当值大于1时,振幅 就会加大;当值小于1时,振幅就会减少。

看看圆是如何运动的。



[CircleFX]
SlotList= CircleX#CircleY
KeepInCache = true

[CircleX]
Type= position
StartTime = 0.0
EndTime = 1.0
Curve = sine
StartValue= (0.0, 0.0, 0.0)
EndValue= (-50.0, 0.0, 0.0)
UseOrientation= true
UseScale= true

[CircleY@CircleX]
Phase = 0.25
StartValue= (0.0, -25.0, 0.0)
EndValue= (0.0, 25.0, 0.0)

我们使用两个时间段来控制它的位置,这样才能做 出一个圆形的运动。第一个时间段是CircleX,他将会应用在对象的X轴向的振幅。第二个时间段CircleY,会产生一个同样幅度的作用效果在Y轴 上。

如果我们不更改CircleY的相位,是不会发 生圆形的运动。

现在假设一个正弦曲线,在初始值 (''StartValue'')是相位0,准备增加

在相位0。25的时候,到达中间点,将会继续增加

在相位0.5的时候,到达最高值 (''EndValue''),准备下降

在 相位0.75的时候,回到中间点,继续下降

在相位1.0的时候,就跟相位0(''StartValue'')是一样的了

注意:这段描述正弦曲线的工作过程也同样适用于 三角形,但是却不适用于线形。

我 们将略过大多数其他的特效,因为那里没有什么我们不知道的新知识了。

但是我们还是要迅速的看一眼翻转的特效,他将会向我们展示如何翻转一个对象。就像Paper Mario Wii((九天注:Wii上的[[wp>Paper Mario|纸片马里奥]]是个很出名的游戏,作者的意思就是这里的flip描述的就是那个游戏里面的风格和效果))的风格.


[FlipFX]
SlotList = Flip

[Flip@Wobble]
EndTime = 0.5
Period= 1.0
Amplification = 1.0

EndValue= (-1.0, 1.0, 1.0)

看到了吧,我们很简单的使用负值完成了这个效果。

同时也注意到,我们给Period(周期)设了一个明确的值。

我们选了一个两倍于定义的正弦曲线的 Period,这样我们就只使用了正弦曲线的上升的那一半。同时,我们也将Amplification改 回了1。(在”“Wobble”“中被设为0)


资源

源代码: 07_FX.c

配置文件: 07_FX.ini

分享到:
评论

相关推荐

    Orx游戏引擎源码

    Orx游戏引擎是一款开源的2D游戏开发框架,它的源码是学习和理解游戏引擎原理的宝贵资源。ORX的设计目标是简洁、模块化和跨平台,使得开发者能够快速构建2D游戏。以下是对Orx游戏引擎源码的详细解析: 1. **模块化...

    orx-install:ORx安装脚本

    什么是ORx? ORx的名称为“ Oh-Rex”,代表Outernet ReceiverX。“ X”代表自制设备。支持的设备和配置请注意,Raspberry Pi v1是目前唯一受支持的版本。 v2具有不支持的ARM v7处理器。 此存储库中的脚本支持以下...

    非典型2D游戏引擎 Orx 源码

    Orx 是一个轻量级的2D游戏引擎,它的设计目标是简洁、模块化和易于扩展。这个“非典型”之处在于它不采用常见的图形渲染管线,而是提供了一种更灵活的方式来构建游戏逻辑和视觉效果。Orx 以其小巧的体积、跨平台支持...

    Orx: Portable Game Engine:Orx:便携式游戏引擎-开源

    Orx是一款强大的便携式游戏引擎,专注于2D游戏开发,以其轻量级、灵活性和易用性而受到开发者们的欢迎。作为一个开源项目,Orx提供了完全透明的源代码,鼓励社区参与,促进了代码的持续改进和创新。 Orx的核心设计...

    IISURL重写组件(中文版)32位、64位rewrite_x32orx64_zh-CN.

    在【标题】中提到的"IISURL重写组件(中文版)32位、64位rewrite_x32orx64_zh-CN",意味着这是适用于不同架构系统(32位和64位)的中文版本,方便中国用户使用。 【描述】中提到的"win2008以上的服务器IIS设置URL...

    Suz-OrX-archive-refs-heads-master.zip

    标题"Suz-OrX-archive-refs-heads-master.zip"似乎是一个Git仓库的归档文件,通常包含了一个Git仓库在特定提交点的所有文件和目录。这种类型的文件经常用于代码备份、版本控制或者分享代码库。"refs-heads-master...

    C#实现类似淘宝图片局部放大功能源码.rar_C#图片放大_C#实现类似淘宝图片局部放大功能源码_Orx

    而"orx"通常是指Orx Portable Game Engine,这是一个轻量级、跨平台的游戏开发框架,它可能被用在这个项目中,作为图像处理的一部分。不过,考虑到这是一个关于图片局部放大的功能,Orx可能不是主要的库,而是可能...

    易语言4行代码实现ASCII转UniCode.zip

    而"dyEY6oRX.e"可能是源码文件,但由于无法直接查看,具体实现需要打开文件查看源码。 总的来说,这个项目展示了易语言在处理编码转换问题上的简洁性和实用性,对于学习易语言的初学者来说,这是一个很好的实践案例...

    sublime-text-orx:ORX配置对崇高文本的支持

    ORX配置对崇高文本的支持 安装 打开崇高文字, 单击菜单中的“首选项”,然后单击“浏览软件包...” 将ORX文件夹复制到那里, 完毕。 学分 我入侵了这个仓库[ ],然后添加了与ORX相关的内容。 什么是ORX? Orx...

    PELCON万用解码器使用说明.docx

    在协议选择方面,PELCON万用解码器支持多种品牌的协议,如PELCO-D、PELCO-P、SAMSUNG、PHILIPS、RM110、CCR-20G、HY9600、KALATEL、KODICOM、VICON、ORX-10、PANASONIC、PIH717、EASTERN、IDRS等。每个协议都有对应...

    ocaml-orx:Orx游戏引擎的OCaml绑定

    ocaml-orx-OCaml与Orx游戏库的绑定 是“一个开源,可移植,轻便,基于插件,数据驱动且非常易于使用的2D导向游戏引擎。” Orx本身是用C编写的。 该存储库提供绑定以使用OCaml中的Orx。 声音,图形,物理,输入处理...

    解决win8 richtx32.ocx

    在Windows操作系统中,richtx32.ocx是一个重要的ActiveX控件,主要用于处理Rich Text Format (RTF) 文档和文本编辑。这个控件在一些应用程序中是必需的,特别是那些依赖于旧版Microsoft RichEdit功能的软件。...

    西门子PLCSTL编程小手册范本.doc

    - **LDBx/ABx/OBx/LDWx/AWx/OWx/LDDx/ADx/ODx/LDRx/ARx/ORx**: 用于比较两个数值,并根据比较结果设置输出。 - **NOT**: 对栈顶值取反。 - **EU/ED**: 用于检测上升沿和下降沿。 3. **逻辑控制指令**: - **=**...

    rewrite_x32orx64_zh-CN

    **标题解析:** "rewrite_x32orx64_zh-CN" 这个标题表明这是一个针对中文用户(zh-CN)的关于“rewrite”技术的软件包,它同时提供了32位(x32)和64位(x64)版本的解决方案。"rewrite"通常指的是URL重写技术,用于管理...

    MSCOMCTL.OCX 64位

    Run-time error '339': Component 'MSCOMCTL.OCX' or one of its dependencies not correctly registered:a file is missing or invalid. win8操作步骤 ①解压压缩包 ②将解压出来的文件,剪切至 ...

    matlab中拟合中心线的代码-OrX:MatLab代码用于拟合定向膜脂质的31-PMAS旋转边带模式

    matlab中拟合中心线的代码关于OrX程序的注意事项: 最初由SR Kiihne撰写,2004年2月24日 定向的MAS nmr光谱 我最初是在来自Bruker实验的光谱上对此进行测试的:jr0203#22-26这些是31P MAS光谱,其自旋速率为500-...

    EPORNER 2.COM%20-%20[bpM0orx6f9R]%20

    EPORNER 2.COM%20-%20[bpM0orx6f9R]%20

    orx-color-pallete:orx引擎调色板定义

    欧罗调色板用于HTML颜色的定义。... 包含之后,您可以通过@Colors.MediumOrchid直接引用颜色名称。... 当您的编辑器支持颜色的可视化并且您可以原型化而无需使用颜色选择器工具切换到绘画程序时,这是很好的。

    arcgis 10 图框工具5.2

    《ArcGIS 10 图框工具5.2详解与应用》 ArcGIS 10 图框工具5.2是一款专为ArcGIS 10及10.1版本设计的图框生成工具,它极大地简化了地图制图过程中的图框制作步骤,提高了工作效率。作为一款共享软件,它鼓励用户支持...

    norx:ORX 2.5D游戏引擎的Nim包装器

    ORX是用C99,高性能和跨平台编写的。 包装器包括两个部分: 低层包装器,每个ORX C标头基本上具有一个Nim模块,其中将近80个。 所有这些都被命名为o-xxx,例如oinput或oobject 。 每个低级包装器具有一个Nim模块的...

Global site tag (gtag.js) - Google Analytics