我正在用Haxe+OpenFL制作一个游戏。我有一次瞄准了js,然后切换到neko,下面的构造停止了工作:
if(e.shiftKey)
do smthOfc自从更改目标以来,我没有更改这段代码,也没有更改上下文。哪里出问题了?
跟踪显示,持有alt、ctrl或shift键不会改变MouseEvent对象的相应属性。
发布于 2017-09-21 00:09:56
基于此链接,它曾经是一个问题,但两年前就已经解决了。奇怪的是,我的测试显示它仍然不起作用。
这个类演示了它在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日)
https://stackoverflow.com/questions/46328096
复制相似问题