as3键盘游戏控制对角线和多个按键

时间:2013-09-06 04:44:55

标签: actionscript-3 flash user-interface keyboard controls

我已经接受了垂直2D射击游戏的教程,并且正在用我学到的东西扩展游戏。

键盘控制已经准备就绪,并且缺少一些解释,所以我遇到了一些问题:

已解决(参见第二个回答)1 - 我的船控制与ARROW-Keys和SPACE用于发射子弹(限制为X / fps)

控制船上/下/左/右和对角线工作正常除非同时按下(或保持)SPACE,当按下SPACE时,船只能上/下/左/右和对角向上移动/右

通过更改SPACE,可以解决此问题。 SHIFT或CONTROL,当按下火键时允许所有方向的对角线移动

我真的很想知道为什么会这样,如果可以使用SPACE解决这个问题

已解决,请参阅此帖末尾的编辑 2 - 我添加了一个升级游戏,它将导弹添加到船上,因为我会像常规子弹一样有不同的火力使用不同的钥匙射击导弹。

使用不同的钥匙添加导弹(如下面的示例代码中所示),除了我无法同时发射子弹(当前为SHIFT)和导弹(当前为CONTROL)

有什么办法可以让不同的按键同时按下它们吗?

3 - 我可以在示例代码中将密钥的常量名称更改为密钥代码吗?

抱歉英文不好

我的密钥类AS3:

import flash.display.Stage;
import flash.events.Event;
import flash.events.KeyboardEvent;

public class Key {

    private static var initialized:Boolean = false;
    private static var keysDown:Object = new Object();  // stores key codes of all keys pressed

    public static function initialize(stage:Stage) {
        if (!initialized) {
            // assign listeners for key presses and deactivation of the player
            stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
            stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased);
            stage.addEventListener(Event.DEACTIVATE, clearKeys);

            // mark initialization as true so redundant
            // calls do not reassign the event handlers
            initialized = true;
        }
    }


    public static function isDown(keyCode:uint):Boolean 
    {
        return Boolean(keyCode in keysDown);
    }


    private static function keyPressed(event:KeyboardEvent):void {
        keysDown[event.keyCode] = true;
    }


    private static function keyReleased(event:KeyboardEvent):void {
        if (event.keyCode in keysDown) {
            delete keysDown[event.keyCode];
        }
    }


    private static function clearKeys(event:Event):void {
        // clear all keys in keysDown since the player cannot detect keys being pressed or released when not focused
        keysDown = new Object();
    }
}

}

我的船只类中处理移动和射击的代码部分:

    function move(e:Event) {


        if (Key.isDown(Keyboard.RIGHT)) {
            this.x = this.x + velocity;
        }
        if (Key.isDown(Keyboard.LEFT)) {
            this.x = this.x - velocity;
        }
        if (Key.isDown(Keyboard.UP)) {
            this.y = this.y - velocity;
        }
        if (Key.isDown(Keyboard.DOWN)) {
            this.y = this.y + velocity;
        }
        if (Key.isDown(Keyboard.CONTROL)&& shootLimiter > 50 ) {
            {
                            shootLimiter = 0;
            var b = new Missile();
            stage.addChild(b);
            b.x = this.x;
            b.y = this.y -28;
            }

        }
        if (Key.isDown(Keyboard.SHIFT)&& shootLimiter > 20 ) {
            shootLimiter = 0;               
            var a = new Bullet();
            stage.addChild(a);
            a.x = this.x;
            a.y = this.y -28;
        }

    }

修改 Sjeesh我现在觉得很蠢,经过几天的修补和在这里发布我的问题后,我找到了解决最大问题的解决方案(No.2)我自己:

我似乎忽略了在ENTERFRAME事件中添加到shootlimiter变量+1的一行代码

在子弹和导弹的MOVE事件中以不同的值尝试此shootlimiter变量,导致其中只有1个工作时间

我基本上复制了shootlimiter变量的整个逻辑并将其添加为导弹限制器,现在用于导弹

同时按下CONTROL并SHIFT它现在可以射击两者,但是我也改变了子弹和导弹一起按SHIFT一起射击,但速度不同

关于SPACE和有限的对角线移动的问题,当它被按下是一个小问题,也使用键码而不是常数名称我已经找到了一些好的信息,但我会留下两个问题,虽然答案没有看起来很重要了

2 个答案:

答案 0 :(得分:0)

您应该重写密钥事件处理代码。当你得到你想要的关键事件时,只需设置一些标志(变量)。例如isUp = true。在获得帧的所有关键事件后,您可以在一个地方处理所有这些标志。即播放器按下向上和向左你设置isUp = true和isLeft = true。进一步在输入框架上,您可以向上和向左移动船舶(对角线移动)。

答案 1 :(得分:0)

虽然可能有点整洁,正如@shubniggurath建议的那样,我在你的代码中看不到任何立即跳出来作为这种行为的罪魁祸首。

您使用的是哪种品牌/品牌/型号的键盘?这可能只是键盘重影,在这种情况下,你无法以编程方式修复它。

http://www.microsoft.com/appliedsciences/antighostingexplained.mspx

https://gaming.stackexchange.com/questions/6669/how-do-i-remove-the-limit-on-pc-keyboard-button-presses