跳到主要内容

快速入门

首先是新建工程和导入插件,这里不介绍了

从模板地图生成事件和创建敌人

首先我们需要一个模板地图,并从中读取和生成事件。首先在这个地图中新建两个事件

image-20260227175446675

首先是这个,它将作为我们的第一个敌人

在事件名称旁边的备注区域中输入<hp: first enemy>,它就会为这个事件创建一个血条,并且读取数据库中的同名敌人的属性数据

image-20260227175651043

因此,要确保数据库中存在一个名叫“first enemy”的敌人

image-20260227175751417

新建另一个事件名叫Statue,这个备注栏让它空着

image-20260227175843274

然后回到游戏地图当中,创建一个并行处理的事件,它负责通过插件命令来生成敌人,选择Hendirx_Action_Engine,使用Spawn Event命令。在Event ID/Name栏输入你刚才在模板地图创建的事件名称,在最后加一个暂时清除事件

image-20260227180151080

测试游戏,就会看到在模板地图中创建的事件跑到玩家的地图里了。其中一个有血条,另一个没有

敌人碰撞 - 与玩家

回到模板地图的敌人事件中,创建注释事件命令并输入:<passive: Enemy Collision>,这样就会调用一个名叫“Enemy Collision“的公共事件。

Passive命令用于调用公共事件,但它是在另一个层次上,它不会受自上而下的命令程序的影响

然后再创建一个同名的公共事件。首先,创建条件分歧,选择并输入脚本:checkCollide(this._eventId, 'player'),它的意思是,当事件与玩家接触,就会触发分歧。在我们这个例子中,这个事件会跳跃起来

image-20260227181040641

但现在进了游戏测试,发现敌人并不会跳,这是因为它的碰撞箱和玩家是相同的,并且玩家被这个事件挡开了,如图,按下数字9打开调试模式,可以看到所有碰撞箱,玩家和敌人根本碰不到

image-20260227181212474

为了避免这个情况,可以给事件设置为穿透,或者直接增加事件的碰撞箱大小,通过在备注输入:

<hitbox: width, height, offset x, offset y>

词语分别替换成对应的数值,后面两个是可选的

测试游戏后发现敌人可以成功跳跃了

不过,这个条件分歧只会触发一次。要让事件持续地检测碰撞,将条件分歧的脚本改成:

checkCollide(this._eventId, 'player', 5)

5代表每5帧检测一次

玩家操作 - 普通近战攻击

创建另一个并行处理事件,给它绑一个用于触发的开关,这个公共事件每帧调用一次,用于检测玩家的输入

创建一个条件分歧,脚本填入:equippedWeapon('Sword'),意思是:在玩家装备一把名叫Sword的装备时,返回真

在满足条件时,显示一段文本,然后创建一个名叫Sword的武器,让玩家装备上它

image-20260227184906610

进入游戏测试前,要把在公共事件中设置的开关打开,才会执行这个公共事件,随便怎么开都行,这里是创建了一个打开开关的并行处理事件,这样就会在玩家进入地图时自动打开开关

测试游戏弹出了设置的文本,说明正确触发了条件分歧

回到公共事件,把测试用的文本删掉,再加入一个条件分歧,检测玩家是否朝向左

当这两个条件(装备了正确武器,玩家朝向左),就调用一个插件命令:Swing Weapon(挥动武器)

image-20260227185326125

在Weapon Sprite设置使用的武器图像,放在pictures文件夹里,一个单个的武器图片就行

image-20260227185432748

默认的挥动速度Animation Speed,这里设置为9

保存好进入游戏,当玩家朝向左,就会开始挥动武器精灵了

image-20260227185627595

现在再创建一个条件分歧:Input.isTriggered('space'),然后把我们之前创建的那些条件分歧都移动到这个新的里面,这个意思就是:按下空格键,才会挥动武器

在挥动武器的插件命令后面加一个等待9帧,让它有一个9帧的延迟

image-20260227185848682

测试游戏,调整挥动动画的Y偏移

调整好后,仿照向左朝向的条件分歧,再创建另外三个朝向的分歧。这样是为了更好分别调整每个朝向的挥动动画偏移,当然如果没有这个需求,其实也不用专门创建四个分歧

image-20260227190250414

现在攻击效果做好了,但不会造成任何伤害

敌人碰撞 - 造成伤害

回到普通攻击的公共事件,在挥舞动画的插件命令下面创建新的插件命令:Create Dynamic Event,在notetag里输入<dmg: 15><eat this>

dynamic事件和普通的事件差不多,但它会到了内部的计时后就会自行清除。比如这里给这个dynamic事件的Destroy After设置为3,并将X / Y Position设置为player,意思就是这个事件会生成在玩家的位置,并在3帧后自动清除这个dynamic事件

image-20260227191331204

回到敌人碰撞公共事件,将条件分歧中的player改为刚才写在notetag里的<eat this>,保留尖括号

现在进入调试模式,但还看不到刚才的<eat this>dynamic事件,这是因为这个事件的碰撞箱和玩家一样,都是高1宽1

所以回去修改dynamic事件的碰撞箱,改为2, 2,在notetag后面加一个<hitbox: 2, 2>

再进入调试模式,就可以看到玩家攻击时,就会显示一圈<eat this>事件的碰撞箱,当敌人碰到这个事件的碰撞箱就会跳起来

image-20260227191836965

然后把其他的朝向的碰撞判定设置好

回到敌人碰撞的公共事件,将敌人的受击判定改为增减敌人HP,使用插件命令Increase / Decrease Enemy HP

由于我们之前已经设定了<dmg: 15>,所以在这里,把HP Change设定为-change,这样就会自动识别并读取dmg设定的15

但我们之前已经让玩家装备了武器,所以不能浪费它,改为判定玩家的攻击力+武器攻击力,所以删掉刚才的-change,在下面设置Use Actor ATK & Weapon

现在就可以造成伤害了,但我们需要显示伤害数字,现在用指令Pop Text Value,Weapon Attack选择slot1,这样就可以显示伤害了

最后,再对做一些调整和删改,在Create Dynamic Event这里,将<dmg: 15>删掉

敌人死亡判定

在敌人碰撞事件这里的结尾,再加一个条件分歧:HP(this_eventId) <= 0,意思是当备注带有<HP>事件的HP为0时,返回true

在条件分期下,控制独立开关,转到一个带有注释<death>的页面。

使用插件指令中的Control Self Switch,Comment to Search for里填<death>,这样与直接打开独立开关A等效,但同时插件会自动搜寻到带有<death>这个词的注释

回到敌人事件,创建一个新的页面,条件为独立开关A打开,注释命令里写上<death>,为了清除敌人,使用插件命令Break Character,等待60帧,再使用Destroy Spawn Event,把这一页面改为并行处理

测试游戏后发现还有两个问题:血条仍然会在陪屏幕上停留一段时间,并且击破效果应当隐藏事件精灵

所以回到敌人事件中的第二页,在Break Character后面加一个移动路线设置,启用透明,然后在Break Character前面加一个Remove Event HP Bar指令,解决

玩家远程武器

在建立一个新武器之前,将前面的事件重新组织一下,以便后面再增加更多武器

image-20260227230152881

这里是整理了一下条件分歧并进行折叠,大致层级关系是按键分歧 > 武器分歧 > 朝向分歧

然后创建一个与sword同级的条件分歧,依旧是判定武器是否装备的脚本,sword改为bow,然后新建名为Bow的武器,让玩家装备

插入Spawn Event,从模板地图导入一个名叫Arrow的事件,稍后我们再创建它,然后将X / Y Position改为player,rotation Degree为mouse or gamepad,如果连接了手柄,就会随着右侧摇杆旋转,否则就是随着鼠标指针的位置

然后加一个等待,防止射的太快

image-20260227230743186

现在在模板地图设置一个名为Arrow的事件,事件图像设置为箭,且如果使用了Rotation功能,精灵图的四个朝向就必须都要向上,调整一下速度和频率,允许穿透和并行处理

image-20260227230904323

在事件页里设置移动路线,调用脚本moveToPosition('forward', 'tile'),这个箭就会向当前的旋转角度移动一格,这里调用了7次脚本,就会移动7格

image-20260227231325302

移动结束后,打开独立开关A移动到新的页面,输入注释<death>,以及用指令消除生成的事件

测试游戏,此时按下空格键,就会往鼠标或手柄的位置射箭,但现在无法碰撞到敌人

我们可以在箭事件中加入notetag<eat this>,但它会用角色攻击+武器攻击来计算伤害,现在我们希望能够为箭自定义它的伤害