【问题标题】:MOUSE_DOWN and MOUSE_UP not dispatching for custom SpriteMOUSE_DOWN 和 MOUSE_UP 不调度自定义 Sprite
【发布时间】:2014-08-17 06:54:18
【问题描述】:

我创建了一个自定义 Sprite 对象,它不调度 MouseEvent.MOUSE_DOWN 或 MouseEvent.MOUSE_UP 事件。它正在正确调度 MouseEvent.MOUSE_MOVE 事件。

所有事件监听器都经过验证注册。

如果这是一个常见或过于简单的问题,我深表歉意,但我花了最后一个小时在 Google 上搜索和阅读 StackOverflow 以寻找适合我情况的问题或答案,但根本没有找到。据我所知,Sprite 是一个 InteractiveObject,因此应该调度所有这三个事件,而不仅仅是 MouseEvent.MOUSE_MOVE 事件。

类声明:

import flash.display.*;
import flash.events.*;
import flash.geom.*;

public class CustomSprite extends Sprite {

ma​​in.as 中的对象初始化

    var circle:CustomSprite = new CustomSprite();
    circle.graphics.lineStyle(3,0x00FF00);
    circle.graphics.beginFill(0x0000FF,.5);
    circle.graphics.drawCircle(0,0,50);
    circle.graphics.endFill();
    circle.x = 100;
    circle.y = 100;

在构造函数中注册事件监听器:

addEventListener(MouseEvent.MOUSE_DOWN,mouseDownListener);
if (hasEventListener(MouseEvent.MOUSE_DOWN)) trace("MOUSE_DOWN listener exists");

addEventListener(MouseEvent.MOUSE_UP,mouseUpListener);
if (hasEventListener(MouseEvent.MOUSE_UP)) trace("MOUSE_UP listener exists");

addEventListener(MouseEvent.MOUSE_MOVE,mouseMoveListener);
if (hasEventListener(MouseEvent.MOUSE_MOVE)) trace("MOUSE_MOVE listener exists");

事件监听器注册输出:

MOUSE_DOWN listener exists
MOUSE_UP listener exists
MOUSE_MOVE listener exists

作为 CustomSprite 类一部分的侦听器函数:

    private function mouseDownListener(e:MouseEvent):void {
        trace("mouseDownListener");
    }

    private function mouseUpListener(e:MouseEvent):void {
        trace("mouseUpListener");
    }

    private function mouseMoveListener(e:MouseEvent):void {
        trace("mouseMoveListener");
    }

将鼠标悬停在对象上并单击几次后的输出:

mouseMoveListener
mouseMoveListener
mouseMoveListener
mouseMoveListener

提前感谢您提供的任何帮助 - 非常感谢!

【问题讨论】:

  • 可以添加更多上下文吗?
  • 我在main.as中添加了对象的初始化方式。还有什么其他上下文会有所帮助?
  • 你能提供更多关于精灵类本身的细节吗?你的实施?您的 CustomSprite 可能会导致“mouseDown”和“mouseUp”侦听器出现问题。
  • 这正是您添加事件侦听器的方式吗?确切地?没有 .addEventListener?
  • 看看我发布的内容,如果你已经这样做了,我会删除它。

标签: actionscript-3 events


【解决方案1】:

从您提供的来源看来,您没有将事件侦听器添加到圈子本身。我测试的这个 sn-p 有效,前提是我没有你的 CustomSprite,而只有 Sprite

var circle:CustomSprite = new CustomSprite();
circle.graphics.lineStyle(3,0x00FF00);
circle.graphics.beginFill(0x0000FF,.5);
circle.graphics.drawCircle(0,0,50);
circle.graphics.endFill();
circle.x = 100;
circle.y = 100;

circle.addEventListener(MouseEvent.MOUSE_DOWN, function(event:MouseEvent):void{
   trace("mouseDown");
});
circle.addEventListener(MouseEvent.MOUSE_UP, function(event:MouseEvent):void{
   trace("mouseUp");
});
circle.addEventListener(MouseEvent.MOUSE_MOVE, function(event:MouseEvent):void{
   trace("mouseMove");
});

【讨论】:

  • 我为造成的混乱道歉。我的 addEventListeners 在 CustomSprite 类的构造函数中,所以据我了解,它们被隐式传递给对象。
  • 为了确认这不是问题,我只是尝试在将圆形对象添加到显示层次结构后直接在 Main 中添加一个带有匿名函数的事件侦听器,但它仍然没有火。当我将一个直接添加到一个触发的阶段时,我也使用了正确的 MouseEvent。
  • 我刚刚接受了答案,因为从 Google 进来的人可能会得到它的帮助。无论如何,它开始像我一样工作。用魔法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-12
  • 1970-01-01
  • 2013-12-24
  • 2017-04-09
相关资源
最近更新 更多