Construct2/3

创建于:2017-02-24

创建人: iconboy

103 信息 417 成员
Construct2/3 引擎开发专题

【翻译】 Construct2事件表中的高级用法

慕雪白羊 2017-02-27

声明:本文仅限 在Construct2/3小组 交流使用  翻译:ws.s

原作者:Tutorial written by AshleyOriginally published on 13th, April 2012 - 4 revisions

因为这篇文章对学习C2比较重要,所以我先翻译一下这篇实用的文章。


Construct 2在Eventsheet中提供了一些高级功能。这些功能可以让高手充分利用Eventsheet,实现比标准事件更复杂的逻辑。本教程总结了高级事件逻辑的用法、一些特别有用的Eventsheet功能,以及一些提示和技巧。

本教程面向经验丰富的用户。请务必了解C2中的Events 是如何工作的,如果你还没有,这篇教程教程你就可以先放在一边了。


Special conditions(特殊条件)

System对象有三个条件与正常条件不同。欲了解更多信息,请参阅系统条件的说明书。


Trigger once

这个条件可以使连续监测的事件条件,变为只触发一次。实际测试的结果是:“如果没有在最后一个tick满足这个条件”

通常它被放置为事件中的最后一个条件,因为如果它是第一个条件,它将立即满足条件,这造成的结果可能不是你所希望的。

Trigger once的条件用于播放声音:

思考一下下面的事件:


这是一个常见的错误 - 记住,事件是运行在每一个tick上,这是大约60次每秒在大多数计算机上 – 这会导致声音被连续播放,只要玩家的生命等于0,系统就会像机关枪一样的连续播放声音。相反,我们想在角色HP=0时,只播放一次GameOver声音。添加trigger once条件触发器就可以做到


现在的声音将角色HP=0时,只播放第一次将不会再播放,直到HP变化到别的数值然后回到0的时候,才会再次播放这个声音。

一个有用的技巧是将trigger once添加到事件group里:


如果该Group在游戏过程中被启用和禁用,则在启用该组时,将会运行该事件一次。它作为一种“On group enabled”触发器。


Pick all
正如描述的事件是如何工作的,要操作事件你必须先pick(拾取)所有的实例,然后再对不符合条件的实例进行排除。剩下的就是满足所有条件的实例子集,然后你的操作才会对这特定的实例产生影响。

Pick all是逆向工程的唯一条件:它清除你当前被pick的实例,并重新pick所有的特定实例。

很难想出一个简单的直观的例子,但它可以是有用的,复杂的项目必须处理多层嵌套的子事件,通过pick all可以方便地重置所选对象。


ELSE
ELSE的逻辑是:如果之前的事件没有运行,ELSE就会运行。它不能放置在触发器之后,并且必须是事件中的第一个条件。

如果ELSE在错误的地方,它就会出现红色的指示提示你必须移动它,如下图所示。您不能预览或导出项目,因为ELSE条件放在错误的地方,这样的逻辑是没有意义的。


一个共同的地方ELSE是非常有用的,比如切换下图中的Myflag量时。新手通常会出现以下错误:在按空格键的情况下,切换变量(0和1):


注意如何如果MyFlag是0它被设置为1,但随后的下一个事件立即再次将其设置到0,因为MyFlag已经等于1了!(这说明事件发生的顺序很重要:记住事件都是由顶部至底部运行。)此事件和预期的效果差远了,无论你按下空格多少次MyFlag 都是0。

一种解决方案是设置MyFlag = 1 - MyFlag。然而,这只适用于数字,而且看起来不那么直观。 针对上述情况,ELSE就可以解决问题:


现在,按空格键可以正确的切换MyFlag 0和1啦,因为ELSE只会在之前的条件没有执行的情况下,才会执行。

你可以使用快捷键  K  在当前选择的对象之后添加ELSE,记得熟悉EventSheet的键盘快捷键,你的编码速度会非常快。

注意ELSE不可以接实例对象。它只是意味着“最后事件没有运行”。思考下面的例子:


我们希望 屏幕上的怪物朝向玩家旋转,不在屏幕的怪物朝下(90度)。这有两个问题。首先,如果任何怪物在屏幕上,ELSE事件将不会运行。因为那一瞬间,第一个事件运行,所以ELSE的事件就不会运行了。其次,即使ELSE不运行时,它没有具体选择是哪个是屏幕外的怪物:它会影响所有的怪物,因为它没有pick实例。在这种情况下,最好是简单地用Invert来颠倒条件,而不是去用ELSE判断。


ELSE也可以和其他条件一起使用。编程中的“ELSE IF ”,在C2里只是通过增加额外的条件来设置。如下所示。



这可以被读取:

IF: ItemCount= 0:设置文本为“You have no items!”
ELSE IF,如果ItemCount=1:将文本设置为“You have one item!”
ELSE:将文本设置为“You have lots of items!”

这模仿了else - if 在编程语言中功能。



While循环

另一个有趣的系统条件是While循环。其他循环(For循环,For each,repeat)都相对简单,但工作方式略有不同,因此不在这里说明。

While的意思是,无限运行事件直到:
-一个条件下它变为假,或
-使用停止循环 的系统动作。
最常见的是它将被用于跟踪它的条件,像这样:


这将继续移动player 1像素,直到它不再与'Ground'重叠。它是立即发生的,因此会重复多次,直到'重叠地面'这个条件不满足了,它就不会再执行了。

小心不要意外地创建无限循环。如果条件在循环期间不可能变为flase,或者“While”条件单独使用,却不在循环内部设置一个“停止循环”的操作,这些都会导致无限循环的错误。


'and'块'和'or'块

正常事件是使用“and”逻辑:所有条件必须满足才会运行操作。

换句话说,“and”块,在“条件1与条件2和条件3 ...”必须全部满足的情况下,才会执行事件的行为。

与此相反,“or”块则是在满足其中的任意条件即可。

换句话说,如果“条件1或条件2或条件3 ...”是true,则它们将运行。考虑下面的例子:


这里的意图是让X<500或者Y<500的怪物停止移动。在这种情况下,如果任何实例满足任一条件,则事件运行。系统在pick事件的情况下,将选择符合任一条件的实例,执行 set bullet speed =0 的命令。

注意,普通的“AND”块,随着条件的增加,会过滤掉不满足条件的实例-(这会逐步减少pick实例的数量)。与此相反,“OR”块是添加满足条件实例-(这会逐步增加pick实例的数量)

默认情况下,事件块是正常的“And”类型。他们可以进行切换,选中指定块,右键勾选/取消“Make “or” block”,或按Y 键盘快捷键


通常,事件中只能放置一个触发器 条件。

但是,这不适用于'or'块。你可以添加多个触发器到“or”块中,并且当事件中的任何触发器触发时,操作将运行。

例如,下面显示了如果按下键盘上的A,B或C键则播放声音的事件:


注意,因为正常('And')块不能包含多个触发器,所以除非一个触发器被删除,否则此事件不能返回到“And”块。

使用子事件,你可以将“or”块与“and”块组合以创建更高级的逻辑。例如:


这将在按下A,B或C,的同时按住Control或Shift键,就会播放声音。

也就是:

满足(A按下 or B按下or C按下)AND(Ctrl或Shift已经按下)将播放声音

如果第二个事件不是“or”块,它将读为“Ctrl和 Shift都被按下”。

因此,如果按住Ctrl + Shift,然后按A,B或C,就会播放声音。

或者:“如果(按下或B按下或C按下)AND(控制按下并且Shift按下):播放声音”。所以使用子事件可以帮助您制作更高级的条件逻辑。


其他有用的高级功能


唯一ID(UID)和实例ID(IID)
UID和IID 高手将会经常用到 例如pick。

UID是实例的唯一的ID,如果对象被销毁,该UID依然存在。

UID可以用作对象的“引索”。

把A实例的UID 储存在B实例的变量中,通过B实例变量中的值,你可以将两者的关系联系起来。

 IID可以用于检索特定实例的表达式。例如,sprite(1).X将返回当前第二Sprite的X坐标,sprite(-1).X将返回最后一个sprite的X坐标

(因为construct2 采用编程常用的,以0开头的规定)。

欲了解更多信息,请参见对象表达式中的手动输入表达式

IID还可以用于pick实例,比较常用的是随机选取,你可以通过对象的IID +int(random(x))来随机挑选出Sprite中的某一个实例。

注意,IID并不是固定的值,如果要选择指定的物体请使用UID。

欲了解更多信息,请参见手册中的UID和的IID

近期喜欢的会员

 
StoneFan1987 2017-02-28

非常感谢


 
totoyan 2017-02-28

是的,这篇是基础,建议很多萌新先看看!感谢白羊大分享

 
jokemon 2017-02-28

非常感谢!while那个用法蛮受启发

 
number23 2017-02-28
很有用的教程,谢谢白羊的分享。
 

加入 indienova

  • 建立个人/工作室档案
  • 建立开发中的游戏档案
  • 关注个人/工作室动态
  • 寻找合作伙伴共同开发
  • 寻求线上发行
  • 更多服务……
登录/注册