Haxe+OpenFL->Neko,MouseEvent.xxxKey 始终为 false
Haxe+OpenFL->Neko, MouseEvent.xxxKey always false
我正在使用 Haxe+OpenFL 制作游戏。我以前曾经针对过 js,然后我切换到 neko 并且以下构造停止工作:
if(e.shiftKey)
do smth
Ofc 自从更改目标后,我没有更改此代码块,也没有更改上下文。出了什么问题?
P. S. 跟踪显示,按住 alt、ctrl 或 shift 键不会更改 MouseEvent 对象的相应属性
基于this link,曾经是个问题,两年前修复了。奇怪的是,我的测试显示它仍然不起作用。
这 class 证明它可以在 js 中正常工作,但在 neko 中不能。
class Main extends Sprite
{
public function new()
{
super();
var s:Sprite = new Sprite();
s.graphics.beginFill(0xff0000);
s.graphics.drawCircle(100, 100, 200);
s.graphics.endFill();
addChild(s);
//testing a simple click event
s.addEventListener(MouseEvent.CLICK, OnClick);
//testing wheel events, as I read somewhere it could a been a bug in earlier versions
s.addEventListener(MouseEvent.MOUSE_WHEEL, OnWheel);
//testing click events on the stage object, in case it acted differently
addEventListener(MouseEvent.CLICK, OnStageClick);
}
private function OnStageClick(e:MouseEvent):Void
{
trace(e.shiftKey);
}
private function OnWheel(e:MouseEvent):Void
{
trace(e.shiftKey);
}
private function OnClick(e:MouseEvent):Void
{
trace(e.shiftKey);
}
}
另一种解决方案是使用 openfl.events.KeyboardEvent
并注意 shift 键何时向上或向下作为布尔值(注意 shift 的键码是 16)。这个例子在我的测试中工作正常。
class Main extends Sprite
{
var shiftIsPressed:Bool = false;
public function new()
{
super();
stage.addEventListener(KeyboardEvent.KEY_DOWN, OnDown);
stage.addEventListener(KeyboardEvent.KEY_UP, OnUp);
stage.addEventListener(MouseEvent.CLICK, OnClick);
}
private function OnUp(e:KeyboardEvent):Void
{
if (e.keyCode == 16)
{
shiftIsPressed = false;
}
}
private function OnDown(e:KeyboardEvent):Void
{
if (e.keyCode == 16)
{
shiftIsPressed = true;
}
}
private function OnClick(e:MouseEvent):Void
{
if (shiftIsPressed)
{
trace('Click!');
}
}
}
更新
由于我一直使用前面提到的键盘事件技巧,所以我忽略了它在 C++ 中也不起作用的事实。我想这两个目标使用了一些自定义事件系统并且有人忘记将修改键注册到创建的事件。
更新 2(9 月 22 日)
我正在使用 Haxe+OpenFL 制作游戏。我以前曾经针对过 js,然后我切换到 neko 并且以下构造停止工作:
if(e.shiftKey)
do smth
Ofc 自从更改目标后,我没有更改此代码块,也没有更改上下文。出了什么问题?
P. S. 跟踪显示,按住 alt、ctrl 或 shift 键不会更改 MouseEvent 对象的相应属性
基于this link,曾经是个问题,两年前修复了。奇怪的是,我的测试显示它仍然不起作用。
这 class 证明它可以在 js 中正常工作,但在 neko 中不能。
class Main extends Sprite
{
public function new()
{
super();
var s:Sprite = new Sprite();
s.graphics.beginFill(0xff0000);
s.graphics.drawCircle(100, 100, 200);
s.graphics.endFill();
addChild(s);
//testing a simple click event
s.addEventListener(MouseEvent.CLICK, OnClick);
//testing wheel events, as I read somewhere it could a been a bug in earlier versions
s.addEventListener(MouseEvent.MOUSE_WHEEL, OnWheel);
//testing click events on the stage object, in case it acted differently
addEventListener(MouseEvent.CLICK, OnStageClick);
}
private function OnStageClick(e:MouseEvent):Void
{
trace(e.shiftKey);
}
private function OnWheel(e:MouseEvent):Void
{
trace(e.shiftKey);
}
private function OnClick(e:MouseEvent):Void
{
trace(e.shiftKey);
}
}
另一种解决方案是使用 openfl.events.KeyboardEvent
并注意 shift 键何时向上或向下作为布尔值(注意 shift 的键码是 16)。这个例子在我的测试中工作正常。
class Main extends Sprite
{
var shiftIsPressed:Bool = false;
public function new()
{
super();
stage.addEventListener(KeyboardEvent.KEY_DOWN, OnDown);
stage.addEventListener(KeyboardEvent.KEY_UP, OnUp);
stage.addEventListener(MouseEvent.CLICK, OnClick);
}
private function OnUp(e:KeyboardEvent):Void
{
if (e.keyCode == 16)
{
shiftIsPressed = false;
}
}
private function OnDown(e:KeyboardEvent):Void
{
if (e.keyCode == 16)
{
shiftIsPressed = true;
}
}
private function OnClick(e:MouseEvent):Void
{
if (shiftIsPressed)
{
trace('Click!');
}
}
}
更新
由于我一直使用前面提到的键盘事件技巧,所以我忽略了它在 C++ 中也不起作用的事实。我想这两个目标使用了一些自定义事件系统并且有人忘记将修改键注册到创建的事件。
更新 2(9 月 22 日)