1

我已经学习了垂直 2D 射击游戏的教程,并正在用我所学的知识扩展游戏。

键盘控件已准备好提供,并且缺少一些解释,因此我遇到了一些问题:

已解决(见第二个答案) 1-我的船的控制与箭头键一起使用,空间用于发射子弹(限制为 X/fps)

控制船的上/下/左/右和对角线工作正常,除了同时按下(或按住)空间时,当按下空间时,船只能上/下/左/右和对角线上/右

这个问题是通过改变空格来解决的

我真的很想知道为什么会发生这种情况,以及是否可以使用 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,我现在觉得很愚蠢,经过几天的修补和在这里发布我的问题,我自己找到了解决最大问题(第 2 号)的方法:

看来我忽略了 ENTERFRAME 事件中添加到 shootlimiter 变量 +1 的 1 行代码

在 Bullet 和 Missile 的 MOVE 事件中以不同的值尝试此shootlimiter 变量导致其中只有一个在同一时间工作

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

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

关于 SPACE 和按下时有限的对角线移动的问题是次要的问题,对于使用键码而不是常量名称,我找到了一些很好的信息,但我将保留这两个问题,尽管答案似乎并不那么重要不再

4

2 回答 2

0

您应该重写您的关键事件处理代码。当您获得所需的关键事件时,只需设置一些标志(变量)。例如 isUp = true。在获得帧的所有关键事件后,您可以在一个地方处理所有这些标志。即玩家按下了向上和向左键,您设置了 isUp=true 和 isLeft=true。在进入框架的更远处,您可以向上和向左移动您的船(对角线移动)。

于 2013-09-06T13:38:54.283 回答
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

于 2013-09-06T14:04:30.803 回答