我刚刚开始学习动作脚本,并且为了帮助我习惯语法,我正在挑战自己创造一个简单的游戏,你是一个射击下降的圆圈。
出于某种原因,每当我尝试添加键盘事件监听器时,游戏都不会运行。
这是我的播放器文件。
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
public class Player extends Sprite
{
//Variables
private var playerRadius:Number = 50;
private var playerX:Number = 5;
private var playerY:Number = 5;
private var speed:Number = 0;
private var xvel:Number = 0;
public function Player()
{
init();
//Drawing
drawPlayer();
//Event Listeners
this.addEventListener(Event.ENTER_FRAME, updatePlayer);
stage.addEventListener(KeyboardEvent.KEY_DOWN, controlPlayer);
}
//Update
public function updatePlayer(event:Event):void{
this.x ++;
}
//Draw
private function drawPlayer():void{
graphics.beginFill(0xFF0000);
graphics.drawCircle(10,10,50);
graphics.endFill();
}
//Control
public function controlPlayer(event:KeyboardEvent):void{
if (event.keyCode == Keyboard.RIGHT) {
speed = 5;
}
}
}
}
使用此代码我只是得到一个白色屏幕,但如果我注释掉
stage.addEventListener(KeyboardEvent.KEY_DOWN, controlPlayer);
它有效,但我无法控制播放器。
我会感激任何帮助!
答案 0 :(得分:1)
使用您的代码我能够找出您的问题,最终证明您的代码存在一些问题。当您测试应用程序时,我很惊讶您没有在Flash“输出”面板中看到以下错误:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at Player()
at Player_fla::MainTimeline/frame1()
Player
的对象时,它尚未添加到舞台中,因此它无法访问stage
对象。Player
类知道它的一个实例被添加到舞台中,以便它确切地知道它何时应该注册键盘事件监听器。以下是应该解决这些问题的代码的更新版本:
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
public class Player extends Sprite
{
//Variables
private var playerRadius:Number = 50;
private var playerX:Number = 5;
private var playerY:Number = 5;
private var speed:Number = 0;
private var xvel:Number = 0;
public function Player()
{
init();
//Drawing
drawPlayer();
//Event Listeners
this.addEventListener(Event.ENTER_FRAME, updatePlayer);
this.addEventListener(Event.ADDED_TO_STAGE, initKeyboardListener);
}
public function initKeyboardListener(event:Event) {
stage.addEventListener(KeyboardEvent.KEY_DOWN, controlPlayer);
}
//Update
public function updatePlayer(event:Event):void{
this.x++;
}
//Draw
private function drawPlayer():void{
graphics.beginFill(0xFF0000);
graphics.drawCircle(10,10,50);
graphics.endFill();
}
//Control
public function controlPlayer(event:KeyboardEvent):void {
if (event.keyCode == Keyboard.RIGHT) {
this.speed = 5;
}
}
} // end class
} // end package
要使所有这些工作,请不要忘记将播放器对象添加到舞台上。我只能假设你已经这样做了,因为你没有共享任何代码显示你使用Player
类的位置,但这里有一个我所指的例子:
import Player;
var player:Player = new Player();
stage.addChild(player);
此外,键盘监听器只是改变speed
变量;但是,在代码中的任何其他地方都没有实现速度变量,因此在修复之前,您不会看到GUI中的差异。我验证了所有听众都在使用跟踪语句。