Actionscript 3 相当于 KeyboardEvent.Repeat
Actionscript 3 equivalent of KeyboardEvent.Repeat
在编程方面,我是一个初学者;我在 Adobe Animator 上为我的 2D 游戏 class 做一个 flash 游戏,我对我的导师无法自己回答的代码有疑问。长话短说,我希望字符速度根据按下键的时间而增加,所以我想到了这个:
spdX = spdX + aclMov*(tempo) - aclFrc*(tempo);
只要按住键,可变速度就会增加,我会检查它是否与 KeyboardEvent.repeat,如:
if(heldDown){while(heldDown){tempo += 1}}
else{tempo = 0}
spdX = spdX + aclMov*(tempo) - aclFrc*(tempo);
然而,当我尝试这样做时,输出响应为“属性 repeat not found on flash.events.KeyboardEvent and there is no default value”。我认为这是因为 KeyboardEvent.repeat 没有在我使用的媒体中定义。无论如何,我是否可以重现 KeyboardEvent.repeat 的 相同效果 ,也许是通过创建一个模仿它会做的事情的函数?
提前致谢。
(编辑 1)
我开始为我的澄清不足以及我对这个主题的无知表示歉意,因为我在 as3 方面还不是初学者,而且我还没有正确地介绍我读过的许多术语。
因此,感谢评论的有意义的贡献,我已经大致了解了我需要采取什么样的解决方法来替代 KeyboardEvent.repeat。与问题相关的代码还有其他部分:
stage.addEventListener(KeyboardEvent.KEY_DOWN,pressKey)
function pressKey (Event){
(...)
if(Event.keyCode == (Keyboard.A)) {left = true;}
(...)
}
stage.addEventListener(KeyboardEvent.KEY_UP,releaseKey)
function releaseKey (Event){
(...)
if(Event.keyCode == (Keyboard.A)) {left = false;}
(...)
}
代码就是这样设计的。有人建议我使用getTimer()方法来记录事件KEY_DOWN发生的时刻,当KEY_UP[=46时停止=] 生效。问题是,我如何增加代码以使其区分这两个事件,更具体地说,我如何调整 ENTER_FRAME 事件,以便区分它们仍然有效吗? 顺便说一下,这是其中最相关的部分:
addEventListener(Event.ENTER_FRAME,walk);
function walk(Event) {
if(left) {
(...)
char.x -= spdX;
(...)
}
我假设代码一直运行到现在,因为随着 "left" 的状态不断在 "true" 和 "false" 之间切换,if 重复满足条件,导致角色移动。但是,如果我尝试使条件依赖于 "left" 在 "true" 停留一段时间,代码就会变得与自身不兼容。
简而言之,它带来了如何适配 "KEY_[]" 事件侦听器和 "walk" 函数一起工作的问题,在使用 getTimer() 方法时,一起工作。
再次感谢。
我相信这在某种程度上是不言自明的。
stage.addEventListener(KeyboardEvent.KEY_DOWN, onDown);
stage.addEventListener(KeyboardEvent.KEY_UP, onUp);
addEventListener(Event.ENTER_FRAME, onFrame);
var pressedKeyA:int;
// Never name variables and arguments with the same name
// as existing classes, however convenient that might seem.
function onDown(e:KeyboardEvent):void
{
if (e.keyCode == Keyboard.A)
{
// Let's record the moment it was pressed.
pressedKeyA = getTimer();
}
}
function onUp(e:KeyboardEvent):void
{
if (e.keyCode == Keyboard.A)
{
// Mark the key as not pressed.
pressedKeyA = 0;
}
}
function onFrame(e:Event):void
{
// It is true if it is not 0.
if (pressedKeyA)
{
// That's how long it has been pressed. In milliseconds.
var pressedFor:int = getTimer() - pressedKeyA;
// Change the position with regard to it.
// For example 1 base + 1 per second.
char.x -= 1 + pressedFor / 1000;
}
}
在编程方面,我是一个初学者;我在 Adobe Animator 上为我的 2D 游戏 class 做一个 flash 游戏,我对我的导师无法自己回答的代码有疑问。长话短说,我希望字符速度根据按下键的时间而增加,所以我想到了这个:
spdX = spdX + aclMov*(tempo) - aclFrc*(tempo);
只要按住键,可变速度就会增加,我会检查它是否与 KeyboardEvent.repeat,如:
if(heldDown){while(heldDown){tempo += 1}}
else{tempo = 0}
spdX = spdX + aclMov*(tempo) - aclFrc*(tempo);
然而,当我尝试这样做时,输出响应为“属性 repeat not found on flash.events.KeyboardEvent and there is no default value”。我认为这是因为 KeyboardEvent.repeat 没有在我使用的媒体中定义。无论如何,我是否可以重现 KeyboardEvent.repeat 的 相同效果 ,也许是通过创建一个模仿它会做的事情的函数?
提前致谢。
(编辑 1)
我开始为我的澄清不足以及我对这个主题的无知表示歉意,因为我在 as3 方面还不是初学者,而且我还没有正确地介绍我读过的许多术语。
因此,感谢评论的有意义的贡献,我已经大致了解了我需要采取什么样的解决方法来替代 KeyboardEvent.repeat。与问题相关的代码还有其他部分:
stage.addEventListener(KeyboardEvent.KEY_DOWN,pressKey)
function pressKey (Event){
(...)
if(Event.keyCode == (Keyboard.A)) {left = true;}
(...)
}
stage.addEventListener(KeyboardEvent.KEY_UP,releaseKey)
function releaseKey (Event){
(...)
if(Event.keyCode == (Keyboard.A)) {left = false;}
(...)
}
代码就是这样设计的。有人建议我使用getTimer()方法来记录事件KEY_DOWN发生的时刻,当KEY_UP[=46时停止=] 生效。问题是,我如何增加代码以使其区分这两个事件,更具体地说,我如何调整 ENTER_FRAME 事件,以便区分它们仍然有效吗? 顺便说一下,这是其中最相关的部分:
addEventListener(Event.ENTER_FRAME,walk);
function walk(Event) {
if(left) {
(...)
char.x -= spdX;
(...)
}
我假设代码一直运行到现在,因为随着 "left" 的状态不断在 "true" 和 "false" 之间切换,if 重复满足条件,导致角色移动。但是,如果我尝试使条件依赖于 "left" 在 "true" 停留一段时间,代码就会变得与自身不兼容。
简而言之,它带来了如何适配 "KEY_[]" 事件侦听器和 "walk" 函数一起工作的问题,在使用 getTimer() 方法时,一起工作。
再次感谢。
我相信这在某种程度上是不言自明的。
stage.addEventListener(KeyboardEvent.KEY_DOWN, onDown);
stage.addEventListener(KeyboardEvent.KEY_UP, onUp);
addEventListener(Event.ENTER_FRAME, onFrame);
var pressedKeyA:int;
// Never name variables and arguments with the same name
// as existing classes, however convenient that might seem.
function onDown(e:KeyboardEvent):void
{
if (e.keyCode == Keyboard.A)
{
// Let's record the moment it was pressed.
pressedKeyA = getTimer();
}
}
function onUp(e:KeyboardEvent):void
{
if (e.keyCode == Keyboard.A)
{
// Mark the key as not pressed.
pressedKeyA = 0;
}
}
function onFrame(e:Event):void
{
// It is true if it is not 0.
if (pressedKeyA)
{
// That's how long it has been pressed. In milliseconds.
var pressedFor:int = getTimer() - pressedKeyA;
// Change the position with regard to it.
// For example 1 base + 1 per second.
char.x -= 1 + pressedFor / 1000;
}
}