[英]AS3 - Issues with functions of instances
我有三个正在使用的类,为了便于阅读已将其缩短,省去了包装和进口。 MainClass
是我的文档类, Player
是连接到一个影片剪辑的类,并且KeyHandler
是一类我使用包含我的按键的功能。 首先,代码
public class TestMain extends Sprite
{
public var keyHandler:KeyHandler = new KeyHandler();
public var timer:Timer = new Timer(30);
public var player:Player = new Player();
public function TestMain()
{
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyHandler.KeyPress);
stage.addEventListener(KeyboardEvent.KEY_UP, keyHandler.KeyRelease);
timer.addEventListener(TimerEvent.TIMER, onTick);
timer.start();
stage.addChild(player);
}
public function onTick(timerEvent:TimerEvent)
{
player.Move();
}
}
播放器类
public class Player extends Sprite
{
public var keyHandler:KeyHandler = new KeyHandler();
public function Player()
{
}
public function Move():void
{
trace("this works");
if (keyHandler.upKeyIsPressed)
{
trace("this doesnt work")
}
}
}
KeyHandler类..
public class KeyHandler extends Sprite
{
public var upKeyIsPressed:Boolean = false;
public function KeyHandler()
{
}
public function KeyPress(keyboardEvent:KeyboardEvent)
{
if (keyboardEvent.keyCode == Keyboard.UP)
{
upKeyIsPressed = true;
}
}
public function KeyRelease(keyboardEvent:KeyboardEvent)
{
if (keyboardEvent.keyCode == Keyboard.UP)
{
upKeyIsPressed = false;
}
}
}
按住向上键不会跟踪任何内容,但是Move
功能可以。 我应该将KeyHandler
静态,还是有一个简单的解决方法? 这是不好的做法吗?
这是我评论中的选项1
TestMain
public class TestMain extends Sprite
{
public var keyHandler:KeyHandler = new KeyHandler();
public var timer:Timer = new Timer(30);
public var player:Player = new Player();
public function TestMain()
{
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyHandler.KeyPress);
stage.addEventListener(KeyboardEvent.KEY_UP, keyHandler.KeyRelease);
timer.addEventListener(TimerEvent.TIMER, onTick);
timer.start();
player.keyHandler = keyHandler;
stage.addChild(player);
}
public function onTick(timerEvent:TimerEvent)
{
player.Move();
}
}
播放器
public class Player extends Sprite
{
public var keyHandler:KeyHandler;
public function Player()
{
}
public function Move():void
{
trace("this works");
if (keyHandler.upKeyIsPressed)
{
trace("this should be working now")
}
}
}
密钥处理程序
public class KeyHandler extends Sprite
{
public var upKeyIsPressed:Boolean = false;
public function KeyHandler()
{
}
public function KeyPress(keyboardEvent:KeyboardEvent)
{
if (keyboardEvent.keyCode == Keyboard.UP)
{
upKeyIsPressed = true;
}
}
public function KeyRelease(keyboardEvent:KeyboardEvent)
{
if (keyboardEvent.keyCode == Keyboard.UP)
{
upKeyIsPressed = false;
}
}
}
选项2进行“ Singleton”类型的设置,您可以通过静态方法获取该类的实例。 在这种情况下,整个类仅使用一个实例,不需要将实例传递给本身实际上不需要其句柄的对象。 在我对OP的评论中的链接中,我讨论了用于强制执行模式的选项,因此不会意外生成新实例,我只是在这里使用一个简单的选项,它会导致运行时错误:
public class KeyHandler extends Sprite
{
public var upKeyIsPressed:Boolean = false;
public static var SINGLETON:KeyHandler = new KeyHandler();
public static function getInstance():KeyHandler
{
return SINGLETON;
}
public function KeyHandler()
{
if(SINGLETON)
throw new Error("There can be only one!!!");
}
public function KeyPress(keyboardEvent:KeyboardEvent)
{
if (keyboardEvent.keyCode == Keyboard.UP)
{
upKeyIsPressed = true;
}
}
public function KeyRelease(keyboardEvent:KeyboardEvent)
{
if (keyboardEvent.keyCode == Keyboard.UP)
{
upKeyIsPressed = false;
}
}
}
播放器
public class Player extends Sprite
{
public var keyHandler:KeyHandler = KeyHandler.getInstance();
public function Player()
{
}
public function Move():void
{
trace("this works");
if (keyHandler.upKeyIsPressed)
{
trace("this should be working now")
}
}
}
TestMain
public class TestMain extends Sprite
{
public var keyHandler:KeyHandler = KeyHandler.getInstance();
public var timer:Timer = new Timer(30);
public var player:Player = new Player();
public function TestMain()
{
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyHandler.KeyPress);
stage.addEventListener(KeyboardEvent.KEY_UP, keyHandler.KeyRelease);
timer.addEventListener(TimerEvent.TIMER, onTick);
timer.start();
player.keyHandler = keyHandler;
stage.addChild(player);
}
public function onTick(timerEvent:TimerEvent)
{
player.Move();
}
}
这是强制执行Singleton的另一种方法,该方法会导致编译时错误,因此您可以在前面看到问题:
http://blog.pixelbreaker.com/actionscript-3-0/as30-better-singletons
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.