我已经学习了垂直 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 和按下时有限的对角线移动的问题是次要的问题,对于使用键码而不是常量名称,我找到了一些很好的信息,但我将保留这两个问题,尽管答案似乎并不那么重要不再