﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Where there is a dream ,there is hope-随笔分类-翻译文章</title><link>http://www.cppblog.com/Husiwa/category/15242.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 18 Nov 2010 00:03:44 GMT</lastBuildDate><pubDate>Thu, 18 Nov 2010 00:03:44 GMT</pubDate><ttl>60</ttl><item><title>monodevelop 命令系统</title><link>http://www.cppblog.com/Husiwa/archive/2010/11/11/133310.html</link><dc:creator>Husiwa</dc:creator><author>Husiwa</author><pubDate>Thu, 11 Nov 2010 06:45:00 GMT</pubDate><guid>http://www.cppblog.com/Husiwa/archive/2010/11/11/133310.html</guid><wfw:comment>http://www.cppblog.com/Husiwa/comments/133310.html</wfw:comment><comments>http://www.cppblog.com/Husiwa/archive/2010/11/11/133310.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Husiwa/comments/commentRss/133310.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Husiwa/services/trackbacks/133310.html</trackback:ping><description><![CDATA[<p><a href="http://monodevelop.com/Developers/Articles/The_Command_System#Menus_and_Toolbars">http://monodevelop.com/Developers/Articles/The_Command_System#Menus_and_Toolbars</a><br>命令系统<br>本文阐述了Monodevelop命令系统的工作机制以及开发者如何利用这些优势来写自己的插件。</p>
<p><strong>1。基本概念</strong><br>在阐述Monodevelop命令系统的工作机制之前，我们先要了解两件事<br>命令和使用这些命令的菜单和工具条是分开定义的<br>命令的执行是取决于上下文的，比如说你在文本编辑器中调用delete和在工程目录树中调用delete虽然都</p>
<p>是同一条命令，但是执行结果却是不一样的。<br><strong>2。命令定义</strong><br>命令都是要定义在"/MonoDevelop/Ide/Commands" 这个扩展点下面，如下：<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Command&nbsp;id&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">MonoDevelop.Ide.Commands.ProjectCommands.Run</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;defaultHandler&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">MonoDevelop.Ide.Commands.RunHandler</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;icon&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">gtk-execute</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;shortcut&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">F5</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;description&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Run</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;_label&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Run</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">/&gt;</span></div>
<p><br>id:命令的标识，<span style="COLOR: #ff6600">注意</span>：这个id一定要和已存在的枚举类型的全名（包括命名空间）保持一致。这个枚举</p>
<p>类型会被用来确定执行那个具体的命令。</p>
<p>defaultHandler:是用来标识执行当前上下文中默认的命令类</p>
<p>icon：在工具条和菜单栏中显示的图标</p>
<p>_lable: 在菜单栏上显示的文本</p>
<p>description:显示在tooltip上的文字（可选）</p>
<p>shortcut: 命令的快捷键</p>
<p>Toggle 命令<br>是用来在主文本旁边显示一个是否触发状态的命令，以及显示工具栏是否激活的标识。这些命令用check</p>
<p>来标识。如下：<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Command&nbsp;id&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">MonoDevelop.Ide.Commands.ProjectCommands.IncludeInBuild</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;type&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">check</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;_label&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Build</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">/&gt;</span></div>
<p>&nbsp;</p>
<p>如果有多个toggle命令相互排斥，那么你可以用radio类型来标识。<br>Custom commands 自定义命令<br>自定义命令用来展示在菜单和工具栏上的自定义的小窗体。如果要使用它，先将type属性设置为custom然</p>
<p>后在widget标签中指定相应的小窗体类。如下：<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Command&nbsp;id&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">MonoDevelop.Ide.Commands.ProjectCommands.ConfigurationSelector</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;type&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">custom</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;widget&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">MonoDevelop.Ide.Gui.ConfigurationComboBox</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;_label&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Active&nbsp;Configuration</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">/&gt;</span></div>
<p>&nbsp;</p>
<p>Command Arrays 命令组<br>命令组是用来实现菜单栏中的选择列表。<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Command&nbsp;id&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">MonoDevelop.Ide.Commands.WindowCommands.OpenWindowList</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;defaultHandler&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">MonoDevelop.Ide.Commands.OpenWindowListHandler</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;type</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">radio|array</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;_label&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Window&nbsp;List</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">/&gt;</span></div>
<p><br>注意：array和check可以同时使用，也可以和radio一起使用。一般来说，命令组用来动态的在菜单和工</p>
<p>具栏上产生命令。<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Command&nbsp;id&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">MonoDevelop.Ide.Commands.FileCommands.RecentFileList</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defaultHandler&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">MonoDevelop.Ide.Commands.RecentFileListHandler</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">array</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_label&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Recent&nbsp;Files</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">/&gt;</span></div>
<p>&nbsp;</p>
<p><br><strong>3。菜单和工具条</strong></p>
<p>Menus and Toolbars 菜单栏和工具条<br>菜单栏和工具条用相同的方式来定义。IDE提供了很多扩展点来定义主菜单，主工具条，如下：</p>
<p>CommandItem</p>
<p>Creates an item that will invoke the command identified by the id attribute. If the command </p>
<p>is actually a command array, it will create an item for each element in the command array.</p>
<p>SeparatorItem</p>
<p>ItemSet<br>创建一个item的字项菜单，它有两个属性_label和icon<br>用在工具栏上，那就是下拉式的</p>
<p>LinkItem<br>创建打开网络连接的入口<br>Creates a menu or toolbar entry that opens a web page in the default web browser. For </p>
<p>example:</p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">LinkItem&nbsp;id&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">MonoDevelop</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;_label&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">MonoDevelop</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;link&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">http://www.monodevelop.com</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">/&gt;</span></div>
<p>&nbsp;</p>
<p><strong>4。执行命令</strong></p>
<p>执行命令<br>牢记：命令的执行和命令的上下文息息相关<br>那什么是上下文呢？上下文就是拥有焦点的窗体，当焦点改变的时候，上下文也随之而变。命令集就跟着</p>
<p>变为可用或者不可用。<br>这意味这我们每一个窗体定义命令执行类了吗？非也，每个widget都有一个command dispathcroute.dang </p>
<p>当调用一个命令的时候，如果具有焦点的widget没有handler，那么它就会传递给route上的下一个对象，</p>
<p>也就是父widget<br>如下图所示：<br><img height=339 alt="" src="http://www.cppblog.com/images/cppblog_com/husiwa/commandsystem.jpg" width=373 border=0><br>通常，command routes会按照下面这个顺序来寻找：<br>*拥有焦点的widget<br>*父widget，直到root widget<br>*全局command Handler，使用这个来注册：Ide.CommandServices.RegisterGlobalHandler(object)<br>*default handler：就是配置文件中的defaulterHandler</p>
<p>Implementing command handlers实现</p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">[CommandHandler&nbsp;(FileCommands.Save)]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;OnSaveFile&nbsp;()<br><img id=Codehighlighter1_66_88_Open_Image onclick="this.style.display='none'; Codehighlighter1_66_88_Open_Text.style.display='none'; Codehighlighter1_66_88_Closed_Image.style.display='inline'; Codehighlighter1_66_88_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_66_88_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_66_88_Closed_Text.style.display='none'; Codehighlighter1_66_88_Open_Image.style.display='inline'; Codehighlighter1_66_88_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_66_88_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_66_88_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Do&nbsp;the&nbsp;save</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></span><span style="COLOR: #000000">}</span></span></div>
<p>&nbsp;</p>
<p>FileCommands.Save是用来标记命令的枚举值</p>
<p>Managing Command Status 更改命令状态<br>打开monodevelop，新建一个文件，发现delete是禁用的，输入一些字，发现它可用用了，点一些任务列</p>
<p>表，发现它又不可以用了。这是怎么做到的呢？<br>我们先要理解一件事:命令系统会自动禁用不是该command route上的命令.这是在焦点发生改变的时候发</p>
<p>生的。<br>如果命令的状态依附于应用内部的逻辑结构，可用将它加入到一个特殊的Command Update Handler。</p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">[CommandUpdateHandler&nbsp;(FileCommands.Save)]<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;OnUpdateSaveFile&nbsp;(CommandInfo&nbsp;info)<br><img id=Codehighlighter1_94_201_Open_Image onclick="this.style.display='none'; Codehighlighter1_94_201_Open_Text.style.display='none'; Codehighlighter1_94_201_Closed_Image.style.display='inline'; Codehighlighter1_94_201_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_94_201_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_94_201_Closed_Text.style.display='none'; Codehighlighter1_94_201_Open_Image.style.display='inline'; Codehighlighter1_94_201_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_94_201_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_94_201_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;IViewContent&nbsp;content&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;window.ActiveViewContent&nbsp;</span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000">&nbsp;IViewContent;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;info.Enabled&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;content.IsDirty;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<p>&nbsp;</p>
<p>这条命令会在命令系统想要知道命令的状态的时候调用。比如说菜单命令，当菜单要显示的时候就调用，</p>
<p>工具栏是周期性的调用。</p>
<p>因为命令更新和命令是一体的，所以更新的方法要和执行的方法在一起写。</p>
<p>在command update handler 中，你可以使用commandinfo对象来改变对象的状态。但并不限于此，你可以</p>
<p>改变command的所有属性，比如说描述文字，可见性等等。</p>
<p>Array command handlers</p>
<p>The default command handler</p>
<p>Startup Extension Path<br>这个特殊的commandhandler会在monodevelop启动的时候调用的，你需要做两件事。<br>首先，将你的class 比如说myhandler加入到启动的扩展点，修改MonoDevelop.Ide.addin.xml 文件像这</p>
<p>样：<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Extension&nbsp;path&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/MonoDevelop/Ide/StartupHandlers</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Class&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">MyHandler</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">Extension</span><span style="COLOR: #000000">&gt;</span></div>
<p><br>接下来，完成这个类的实现<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;MyHandler:&nbsp;CommandHandler<br><img id=Codehighlighter1_32_120_Open_Image onclick="this.style.display='none'; Codehighlighter1_32_120_Open_Text.style.display='none'; Codehighlighter1_32_120_Closed_Image.style.display='inline'; Codehighlighter1_32_120_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_32_120_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_32_120_Closed_Text.style.display='none'; Codehighlighter1_32_120_Open_Image.style.display='inline'; Codehighlighter1_32_120_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_32_120_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_32_120_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">override</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Run&nbsp;()<br><img id=Codehighlighter1_69_116_Open_Image onclick="this.style.display='none'; Codehighlighter1_69_116_Open_Text.style.display='none'; Codehighlighter1_69_116_Closed_Image.style.display='inline'; Codehighlighter1_69_116_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_69_116_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_69_116_Closed_Text.style.display='none'; Codehighlighter1_69_116_Open_Image.style.display='inline'; Codehighlighter1_69_116_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</span><span id=Codehighlighter1_69_116_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_69_116_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Console.Out.WriteLine(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Hello&nbsp;World!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/Husiwa/aggbug/133310.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Husiwa/" target="_blank">Husiwa</a> 2010-11-11 14:45 <a href="http://www.cppblog.com/Husiwa/archive/2010/11/11/133310.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Orx-教程--7特效--九天修订版</title><link>http://www.cppblog.com/Husiwa/archive/2010/07/07/119534.html</link><dc:creator>Husiwa</dc:creator><author>Husiwa</author><pubDate>Wed, 07 Jul 2010 00:58:00 GMT</pubDate><guid>http://www.cppblog.com/Husiwa/archive/2010/07/07/119534.html</guid><wfw:comment>http://www.cppblog.com/Husiwa/comments/119534.html</wfw:comment><comments>http://www.cppblog.com/Husiwa/archive/2010/07/07/119534.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Husiwa/comments/commentRss/119534.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Husiwa/services/trackbacks/119534.html</trackback:ping><description><![CDATA[
<h2><a id="综述" name="综述">综述</a></h2>
<div class="level2">
<p>参看前面的教程<a class="wikilink1" title="cn:orx:tutorials:main" href="http://orx-project.org/wiki/cn/orx/tutorials/main"><font color="#009900">基础</font></a>,<a class="wikilink1" title="cn:orx:tutorials:object" href="http://orx-project.org/wiki/cn/orx/tutorials/object"><font color="#009900"> 对象创建</font></a>,<a class="wikilink2" title="cn:orx:tutorials:clock" href="http://orx-project.org/wiki/cn/orx/tutorials/clock" rel="nofollow"><font color="#ff3300"> 时钟</font></a> , <a class="wikilink2" title="cn:orx:tutorials:frame" href="http://orx-project.org/wiki/cn/orx/tutorials/frame" rel="nofollow"><font color="#ff3300">框架层次结构</font></a>， <a class="wikilink1" title="cn:orx:tutorials:anim" href="http://orx-project.org/wiki/cn/orx/tutorials/anim"><font color="#009900">动画</font></a>，<a class="wikilink1" title="cn:orx:tutorials:viewport" href="http://orx-project.org/wiki/cn/orx/tutorials/viewport"><font color="#009900"> 视口与摄像机</font></a>，和 <a class="wikilink2" title="cn:orx:tutorials:sound" href="http://orx-project.org/wiki/cn/orx/tutorials/sound" rel="nofollow"><font color="#ff3300">声音与音乐 </font></a>。<br>这篇教程介绍了什么是特效以及如何创建它们<br>特效是将曲线及其组合而成的一组数据（正弦线、三角型边、矩形或者线性），应用在不同类型的参数中。如：缩放、旋转、位置、速度、颜色等。<br></p>
<p>特效在配置文件中设置，仅仅只需要一行代码就可以在对象上使用这些特效。<br>可以有最多8条任意类型的曲线组合在一起形成一个特效。<br>在同一时间，可以有最多4个特效应用于同一个对象上面。<br></p>
<p>特效可以使用绝对值或者相对值，这取决于配置文件中Absolute标签。<br>控制曲线的周期、相位、和振幅都是允许的。<br>对于位置和速度特效来说，输出值可以使用对象的方向 和/或 缩放值，以相对方式应用于对象目前的状态。<br></p>
<p>这也就允许我们创造极其拉风的视觉特效。 </p>
<p>除非特效已经缓存在内存中，否则特效参数全部在配置文件中进行调整，并且使用退格键来即时重载。 (cf.通过 <code>KeepInCache</code> 属性来实现内存的缓存).<br>比如说：你不能调整正在运行的循环特效，因为他已经在默认的配置文件中定义好了。在这个测试程序运行的时候，所有其它的特效能够被更新。<br></p>
<p>通常说来，随机值的使用可以给特效带来更多的变化。<br>比如, 晃动方式的缩放（the wobble scale), 带颜色的闪光(the flash color) 和 攻击式的移动(the &#8220;attack&#8221; move) 等特效就使用了少量的随机值. </p>
<p>就像显示事件一样，我们也可以注册特效的开始播放和停止的事件。因为循环时间是永远不会停下来的，所以对应的停止事件(<code>orxFX_EVENT_STOP</code>)永远不会发生. 我们也会简单的介绍一下如何一些个性数据（仅仅包含一个布尔值的结构）添加到orxOBJECT中。<sup><a class="fn_top" id="fnt__1" href="http://orx-project.org/wiki/cn/orx/tutorials/fx#fn__1" name="fnt__1"><font color="#436976">1)</font></a></sup><br>在事件的回调函数中，我们通过它，在特效开始的时候为对象加锁，在结束的时候解锁。<br>我们使用锁是为了让soldier(士兵)在同一时刻只有一个特效在发挥作用。<br>把这些东西写在这里，仅仅具有教育意义。<sup><a class="fn_top" id="fnt__2" href="http://orx-project.org/wiki/cn/orx/tutorials/fx#fn__2" name="fnt__2"><font color="#436976">2)</font></a></sup> </p>
</div>
<h2><a id="详细内容" name="详细内容">详细内容</a></h2>
<div class="level2">
<p>通常，我们先载入配置文件，创建一个时钟，然后注册更新函数，最后，创建我们的士兵和盒子对象。请在<a class="wikilink1" title="cn:orx:tutorials:main" href="http://orx-project.org/wiki/cn/orx/tutorials/main#basic"><font color="#009900">之间的教程</font></a>中获取更多信息。 . </p>
<p>然后，我们注册输入和特效事件 </p>
<pre class="code c">orxEvent_AddHandler<span class="br0"><font color="#66cc66">(</font></span>orxEVENT_TYPE_FX<span class="sy0"><font color="#66cc66">,</font></span> EventHandler<font color="#66cc66"><span class="br0">)</span><span class="sy0">;</span></font>
orxEvent_AddHandler<span class="br0"><font color="#66cc66">(</font></span>orxEVENT_TYPE_INPUT<span class="sy0"><font color="#66cc66">,</font></span> EventHandler<font color="#66cc66"><span class="br0">)</span><span class="sy0">;</span></font></pre>
<p>大家可以看到，在这两个事件中，我们使用了同一个回调函数（EventHandler）. </p>
<p>现在我们迅速的扫一眼自己的&#8220;对象&#8221;数据结构。 </p>
<pre class="code c"><span class="kw4"><font color="#993333">typedef</font></span> <span class="kw4"><font color="#993333">struct</font></span> MyObject
<span class="br0"><font color="#66cc66">{</font></span>
orxBOOL bLock<span class="sy0"><font color="#66cc66">;</font></span>
<span class="br0"><font color="#66cc66">}</font></span> MyObject<span class="sy0"><font color="#66cc66">;</font></span></pre>
<p>接下来，看看如何用 orxObject_SetUserData()将它绑定到soldier上 </p>
<pre class="code c">MyObject <span class="sy0"><font color="#66cc66">*</font></span>pstMyObject<span class="sy0"><font color="#66cc66">;</font></span>
&nbsp;
pstMyObject <span class="sy0"><font color="#66cc66">=</font></span> orxMemory_Allocate<span class="br0"><font color="#66cc66">(</font></span><span class="kw4"><font color="#993333">sizeof</font></span><span class="br0"><font color="#66cc66">(</font></span>MyObject<font color="#66cc66"><span class="br0">)</span><span class="sy0">,</span></font> orxMEMORY_TYPE_MAIN<font color="#66cc66"><span class="br0">)</span><span class="sy0">;</span></font>
pstMyObject<span class="sy0"><font color="#66cc66">-&gt;</font></span>bLock <span class="sy0"><font color="#66cc66">=</font></span> orxFALSE<span class="sy0"><font color="#66cc66">;</font></span>
&nbsp;
orxObject_SetUserData<span class="br0"><font color="#66cc66">(</font></span>pstSoldier<span class="sy0"><font color="#66cc66">,</font></span> pstMyObject<font color="#66cc66"><span class="br0">)</span><span class="sy0">;</span></font></pre>
<p>现在看看如何在Update函数中使用特效 </p>
<pre class="code c">orxSTRING zSelectedFX<span class="sy0"><font color="#66cc66">;</font></span>
&nbsp;
<span class="kw1"><font color="#b1b100">if</font></span><span class="br0"><font color="#66cc66">(</font></span>orxInput_IsActive<span class="br0"><font color="#66cc66">(</font></span><span class="st0"><font color="#ff0000">"SelectWobble"</font></span><font color="#66cc66"><span class="br0">)</span><span class="br0">)</span></font>
<span class="br0"><font color="#66cc66">{</font></span>
zSelectedFX <span class="sy0"><font color="#66cc66">=</font></span> <span class="st0"><font color="#ff0000">"WobbleFX"</font></span><span class="sy0"><font color="#66cc66">;</font></span>
<span class="br0"><font color="#66cc66">}</font></span>
<span class="kw1"><font color="#b1b100">else</font></span> <span class="kw1"><font color="#b1b100">if</font></span><span class="br0"><font color="#66cc66">(</font></span>orxInput_IsActive<span class="br0"><font color="#66cc66">(</font></span><span class="st0"><font color="#ff0000">"SelectCircle"</font></span><font color="#66cc66"><span class="br0">)</span><span class="br0">)</span></font>
<span class="br0"><font color="#66cc66">{</font></span>
zSelectedFX <span class="sy0"><font color="#66cc66">=</font></span> <span class="st0"><font color="#ff0000">"CircleFX"</font></span><span class="sy0"><font color="#66cc66">;</font></span>
<span class="br0"><font color="#66cc66">}</font></span>
&nbsp;
<span class="br0"><font color="#66cc66">[</font></span>...<span class="br0"><font color="#66cc66">]</font></span>
&nbsp;
<span class="co1"><em><font color="#808080">// Soldier not locked?</font></em></span>
<span class="kw1"><font color="#b1b100">if</font></span><font color="#66cc66"><span class="br0">(</span><span class="sy0">!</span><span class="br0">(</span><span class="br0">(</span></font>MyObject <font color="#66cc66"><span class="sy0">*</span><span class="br0">)</span></font>orxObject_GetUserData<span class="br0"><font color="#66cc66">(</font></span>pstSoldier<font color="#66cc66"><span class="br0">)</span><span class="br0">)</span><span class="sy0">-&gt;</span></font>bLock<span class="br0"><font color="#66cc66">)</font></span>
<span class="br0"><font color="#66cc66">{</font></span>
<span class="kw1"><font color="#b1b100">if</font></span><span class="br0"><font color="#66cc66">(</font></span>orxInput_IsActive<span class="br0"><font color="#66cc66">(</font></span><span class="st0"><font color="#ff0000">"ApplyFX"</font></span><span class="br0"><font color="#66cc66">)</font></span> <span class="sy0"><font color="#66cc66">&amp;&amp;</font></span> orxInput_HasNewStatus<span class="br0"><font color="#66cc66">(</font></span><span class="st0"><font color="#ff0000">"ApplyFX"</font></span><font color="#66cc66"><span class="br0">)</span><span class="br0">)</span></font>
<span class="br0"><font color="#66cc66">{</font></span>
orxObject_AddFX<span class="br0"><font color="#66cc66">(</font></span>pstSoldier<span class="sy0"><font color="#66cc66">,</font></span> zSelectedFX<font color="#66cc66"><span class="br0">)</span><span class="sy0">;</span></font>
<span class="br0"><font color="#66cc66">}</font></span>
<span class="br0"><font color="#66cc66">}</font></span></pre>
<p>可以看到，我们通过orxObject_GetUserData()这个函数得到了我们想要的数据，向solder里添加特效的方法跟添加声音的方法如出一辙，用的都是这个函数orxObject_AddFX()。 </p>
<p>接下来，看看EventHandler这个函数 </p>
<p>首先是输入方面，这里只展示了每次输入时哪个按键被使用了。 </p>
<pre class="code c"><span class="kw1"><font color="#b1b100">if</font></span><span class="br0"><font color="#66cc66">(</font></span>_pstEvent<span class="sy0"><font color="#66cc66">-&gt;</font></span>eType <span class="sy0"><font color="#66cc66">==</font></span> orxEVENT_TYPE_INPUT<span class="br0"><font color="#66cc66">)</font></span>
<span class="br0"><font color="#66cc66">{</font></span>
<span class="kw1"><font color="#b1b100">if</font></span><span class="br0"><font color="#66cc66">(</font></span>_pstEvent<span class="sy0"><font color="#66cc66">-&gt;</font></span>eID <span class="sy0"><font color="#66cc66">==</font></span> orxINPUT_EVENT_ON<span class="br0"><font color="#66cc66">)</font></span>
<span class="br0"><font color="#66cc66">{</font></span>
orxINPUT_EVENT_PAYLOAD <span class="sy0"><font color="#66cc66">*</font></span>pstPayload<span class="sy0"><font color="#66cc66">;</font></span>
&nbsp;
pstPayload <span class="sy0"><font color="#66cc66">=</font></span> <span class="br0"><font color="#66cc66">(</font></span>orxINPUT_EVENT_PAYLOAD <font color="#66cc66"><span class="sy0">*</span><span class="br0">)</span></font>_pstEvent<span class="sy0"><font color="#66cc66">-&gt;</font></span>pstPayload<span class="sy0"><font color="#66cc66">;</font></span>
&nbsp;
<span class="kw1"><font color="#b1b100">if</font></span><span class="br0"><font color="#66cc66">(</font></span>pstPayload<span class="sy0"><font color="#66cc66">-&gt;</font></span>aeType<span class="br0"><font color="#66cc66">[</font></span><span class="nu0"><font color="#cc66cc">1</font></span><span class="br0"><font color="#66cc66">]</font></span> <span class="sy0"><font color="#66cc66">!=</font></span> orxINPUT_TYPE_NONE<span class="br0"><font color="#66cc66">)</font></span>
<span class="br0"><font color="#66cc66">{</font></span>
orxLOG<span class="br0"><font color="#66cc66">(</font></span><span class="st0"><font color="#ff0000">"[%s] triggered by '%s' + '%s'."</font></span><span class="sy0"><font color="#66cc66">,</font></span> pstPayload<span class="sy0"><font color="#66cc66">-&gt;</font></span>zInputName<span class="sy0"><font color="#66cc66">,</font></span> orxInput_GetBindingName<span class="br0"><font color="#66cc66">(</font></span>pstPayload<span class="sy0"><font color="#66cc66">-&gt;</font></span>aeType<span class="br0"><font color="#66cc66">[</font></span>0<font color="#66cc66"><span class="br0">]</span><span class="sy0">,</span></font> pstPayload<span class="sy0"><font color="#66cc66">-&gt;</font></span>aeID<span class="br0"><font color="#66cc66">[</font></span>0<font color="#66cc66"><span class="br0">]</span><span class="br0">)</span><span class="sy0">,</span></font> orxInput_GetBindingName<span class="br0"><font color="#66cc66">(</font></span>pstPayload<span class="sy0"><font color="#66cc66">-&gt;</font></span>aeType<span class="br0"><font color="#66cc66">[</font></span>1<font color="#66cc66"><span class="br0">]</span><span class="sy0">,</span></font> pstPayload<span class="sy0"><font color="#66cc66">-&gt;</font></span>aeID<span class="br0"><font color="#66cc66">[</font></span>1<font color="#66cc66"><span class="br0">]</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></font>
<span class="br0"><font color="#66cc66">}</font></span>
<span class="kw1"><font color="#b1b100">else</font></span>
<span class="br0"><font color="#66cc66">{</font></span>
orxLOG<span class="br0"><font color="#66cc66">(</font></span><span class="st0"><font color="#ff0000">"[%s] triggered by '%s'."</font></span><span class="sy0"><font color="#66cc66">,</font></span> pstPayload<span class="sy0"><font color="#66cc66">-&gt;</font></span>zInputName<span class="sy0"><font color="#66cc66">,</font></span> orxInput_GetBindingName<span class="br0"><font color="#66cc66">(</font></span>pstPayload<span class="sy0"><font color="#66cc66">-&gt;</font></span>aeType<span class="br0"><font color="#66cc66">[</font></span>0<font color="#66cc66"><span class="br0">]</span><span class="sy0">,</span></font> pstPayload<span class="sy0"><font color="#66cc66">-&gt;</font></span>aeID<span class="br0"><font color="#66cc66">[</font></span>0<font color="#66cc66"><span class="br0">]</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></font>
<span class="br0"><font color="#66cc66">}</font></span>
<span class="br0"><font color="#66cc66">}</font></span>
<span class="br0"><font color="#66cc66">}</font></span></pre>
<p>正如你所见，我们通过按下的是一个单键还是一个组合键来判断展示不同的信息。 </p>
<p>我们仅使用了两个首次输入点，因为我们知道，我们的配置文件中没有超过两个的组合键。尽管orx支持最多四个组合键来做为一个单键。 </p>
<p>orxInput_GetBindingName() 函数给了我们一个输入的文字显示。 </p>
<p>注意：这些名称在配置文件中也绑定到了对应的按键上面。 </p>
<p>现在来看下如何处理这个事件 </p>
<pre class="code c"><span class="kw1"><font color="#b1b100">if</font></span><span class="br0"><font color="#66cc66">(</font></span>_pstEvent<span class="sy0"><font color="#66cc66">-&gt;</font></span>eType <span class="sy0"><font color="#66cc66">==</font></span> orxEVENT_TYPE_FX<span class="br0"><font color="#66cc66">)</font></span>
<span class="br0"><font color="#66cc66">{</font></span>
orxFX_EVENT_PAYLOAD <span class="sy0"><font color="#66cc66">*</font></span>pstPayload<span class="sy0"><font color="#66cc66">;</font></span>
orxOBJECT           <span class="sy0"><font color="#66cc66">*</font></span>pstObject<span class="sy0"><font color="#66cc66">;</font></span>
&nbsp;
pstPayload <span class="sy0"><font color="#66cc66">=</font></span> _pstEvent<span class="sy0"><font color="#66cc66">-&gt;</font></span>pstPayload<span class="sy0"><font color="#66cc66">;</font></span>
pstObject  <span class="sy0"><font color="#66cc66">=</font></span> orxOBJECT<span class="br0"><font color="#66cc66">(</font></span>_pstEvent<span class="sy0"><font color="#66cc66">-&gt;</font></span>hRecipient<font color="#66cc66"><span class="br0">)</span><span class="sy0">;</span></font>
&nbsp;
<span class="kw1"><font color="#b1b100">switch</font></span><span class="br0"><font color="#66cc66">(</font></span>_pstEvent<span class="sy0"><font color="#66cc66">-&gt;</font></span>eID<span class="br0"><font color="#66cc66">)</font></span>
<span class="br0"><font color="#66cc66">{</font></span>
<span class="kw1"><font color="#b1b100">case</font></span> orxFX_EVENT_START<span class="sy0"><font color="#66cc66">:</font></span>
orxLOG<span class="br0"><font color="#66cc66">(</font></span><span class="st0"><font color="#ff0000">"FX &lt;%s&gt;@&lt;%s&gt; has started!"</font></span><span class="sy0"><font color="#66cc66">,</font></span> pstPayload<span class="sy0"><font color="#66cc66">-&gt;</font></span>zFXName<span class="sy0"><font color="#66cc66">,</font></span> orxObject_GetName<span class="br0"><font color="#66cc66">(</font></span>pstObject<font color="#66cc66"><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></font>
&nbsp;
<span class="kw1"><font color="#b1b100">if</font></span><span class="br0"><font color="#66cc66">(</font></span>pstObject <span class="sy0"><font color="#66cc66">==</font></span> pstSoldier<span class="br0"><font color="#66cc66">)</font></span>
<span class="br0"><font color="#66cc66">{</font></span>
<span class="co1"><em><font color="#808080">// Locks it</font></em></span>
<font color="#66cc66"><span class="br0">(</span><span class="br0">(</span></font>MyObject <font color="#66cc66"><span class="sy0">*</span><span class="br0">)</span></font>orxObject_GetUserData<span class="br0"><font color="#66cc66">(</font></span>pstObject<font color="#66cc66"><span class="br0">)</span><span class="br0">)</span><span class="sy0">-&gt;</span></font>bLock <span class="sy0"><font color="#66cc66">=</font></span> orxTRUE<span class="sy0"><font color="#66cc66">;</font></span>
<span class="br0"><font color="#66cc66">}</font></span>
<span class="kw2"><strong>break</strong></span><span class="sy0"><font color="#66cc66">;</font></span>
&nbsp;
<span class="kw1"><font color="#b1b100">case</font></span> orxSOUND_EVENT_STOP<span class="sy0"><font color="#66cc66">:</font></span>
orxLOG<span class="br0"><font color="#66cc66">(</font></span><span class="st0"><font color="#ff0000">"FX &lt;%s&gt;@&lt;%s&gt; has stoped!"</font></span><span class="sy0"><font color="#66cc66">,</font></span> pstPayload<span class="sy0"><font color="#66cc66">-&gt;</font></span>zFXName<span class="sy0"><font color="#66cc66">,</font></span> orxObject_GetName<span class="br0"><font color="#66cc66">(</font></span>pstObject<font color="#66cc66"><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span></font>
&nbsp;
<span class="kw1"><font color="#b1b100">if</font></span><span class="br0"><font color="#66cc66">(</font></span>pstObject <span class="sy0"><font color="#66cc66">==</font></span> pstSoldier<span class="br0"><font color="#66cc66">)</font></span>
<span class="br0"><font color="#66cc66">{</font></span>
<span class="co1"><em><font color="#808080">// Unlocks it</font></em></span>
<font color="#66cc66"><span class="br0">(</span><span class="br0">(</span></font>MyObject <font color="#66cc66"><span class="sy0">*</span><span class="br0">)</span></font>orxObject_GetUserData<span class="br0"><font color="#66cc66">(</font></span>pstObject<font color="#66cc66"><span class="br0">)</span><span class="br0">)</span><span class="sy0">-&gt;</span></font>bLock <span class="sy0"><font color="#66cc66">=</font></span> orxFALSE<span class="sy0"><font color="#66cc66">;</font></span>
<span class="br0"><font color="#66cc66">}</font></span>
<span class="kw2"><strong>break</strong></span><span class="sy0"><font color="#66cc66">;</font></span>
<span class="br0"><font color="#66cc66">}</font></span>
<span class="br0"><font color="#66cc66">}</font></span></pre>
<p>在soldier上的动画开始的时候，我们用自己的数据结构来锁定它，相应的，停止的时候解锁。 </p>
<p>看完了代码部分，我们再去看看配置文件。 </p>
<p>首先看个简单的特效 ：盒子上旋转的特效。 </p>
<pre class="code ini"><span class="re0"><span class="br0"><font color="#66cc66">[</font></span><font color="#0000ff">RotateLoopFX</font><span class="br0"><font color="#66cc66">]</font></span></span>
<span class="re1"><font color="#0000ff">SlotList</font></span>  <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> Rotate</font></span>
<span class="re1"><font color="#0000ff">Loop</font></span>      <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> true</font></span>
&nbsp;
<span class="re0"><span class="br0"><font color="#66cc66">[</font></span><font color="#0000ff">Rotate</font><span class="br0"><font color="#66cc66">]</font></span></span>
<span class="re1"><font color="#0000ff">Type</font></span>        <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> rotation</font></span>
<span class="re1"><font color="#0000ff">StartTime</font></span>   <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> 0.0</font></span>
<span class="re1"><font color="#0000ff">EndTime</font></span>     <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> 2.0</font></span>
<span class="re1"><font color="#0000ff">Curve</font></span>       <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> sine</font></span>
<span class="re1"><font color="#0000ff">Pow</font></span>         <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> 2.0</font></span>
<span class="re1"><font color="#0000ff">StartValue</font></span>  <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> 0</font></span>
<span class="re1"><font color="#0000ff">EndValue</font></span>    <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> 360</font></span>
&nbsp;
<span class="re0"><span class="br0"><font color="#66cc66">[</font></span><font color="#0000ff">Box</font><span class="br0"><font color="#66cc66">]</font></span></span>
<span class="re1"><font color="#0000ff">FXList</font></span> <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> RotateLoopFX</font></span></pre>
<p>看到了吧，特效是在它创建之初直接应用在盒对象上面的，而不是在代码中。 </p>
<p>RotateLoopFX包含仅包含一个时间段（Rotate）并且一直循环（attribute Loop） </p>
<p>然后定义Rotates时间段。时间的单位都是秒，角度的单位都是度。 </p>
<p>定义这个旋转动画的时候，我们使用了一个正弦曲线，让他每两秒旋转360度。 </p>
<p>下面看下我们的摇摆特效。 </p>
<pre class="code ini"><span class="re0"><span class="br0"><font color="#66cc66">[</font></span><font color="#0000ff">WobbleFX</font><span class="br0"><font color="#66cc66">]</font></span></span>
<span class="re1"><font color="#0000ff">SlotList</font></span> <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> Wobble</font></span>
&nbsp;
<span class="re0"><span class="br0"><font color="#66cc66">[</font></span><font color="#0000ff">Wobble</font><span class="br0"><font color="#66cc66">]</font></span></span>
<span class="re1"><font color="#0000ff">Type</font></span>          <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> scale</font></span>
<span class="re1"><font color="#0000ff">StartTime</font></span>     <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> 0.0</font></span>
<span class="re1"><font color="#0000ff">EndTime</font></span>       <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> 1.0</font></span>
<span class="re1"><font color="#0000ff">Period</font></span>        <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> 0.2</font></span>
<span class="re1"><font color="#0000ff">Curve</font></span>         <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> sine</font></span>
<span class="re1"><font color="#0000ff">Amplification</font></span> <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> 0.0</font></span>
<span class="re1"><font color="#0000ff">StartValue</font></span>    <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> </font><span class="br0"><font color="#66cc66">(</font></span><span class="nu0"><font color="#cc66cc">1.0</font></span><font color="#0000ff">, </font><span class="nu0"><font color="#cc66cc">1.0</font></span><font color="#0000ff">, </font><span class="nu0"><font color="#cc66cc">1.0</font></span><span class="br0"><font color="#66cc66">)</font></span></span>
<span class="re1"><font color="#0000ff">EndValue</font></span>      <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> </font><span class="br0"><font color="#66cc66">(</font></span><span class="nu0"><font color="#cc66cc">2.0</font></span><font color="#0000ff">, </font><span class="nu0"><font color="#cc66cc">2.0</font></span><font color="#0000ff">, </font><span class="nu0"><font color="#cc66cc">1.0</font></span><span class="br0"><font color="#66cc66">)</font></span><font color="#0000ff"> ~ </font><span class="br0"><font color="#66cc66">(</font></span><span class="nu0"><font color="#cc66cc">6.0</font></span><font color="#0000ff">, </font><span class="nu0"><font color="#cc66cc">6.0</font></span><font color="#0000ff">, </font><span class="nu0"><font color="#cc66cc">1.0</font></span><span class="br0"><font color="#66cc66">)</font></span></span></pre>
<p>我们修改了scale属性，并赋予它一个<code>StartValue</code>（开始值）和<code>EndValue</code>（结束值）。<br>他们都是用向量来表示的，如果不想使用任何<a class="urlextern" title="http://baike.baidu.com/view/26056.htm?fr=ala0_1_1" href="http://baike.baidu.com/view/26056.htm?fr=ala0_1_1" rel="nofollow"><font color="#436976">各向异性</font></a>的值（译者注：专业名词<a class="interwiki iw_wp" title="http://en.wikipedia.org/wiki/anisotropic" href="http://en.wikipedia.org/wiki/anisotropic"><font color="#436976">anisotropic(各向异性)</font></a>去知道确切意思）的话，也可是使用float类型来表示。<br>虽然看起来我们正在使用一个<a class="interwiki iw_wp" title="http://en.wikipedia.org/wiki/isotropic" href="http://en.wikipedia.org/wiki/isotropic"><font color="#436976">isotropic(各向同性）</font></a><sup><a class="fn_top" id="fnt__3" href="http://orx-project.org/wiki/cn/orx/tutorials/fx#fn__3" name="fnt__3"><font color="#436976">3)</font></a></sup>的值，这个<code>EndValue</code>也不过是一个随机值。<br></p>
<p>也就是说，它的X和Y部分可能是完全统统的随机值！ </p>
<p>除此之外，我们使用了一个简单的周期为0.2 秒的正弦曲线，它将会播放1秒钟。 </p>
<p>看到了吧，我们将Amplification（增幅） 的值设为0，这就是说，随着时间的推进，曲线的振幅会逐渐变低。注意：默认的Amplification是1，表示不随时间变化，保持稳定，当值大于1时，振幅就会加大；当值小于1时，振幅就会减少。 </p>
<p>看看圆是如何运动的。 </p>
<pre class="code ini"><span class="re0"><span class="br0"><font color="#66cc66">[</font></span><font color="#0000ff">CircleFX</font><span class="br0"><font color="#66cc66">]</font></span></span>
<span class="re1"><font color="#0000ff">SlotList</font></span>        <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> CircleX#CircleY</font></span>
<span class="re1"><font color="#0000ff">KeepInCache</font></span>     <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> true</font></span>
&nbsp;
<span class="re0"><span class="br0"><font color="#66cc66">[</font></span><font color="#0000ff">CircleX</font><span class="br0"><font color="#66cc66">]</font></span></span>
<span class="re1"><font color="#0000ff">Type</font></span>            <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> position</font></span>
<span class="re1"><font color="#0000ff">StartTime</font></span>       <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> 0.0</font></span>
<span class="re1"><font color="#0000ff">EndTime</font></span>         <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> 1.0</font></span>
<span class="re1"><font color="#0000ff">Curve</font></span>           <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> sine</font></span>
<span class="re1"><font color="#0000ff">StartValue</font></span>      <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> </font><span class="br0"><font color="#66cc66">(</font></span><span class="nu0"><font color="#cc66cc">0.0</font></span><font color="#0000ff">, </font><span class="nu0"><font color="#cc66cc">0.0</font></span><font color="#0000ff">, </font><span class="nu0"><font color="#cc66cc">0.0</font></span><span class="br0"><font color="#66cc66">)</font></span></span>
<span class="re1"><font color="#0000ff">EndValue</font></span>        <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> </font><span class="br0"><font color="#66cc66">(</font></span><font color="#0000ff">-</font><span class="nu0"><font color="#cc66cc">50.0</font></span><font color="#0000ff">, </font><span class="nu0"><font color="#cc66cc">0.0</font></span><font color="#0000ff">, </font><span class="nu0"><font color="#cc66cc">0.0</font></span><span class="br0"><font color="#66cc66">)</font></span></span>
<span class="re1"><font color="#0000ff">UseOrientation</font></span>  <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> true</font></span>
<span class="re1"><font color="#0000ff">UseScale</font></span>        <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> true</font></span>
&nbsp;
<span class="re0"><span class="br0"><font color="#66cc66">[</font></span><font color="#0000ff">CircleY@CircleX</font><span class="br0"><font color="#66cc66">]</font></span></span>
<span class="re1"><font color="#0000ff">Phase</font></span>       <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> 0.25</font></span>
<span class="re1"><font color="#0000ff">StartValue</font></span>  <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> </font><span class="br0"><font color="#66cc66">(</font></span><span class="nu0"><font color="#cc66cc">0.0</font></span><font color="#0000ff">, -</font><span class="nu0"><font color="#cc66cc">25.0</font></span><font color="#0000ff">, </font><span class="nu0"><font color="#cc66cc">0.0</font></span><span class="br0"><font color="#66cc66">)</font></span></span>
<span class="re1"><font color="#0000ff">EndValue</font></span>    <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> </font><span class="br0"><font color="#66cc66">(</font></span><span class="nu0"><font color="#cc66cc">0.0</font></span><font color="#0000ff">, </font><span class="nu0"><font color="#cc66cc">25.0</font></span><font color="#0000ff">, </font><span class="nu0"><font color="#cc66cc">0.0</font></span><span class="br0"><font color="#66cc66">)</font></span></span></pre>
<p>Here we need to use 2 slots that affects the position so as to be able to have a circle motion.<br>The first slot, <code>CircleX</code>, will apply a sine curve on the X component of our object's position.<br>The second slot, <code>CircleY</code>, will apply the same curve (with a different amplitude) on its Y component.<br></p>
<p>我们使用两个时间段来控制它的位置，这样才能做出一个圆形的运动。第一个时间段是CircleX，他将会应用在对象的X轴向的振幅。第二个时间段CircleY,会产生一个同样幅度的作用效果在Y轴上。 </p>
<p>如果我们不更改CircleY的相位，是不会发生圆形的运动。 </p>
<p>现在假设一个正弦曲线，在初始值(<code>StartValue</code>)是相位0，准备增加 </p>
<p>在相位0。25的时候，到达中间点，将会继续增加 </p>
<p>在相位0.5的时候，到达最高值(<code>EndValue</code>)，准备下降 </p>
<p>在相位0.75的时候，回到中间点，继续下降 </p>
<p>在相位1.0的时候，就跟相位0（<code>StartValue</code>）是一样的了 </p>
<p>注意：这段描述正弦曲线的工作过程也同样适用于三角形，但是却不适用于线形。 </p>
<p>我们将略过大多数其他的特效，因为那里没有什么我们不知道的新知识了。 </p>
<p>但是我们还是要迅速的看一眼翻转的特效，他将会向我们展示如何翻转一个对象。就像Paper Mario Wii<sup><a class="fn_top" id="fnt__4" href="http://orx-project.org/wiki/cn/orx/tutorials/fx#fn__4" name="fnt__4"><font color="#436976">4)</font></a></sup>的风格. </p>
<pre class="code ini"><span class="re0"><span class="br0"><font color="#66cc66">[</font></span><font color="#0000ff">FlipFX</font><span class="br0"><font color="#66cc66">]</font></span></span>
<span class="re1"><font color="#0000ff">SlotList</font></span> <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> Flip</font></span>
&nbsp;
<span class="re0"><span class="br0"><font color="#66cc66">[</font></span><font color="#0000ff">Flip@Wobble</font><span class="br0"><font color="#66cc66">]</font></span></span>
<span class="re1"><font color="#0000ff">EndTime</font></span>       <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> 0.5</font></span>
<span class="re1"><font color="#0000ff">Period</font></span>        <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> 1.0</font></span>
<span class="re1"><font color="#0000ff">Amplification</font></span> <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> 1.0</font></span>
<span class="re1"><font color="#0000ff">EndValue</font></span>      <span class="sy0"><font color="#66cc66">=</font></span><span class="re2"><font color="#0000ff"> </font><span class="br0"><font color="#66cc66">(</font></span><font color="#0000ff">-</font><span class="nu0"><font color="#cc66cc">1.0</font></span><font color="#0000ff">, </font><span class="nu0"><font color="#cc66cc">1.0</font></span><font color="#0000ff">, </font><span class="nu0"><font color="#cc66cc">1.0</font></span><span class="br0"><font color="#66cc66">)</font></span></span></pre>
<p>看到了吧，我们很简单的使用负值完成了这个效果! <img class="middle" alt="=)" src="http://orx-project.org/wiki/lib/images/smileys/icon_smile2.gif"><br>同时也注意到，我们给<code>Period</code>(周期)设了一个明确的值。<br>我们选了一个两倍于定义的正弦曲线的<code>Period</code>，这样我们就只使用了正弦曲线的上升的那一半。同时，我们也将<code>Amplification</code>改回了1。（在&#8221;&#8220;Wobble&#8221;&#8220;中被设为0） </p>
</div>
<h2><a id="资源" name="资源">资源</a></h2>
<div class="level2">
<p>源代码: <a class="urlextern" title="https://orx.svn.sourceforge.net/svnroot/orx/trunk/tutorial/src/07_FX/07_FX.c" href="https://orx.svn.sourceforge.net/svnroot/orx/trunk/tutorial/src/07_FX/07_FX.c" rel="nofollow"><font color="#800080">07_FX.c</font></a> </p>
<p>配置文件: <a class="urlextern" title="https://orx.svn.sourceforge.net/svnroot/orx/trunk/tutorial/bin/07_FX.ini" href="https://orx.svn.sourceforge.net/svnroot/orx/trunk/tutorial/bin/07_FX.ini" rel="nofollow"><font color="#800080">07_FX.ini</font></a> </p>
</div>
<div class="footnotes">
<div class="fn"><sup><a class="fn_bot" id="fn__1" href="http://orx-project.org/wiki/cn/orx/tutorials/fx#fnt__1" name="fn__1"><strong><font color="#436976">1)</font></strong></a></sup> 九天注：这里作者有点穿越了，需要看下面的例子才能懂，作者定义了一个仅包含一个Bool值的结构MyObject，这里的括号，作者打在了orxOBJECT后面，我费解了N久，其实应该修饰个性数据，所以个人调整了一下。</div>
<div class="fn"><sup><a class="fn_bot" id="fn__2" href="http://orx-project.org/wiki/cn/orx/tutorials/fx#fnt__2" name="fn__2"><strong><font color="#436976">2)</font></strong></a></sup> 九天注：本来一个对象可以同时有4个特效发生，这里作者仅仅是告诉你怎么使用&#8220;个性数据&#8221;才这样做的，所以说仅仅具有教育意义。</div>
<div class="fn"><sup><a class="fn_bot" id="fn__3" href="http://orx-project.org/wiki/cn/orx/tutorials/fx#fnt__3" name="fn__3"><strong><font color="#436976">3)</font></strong></a></sup> Z值不影响2D元素</div>
<div class="fn"><sup><a class="fn_bot" id="fn__4" href="http://orx-project.org/wiki/cn/orx/tutorials/fx#fnt__4" name="fn__4"><strong><font color="#436976">4)</font></strong></a></sup> 九天注：Wii上的<a class="interwiki iw_wp" title="http://en.wikipedia.org/wiki/Paper Mario" href="http://en.wikipedia.org/wiki/Paper%20Mario"><font color="#436976">纸片马里奥</font></a>是个很出名的游戏，作者的意思就是这里的flip描述的就是那个游戏里面的风格和效果</div>
</div><img src ="http://www.cppblog.com/Husiwa/aggbug/119534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Husiwa/" target="_blank">Husiwa</a> 2010-07-07 08:58 <a href="http://www.cppblog.com/Husiwa/archive/2010/07/07/119534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Orx教程--7-特效</title><link>http://www.cppblog.com/Husiwa/archive/2010/07/06/119428.html</link><dc:creator>Husiwa</dc:creator><author>Husiwa</author><pubDate>Tue, 06 Jul 2010 05:27:00 GMT</pubDate><guid>http://www.cppblog.com/Husiwa/archive/2010/07/06/119428.html</guid><wfw:comment>http://www.cppblog.com/Husiwa/comments/119428.html</wfw:comment><comments>http://www.cppblog.com/Husiwa/archive/2010/07/06/119428.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Husiwa/comments/commentRss/119428.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Husiwa/services/trackbacks/119428.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 综述这篇教程介绍了什么是特效以及如何创建它们&nbsp;特效是建立在曲线集（线、三角形、矩形、）之上的，它们具有不同参数如：大小、旋度、位置、速度、颜色等。&nbsp;特效在配置文件中设置，仅仅只需要一行代码就可以在对象上使用这些特效。8条任意类型的曲线组合在一起就可以形成一个特效。在同一时间，可以有多达4个特效应用于同一个对象上面。&nbsp;特效可以使用绝对...&nbsp;&nbsp;<a href='http://www.cppblog.com/Husiwa/archive/2010/07/06/119428.html'>阅读全文</a><img src ="http://www.cppblog.com/Husiwa/aggbug/119428.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Husiwa/" target="_blank">Husiwa</a> 2010-07-06 13:27 <a href="http://www.cppblog.com/Husiwa/archive/2010/07/06/119428.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Orx教程--4.动画</title><link>http://www.cppblog.com/Husiwa/archive/2010/07/05/119366.html</link><dc:creator>Husiwa</dc:creator><author>Husiwa</author><pubDate>Mon, 05 Jul 2010 15:21:00 GMT</pubDate><guid>http://www.cppblog.com/Husiwa/archive/2010/07/05/119366.html</guid><wfw:comment>http://www.cppblog.com/Husiwa/comments/119366.html</wfw:comment><comments>http://www.cppblog.com/Husiwa/archive/2010/07/05/119366.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Husiwa/comments/commentRss/119366.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Husiwa/services/trackbacks/119366.html</trackback:ping><description><![CDATA[
原文：<a href="http://orx-project.org/wiki/en/orx/tutorials/anim">http://orx-project.org/wiki/en/orx/tutorials/anim</a><br><br><strong style="FONT-SIZE: 18pt">综述</strong><br><br>这篇教程只涉及了orx中最基本的动画使用。<br><br>更多关于动画的东西在这里 <a title="Anim" href="http://en.wikipedia.org/wiki/Directed_graph">猛击我.<br></a><br>图定义了动画间所有可能的切换方式。动画通过一个唯一的字符串来引用。所有的切换和动画都是通过配置文件来创建的。<br>当一个动画被请求的时候，引擎会计算从当前动画到请求动画之间的链路<br>如果这个链路存在，它会自动执行。用户将通过事件被告知动画何时开始、停止、删节或者循环。<br>如果我们不能具体制定任何目标动画，引擎就会很自然的沿着属性中定义的线路（走下去）。<br>也有一个方法来越过这个寻路过程并且迅速的指向一个动画。<br><br><span style="FONT-SIZE: 18pt">详细内容<br></span><br>通常，我们先载入config file(配置文件)，创建一个viewport,创建一个clock(时钟)并且注册Update(更新)函数，最后创建一个主对象。<br>请从之前的教程中获得更多的信息。<br><br>现在我们开始从代码入手，我们将会从本页的底部看到数据是如何组织的。<br>在Update函数中，当输入GoLeft激活的时候会触发WalkLeft动画；GoRight激活的时候会触发WalkRight函数.<br>当没有激活态的输入时，我们会移除目标动画，让这个图保持一个自然的状态<br><br>
<div style="border-left-color: rgb(204, 204, 204); padding-bottom: 4px; background-color: rgb(238, 238, 238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; padding-top: 4px; "><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(orxInput_IsActive(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">GoRight</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">))<br><img id="Codehighlighter1_33_87_Open_Image" onclick="this.style.display='none'; Codehighlighter1_33_87_Open_Text.style.display='none'; Codehighlighter1_33_87_Closed_Image.style.display='inline'; Codehighlighter1_33_87_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id="Codehighlighter1_33_87_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_33_87_Closed_Text.style.display='none'; Codehighlighter1_33_87_Open_Image.style.display='inline'; Codehighlighter1_33_87_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id="Codehighlighter1_33_87_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_33_87_Open_Text"><span style="COLOR: #000000">{<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;orxObject_SetTargetAnim(pstSoldier,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">WalkRight</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(orxInput_IsActive(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">GoLeft</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">))<br><img id="Codehighlighter1_126_179_Open_Image" onclick="this.style.display='none'; Codehighlighter1_126_179_Open_Text.style.display='none'; Codehighlighter1_126_179_Closed_Image.style.display='inline'; Codehighlighter1_126_179_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id="Codehighlighter1_126_179_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_126_179_Closed_Text.style.display='none'; Codehighlighter1_126_179_Open_Image.style.display='inline'; Codehighlighter1_126_179_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id="Codehighlighter1_126_179_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_126_179_Open_Text"><span style="COLOR: #000000">{<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;orxObject_SetTargetAnim(pstSoldier,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">WalkLeft</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br><img id="Codehighlighter1_186_236_Open_Image" onclick="this.style.display='none'; Codehighlighter1_186_236_Open_Text.style.display='none'; Codehighlighter1_186_236_Closed_Image.style.display='inline'; Codehighlighter1_186_236_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id="Codehighlighter1_186_236_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_186_236_Closed_Text.style.display='none'; Codehighlighter1_186_236_Open_Image.style.display='inline'; Codehighlighter1_186_236_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id="Codehighlighter1_186_236_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_186_236_Open_Text"><span style="COLOR: #000000">{<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;orxObject_SetTargetAnim(pstSoldier,&nbsp;orxNULL);<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div>
<br>就是这样！如何从任意当前动画切换到目标动画将会通过这个矢量图来计算。如果需要切换，他们将会自动播放。<br><em><span style="FONT-SIZE: 12pt">注意：有很多的函数可以用高级的方法来控制动画，但是99%的时候，这两个函数是最常用的（orxObject_SetCurrentAnim() 和 orxObject_SetTargetAnim()）。<br></span><br></em>让我们来看一下，动画是如何通知我们发生了什么的（比如，就像同步语音一样）。<br>首先，我们要向动画事件注册回调函数。<br><br>
<div style="border-left-color: rgb(204, 204, 204); padding-bottom: 4px; background-color: rgb(238, 238, 238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; padding-top: 4px; "><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">orxEvent_AddHandler(orxEVENT_TYPE_ANIM,&nbsp;EventHandler);</span></div>
<br>好了！让我们看下现在可以做什么了。<br>我们说我们想要打印出对象中哪个动画被播放、停止、剪切或者循环。需要写一下的回调函数。<br><br>
<div style="border-left-color: rgb(204, 204, 204); padding-bottom: 4px; background-color: rgb(238, 238, 238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; padding-top: 4px; "><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">orxSTATUS&nbsp;orxFASTCALL&nbsp;EventHandler(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;orxEVENT&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">_pstEvent)<br><img id="Codehighlighter1_62_876_Open_Image" onclick="this.style.display='none'; Codehighlighter1_62_876_Open_Text.style.display='none'; Codehighlighter1_62_876_Closed_Image.style.display='inline'; Codehighlighter1_62_876_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id="Codehighlighter1_62_876_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_62_876_Closed_Text.style.display='none'; Codehighlighter1_62_876_Open_Image.style.display='inline'; Codehighlighter1_62_876_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id="Codehighlighter1_62_876_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_62_876_Open_Text"><span style="COLOR: #000000">{<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">orxANIM_EVENT_PAYLOAD&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pstPayload;<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">pstPayload&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(orxANIM_EVENT_PAYLOAD&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)_pstEvent</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">pstPayload;<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">switch</span><span style="COLOR: #000000">(_pstEvent</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">eID)<br><img id="Codehighlighter1_187_844_Open_Image" onclick="this.style.display='none'; Codehighlighter1_187_844_Open_Text.style.display='none'; Codehighlighter1_187_844_Closed_Image.style.display='inline'; Codehighlighter1_187_844_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id="Codehighlighter1_187_844_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_187_844_Closed_Text.style.display='none'; Codehighlighter1_187_844_Open_Image.style.display='inline'; Codehighlighter1_187_844_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id="Codehighlighter1_187_844_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_187_844_Open_Text"><span style="COLOR: #000000">{<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;orxANIM_EVENT_START:<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;orxLOG(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Animation&nbsp;&lt;%s&gt;@&lt;%s&gt;&nbsp;has&nbsp;started!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;pstPayload</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">zAnimName,&nbsp;orxObject_GetName(orxOBJECT(_pstEvent</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">hRecipient)));<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;orxANIM_EVENT_STOP:<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;orxLOG(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Animation&nbsp;&lt;%s&gt;@&lt;%s&gt;&nbsp;has&nbsp;stoped!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;pstPayload</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">zAnimName,&nbsp;orxObject_GetName(orxOBJECT(_pstEvent</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">hRecipient)));<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;orxANIM_EVENT_CUT:<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;orxLOG(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Animation&nbsp;&lt;%s&gt;@&lt;%s&gt;&nbsp;has&nbsp;been&nbsp;cut!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;pstPayload</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">zAnimName,&nbsp;orxObject_GetName(orxOBJECT(_pstEvent</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">hRecipient)));<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;orxANIM_EVENT_LOOP:<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;orxLOG(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Animation&nbsp;&lt;%s&gt;@&lt;%s&gt;&nbsp;has&nbsp;looped!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;pstPayload</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">zAnimName,&nbsp;orxObject_GetName(orxOBJECT(_pstEvent</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">hRecipient)));<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;orxSTATUS_SUCCESS;<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div>
<br>先得到了事件的payload指针，因为我们只是在这里传递动画事件，所以我们可以安全的将payload 转化为orxANIM_EVENT_PAYLOAD类型，它在 orxAnim.h中定义。<br>如果我们在不同的事件（译者注：原文是even 根据上下文推断是作者拼写错误）类型中调用了同一个回调函数，我们首先将会查看是否得到了一个动画事件，可以这样做：<br><br>
<div style="border-left-color: rgb(204, 204, 204); padding-bottom: 4px; background-color: rgb(238, 238, 238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; padding-top: 4px; "><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(_pstEvent</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">eType&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;orxEVENT_TYPE_ANIM)</span></div>
<br>最后，事件接收者(_pstEvent&#8594;hRecipient)通常是播放动画的那个对象。将其用宏orxOBJECT()来转化为orOBJECT类型的对象。<br><br>现在让我们来看一眼数据方面的东西吧。<br>首先，我们需要定义一个动画集，它将会包含指定对象的动画的整个矢量图。<br>动画集在不会再内存中重复，并且它与矢量图相对应的多有动画和链路。<br>在上面这个例子中，我们又4个动画和10条可以用来切换的链路。<br><br>
<div style="border-left-color: rgb(204, 204, 204); padding-bottom: 4px; background-color: rgb(238, 238, 238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; padding-top: 4px; "><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">[AnimSet]<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">AnimationList&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;IdleRight#WalkRight#IdleLeft#WalkLeft<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">LinkList&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;IdleRightLoop#IdleRight2Left#IdleRight2WalkRight#WalkRightLoop#WalkRight2IdleRight#IdleLeftLoop#IdleLeft2Right#IdleLeft2WalkLeft#WalkLeftLoop#WalkLeft2IdleLeft</span></div>
<br>现在我们来开始定义动画！<br>在这之前，为了减少文章篇幅，我们将要使用orx 配置文件的集成特性。<br>先锚点的位置定义一项。<br>也许你可能在对象教程中看到了锚点的相关知识，锚点的位置信息将会匹配世界中的对象。如果没有确定的话，将会把左上角做为默认值。<br>锚点可以通过语义关键字来确定，如： top, bottom, center, left and right也可以通过实际的值来确定。<br><br>
<div style="border-left-color: rgb(204, 204, 204); padding-bottom: 4px; background-color: rgb(238, 238, 238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; padding-top: 4px; "><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">[Pivot]<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">Pivot&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">15.0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">31.0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0.0</span><span style="COLOR: #000000">)</span></div>
<br>现在，我们来定义从锚点继承过来的图像对象。在我们这个例子中，它是一个位图,，包含了对象中所有的帧。因此基本的属性就是 位图文件的名字和一帧的大小。<br><br>
<div style="border-left-color: rgb(204, 204, 204); padding-bottom: 4px; background-color: rgb(238, 238, 238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; padding-top: 4px; "><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">[FullGraphic@Pivot]<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">Texture&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;..</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">..</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">data</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">anim</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">soldier_full.png<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">TextureSize&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">32</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">32</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)</span></div>
<br>创建帧的准备工作都做好了。<br>让我们定义所有都是right-oriented的动画。一共6个。<br><br>
<div style="border-left-color: rgb(204, 204, 204); padding-bottom: 4px; background-color: rgb(238, 238, 238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; padding-top: 4px; "><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">[AnimRight1@FullGraphic]<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">TextureCorner&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">[AnimRight2@FullGraphic]<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">TextureCorner&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">32</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">[AnimRight3@FullGraphic]<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">TextureCorner&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">64</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">[AnimRight4@FullGraphic]<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">TextureCorner&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">32</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">[AnimRight5@FullGraphic]<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">TextureCorner&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">32</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">32</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">[AnimRight6@FullGraphic]<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">TextureCorner&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">32</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">64</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)</span></div>
<br><br>看到了吧，他们全都继承于FullGraphic，唯一能区分他们的属性就是TextureCorner. 好，我们已经定义完了所有的图形对象（他们载入的时候会转变为orxGraphic结构），下面定义动画本身。让我们从ideright动画开始说起，它包含一个单帧并持续0.1秒。<br><br>
<div style="border-left-color: rgb(204, 204, 204); padding-bottom: 4px; background-color: rgb(238, 238, 238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; padding-top: 4px; "><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">[IdleRight]<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">KeyData1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;AnimRight6<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">KeyDuration1&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0.1</span></div>
<br><br>太简单了，来尝试下第二个：<br><br>
<div style="border-left-color: rgb(204, 204, 204); padding-bottom: 4px; background-color: rgb(238, 238, 238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; padding-top: 4px; "><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">[WalkRight]<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">DefaultKeyDuration&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0.1</span><span style="COLOR: #000000"><br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">KeyData1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;AnimRight1<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">KeyData2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;AnimRight2<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">KeyData3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;AnimRight3<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">KeyData4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;AnimRight4<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">KeyData5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;AnimRight5<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">KeyData6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;AnimRight6</span></div>
<br><br>当我们使用DefaultKeyDuration属性同时为所有的帧定义时并不是很难。我们可以像idleright动画中所做的那样，通过一个确定的键值来覆盖任意一帧。我们如法炮制做出left-oriented动画。通常我们使用翻转图形对象时，我们将会在代码运行中做这件事。但是那不是我们的目的！让我们来用与前面那个完全不同的方法来实现它！只有链路没有提到了让我们添上它。基本的链路结构非常简单，我们指定源动画和目的动画。<br><br>
<div style="border-left-color: rgb(204, 204, 204); padding-bottom: 4px; background-color: rgb(238, 238, 238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; padding-top: 4px; "><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">[IdleRightLoop]<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">Source&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;IdleRight<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">Destination&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;IdleRight</span></div>
<br>这里，我们有跟之前一样的基本信息，但是多了一个immediate属性做为键值。这就是说，当我们处于IdleRight动画时，并且目标是WalkRight,我们不必等到IdleRight完成，将直接完成这个动作，这就给了我们一个剪切动画的方法。 正如在代码中看到的一样。当我们已经开始行走的时候，没有显式的调用空闲动画，这是怎么做到的？看下从WalkRight到IdleRight的链路。<br><br>
<div style="border-left-color: rgb(204, 204, 204); padding-bottom: 4px; background-color: rgb(238, 238, 238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; padding-top: 4px; "><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">[IdleRight2WalkRight]<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">Source&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;IdleRight<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">Destination&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;WalkRight<br><img align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">Property&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;immediate</span></div>
<br><br>当我们再WalkRight状态并且移除了目标动画，引擎不得按照自然的路线走下去。这个意思是说，它会选取高优先级的链路。默认的优先级是8，它的范围是0到15.在这里，优先级是9，也就是说当我们没有目标的时候，就会选取它。它将会带我们回到IdleRight状态。这里也加了immdiate属性，这样，我们就不必等&#8220;走&#8221;这个循环完事再回到&#8220;空闲&#8221;<br>&nbsp;<br><em>注意：这只是一个非常基本的图，用来阐述基本的动画切换过程，但是这个系统的扩展性很高。比如假设这样一个场景：你想从坐的状态变为走的状态，中间没有别的过度。随着游戏的开发，你可能觉得在这两个状态间加一个站立的状态会比较好。这时，你只需要再配置文件中添加这多出来的一步，而整个代码文件都不用更改。</em> <br><br><span style="FONT-SIZE: 18pt">资源：<br><br></span>源文件：<span style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Simsun; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" ><span style="TEXT-ALIGN: justify; FONT-FAMILY: 'Lucida Grande', Verdana, Lucida, Helvetica, Arial, sans-serif; FONT-SIZE: 13px" ><span class="Apple-converted-space">&nbsp;</span><a style="BACKGROUND-IMAGE: url(http://orx-project.org/wiki/lib/tpl/default/images/link_icon.gif); PADDING-BOTTOM: 1px; BACKGROUND-COLOR: transparent; MARGIN: 0px; PADDING-LEFT: 16px; PADDING-RIGHT: 0px; BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: 0px 1px; COLOR: rgb(67,105,118); TEXT-DECORATION: none; PADDING-TOP: 1px; -webkit-background-clip: initial; -webkit-background-origin: initial" class="urlextern" title="https://orx.svn.sourceforge.net/svnroot/orx/trunk/tutorial/src/04_Anim/04_Anim.c" href="https://orx.svn.sourceforge.net/svnroot/orx/trunk/tutorial/src/04_Anim/04_Anim.c" rel="nofollow">04_Anim.c</a></span></span><br>配置文件：<span style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Simsun; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" ><span style="TEXT-ALIGN: justify; FONT-FAMILY: 'Lucida Grande', Verdana, Lucida, Helvetica, Arial, sans-serif; FONT-SIZE: 13px" ><span class="Apple-converted-space">&nbsp;</span><a style="BACKGROUND-IMAGE: url(http://orx-project.org/wiki/lib/tpl/default/images/link_icon.gif); PADDING-BOTTOM: 1px; BACKGROUND-COLOR: transparent; MARGIN: 0px; PADDING-LEFT: 16px; PADDING-RIGHT: 0px; BACKGROUND-REPEAT: no-repeat; BACKGROUND-POSITION: 0px 1px; COLOR: rgb(67,105,118); TEXT-DECORATION: none; PADDING-TOP: 1px; -webkit-background-clip: initial; -webkit-background-origin: initial" class="urlextern" title="https://orx.svn.sourceforge.net/svnroot/orx/trunk/tutorial/bin/04_Anim.ini" href="https://orx.svn.sourceforge.net/svnroot/orx/trunk/tutorial/bin/04_Anim.ini" rel="nofollow">04_Anim.ini</a></span></span><br><img src ="http://www.cppblog.com/Husiwa/aggbug/119366.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Husiwa/" target="_blank">Husiwa</a> 2010-07-05 23:21 <a href="http://www.cppblog.com/Husiwa/archive/2010/07/05/119366.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>