ACTIONSCRIPT 2:按一个键后执行一次动作
Posted
技术标签:
【中文标题】ACTIONSCRIPT 2:按一个键后执行一次动作【英文标题】:ACTIONSCRIPT 2: Execute action once after pressing a Key 【发布时间】:2018-08-16 20:39:36 【问题描述】:我正在使用 ActionScript 2 在 ADOBE FLASH CS6 上制作我的第一个平台游戏。 当我按 W + ↓ 时,我的角色会进行短跑攻击动画。
我的问题是
如果我不按住 W + ↓,动画就会中断。如果我握住它,我的性格就会不断前进。
我想要的是,
当我按住 W + ↓ 时,我希望我的角色只冲刺一次并执行完整的动画。动画完成后,如果我仍然持有正确的输入,我希望我的角色执行我之前描述的内容。
我设法正确地进行了二段跳,但我想不出解决当前问题的方法。有什么解决办法吗?
这是我的演示链接(有背景音乐):http://www.fastswf.com/tLr3bCA
输入:
↑(跳转) ↓(蹲下) ← / →(移动) 按住 Q(跑得更快) 太空 离地时(双跳) ↓ + W (SWIFT STRIKE)这是我的角色 MovieClip 中的一部分 ActionScript (不在帧时间轴上):
//GENJI COMMANDS
if (Key.isDown(Key.RIGHT) && !Key.isDown(81))
_x += speed;
this.gotoAndStop("genjirun");
this._xscale = 100;
else if (Key.isDown(Key.RIGHT) && Key.isDown(81))
_x += speed + 5;
this.gotoAndStop("genjirunfast");
this._xscale = 100;
else if (Key.isDown(Key.LEFT) && !Key.isDown(81))
_x -= speed;
this.gotoAndStop("genjirun");
this._xscale = -100;
else if (Key.isDown(Key.LEFT) && Key.isDown(81))
_x -= speed + 5;
this.gotoAndStop("genjirunfast");
this._xscale = -100;
else if (Key.isDown(Key.DOWN) && touchingGround && !Key.isDown(Key.RIGHT) && !Key.isDown(Key.LEFT) && !Key.isDown(87))
this.gotoAndStop("genjicrouch");
else if (Key.isDown(Key.DOWN) && touchingGround && !Key.isDown(Key.RIGHT) && !Key.isDown(Key.LEFT) && Key.isDown(87) && _xscale == 100)
this.gotoAndStop("genjislash");
_x += 5;
else if (Key.isDown(Key.DOWN) && touchingGround && !Key.isDown(Key.RIGHT) && !Key.isDown(Key.LEFT) && Key.isDown(87) && _xscale == -100)
this.gotoAndStop("genjislash");
_x += -5;
if (Key.isDown(Key.UP) && touchingGround)
grav = maxJump;
else if (!touchingGround && Key.isDown(32) && DJcancel == 0)
grav = -19;
DJcancel = 3;
else if (!touchingGround or !Doublejumping == 3)
this.gotoAndStop("genjijump");
else if (touchingGround && !Key.isDown(Key.RIGHT) && !Key.isDown(Key.LEFT) && !Key.isDown(Key.DOWN))
this.gotoAndStop(1);
DJcancel = 0;
if (touchingGround)
DJcancel = 0;
有什么建议吗?另外,这个方法好还是我应该改变它?
【问题讨论】:
【参考方案1】:使用 AS2,为您的 MovieClip 定义 .onKeyDown
,如下所示:
yourMC.onKeyDown = function(e)
// Now test e
;
按键按下时只处理一次,长按时不会重复处理。
【讨论】:
【参考方案2】:首先,我建议您切换到 AS3,因为 AS2 已经过时了 10 年,这并非没有原因。它很慢,很不直,给你很多错误的想法。此外,在 AS3 上没有什么是你不能用 AS2 做的,但反之亦然:AS3 中有很多事情是你不能用 AS2 做的。
另外,我怀疑是否有任何人可以在 AS2 方面为您提供专业帮助,因为它已经过时 10 年,并且仅出于向后兼容性的原因由 Adobe 支持。
然后,您的问题可以通过一点逻辑轻松解决。您需要finite-state machine 模型。让我们定义两个状态变量:
var dashKeys:Boolean = false;
var dashState:String = "none";
变量 dashKeys 应该代表 ↓ + W 按下状态。我相信你会毫无问题地做到这一点。变量 dashState 应该采用 3 个不同的值(嗯,状态):“dash”在播放 dash 动画时,“after”如果是 dash 动画如果它们都不完整,则为“none”。它显然以“none”开头。
现在,逻辑。
if (dashState == "none")
if (dashKeys)
// Switch to the next state.
dashState = "dash";
// Start the dash animation here.
else if (dashState == "after")
if (dashKeys)
// Do whatever you want your character to do after
// dash animation if the keys are still pressed.
else
// Switch to the next state.
dashState = "none";
现在只剩下两件事了。
-
在破折号动画完成后将 dashState 更新为“after”,这样逻辑就可以推进了。
如果有任何情况下您在破折号动画完成之前中断破折号动画以不停止逻辑流程,请将 dashState 重置为“none”。
【讨论】:
非常感谢您的宝贵时间!我会尽快试一试。我也会切换到 AS3。以上是关于ACTIONSCRIPT 2:按一个键后执行一次动作的主要内容,如果未能解决你的问题,请参考以下文章