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

Posted

技术标签:

【中文标题】as3键盘游戏控制对角线和多个按键【英文标题】:as3 keyboard game control diagonal and multiple keypresses 【发布时间】:2013-09-06 04:44:54 【问题描述】:

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

键盘控件已经提供,但缺少一些解释,所以我遇到了一些问题:

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

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

这个问题可以通过改变 SPACE 来解决,例如SHIFT 或 CONTROL 允许在按下火键时沿所有方向对角线移动

我真的很想知道为什么会发生这种情况,以及是否可以使用 SPACE 进行常规射击来解决此问题

已解决,请参阅本文末尾的编辑 2-我添加了一个升级游戏,可将导弹添加到船上,并且由于我的射速与普通子弹不同,因此我想使用不同的键来发射导弹。

添加具有不同键的导弹有效(如下面的示例代码),但我不能同时发射子弹(当前为 SHIFT)和导弹(当前为 CONTROL)

有什么办法可以让不同的按键同时触发?

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

抱歉英语不好

我的关键类 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;
        

    

编辑: 天哪,我现在觉得很愚蠢,经过几天的修补和在这里发布我的问题,我自己找到了最大问题(第 2 号)的解决方案:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

虽然它可能会更整洁一些,正如@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

【讨论】:

感谢您的参考,我也已经发现可能是硬件问题。(我的键盘顺便说一句是便宜的标准无品牌 USB 键盘)。关于整理代码,我知道代码远非最佳,但我想因为我使用了教程,所以当前代码的基础是为像我这样的菜鸟而编写的。我确实在这个过程中学到了很多东西,现在看到了很多“可以做得更好/更有效率”的东西,但这将是我的游戏完成后的第二步。 检查你的链接后回到这里,发现微软网站上那个简洁的应用程序可以测试按键/组合的。如果同时结合两个箭头键,似乎按住我的 SPACE 确实会引起一些重影,只有 UP 和 RIGHT 在按住 SPACE 时同时结合注册,所以我将您的答案标记为正确,因为它回答了我的问题帖子中的第 1 号问题,谢谢! 是的,代码应该按原样工作,这只是一个偏好问题,它实际上是如何布局的。自从进入游戏编程领域以来,我就注意到人们倾向于避免使用 SPACE 并使用 Z、X 或 C 来进行大多数输入。感谢和良好的编码!【参考方案2】:

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

【讨论】:

问题是一切正常,直到我持有 SPACE(快速射击),然后我才能使用 1 个对角线方向(上/右)。使用 SHIFT 或 CONTROL“解决”该问题,但我同意我对关键事件几乎一无所知,并将在不久的将来对此进行更多研究

以上是关于as3键盘游戏控制对角线和多个按键的主要内容,如果未能解决你的问题,请参考以下文章

模拟按键控制游戏Python问题,怎么解决

九宫格数独游戏每行每列每条对角线之和都相等如何填数?

按键精灵,脚本,键盘代替鼠标,代码.

怎么设置键盘按键

拼字游戏

qt keypressevent()中的多个键