可以在一个类中定义mousePressed吗?

时间:2011-05-03 18:00:14

标签: processing

我正在尝试创建一个名为InputManager的类来处理鼠标事件。这要求mousePressed包含在InputManager类中。

喜欢这样

class InputManager{
    void mousePressed(){
       print(hit);
    }
}
问题是,这不起作用。 mousePressed()似乎只在它在课外时起作用。

如何才能将这些函数很好地包含在类中?

3 个答案:

答案 0 :(得分:2)

试试这个:

主图中的

InputManager im;

void setup() {
im = new InputManager(this);
registerMethod("mouseEvent", im);

}

在InputManager类中:

class InputManager {
    void mousePressed(MouseEvent e) { 
         // mousepressed handling code here... 
    }

    void mouseEvent(MouseEvent e) {
       switch(e.getAction()) {
          case (MouseEvent.PRESS) : 
               mousePressed();
               break;
          case (MouseEvent.CLICK) :
               mouseClicked();
               break;
          // other mouse events cases here...
       }
    }
}

在PApplet中注册InputManger mouseEvent后,您无需调用它,并且会在draw()结束时调用每个循环。

答案 1 :(得分:0)

当然,但你有责任确保它被调用:

interface P5EventClass {
  void mousePressed();
  void mouseMoved();
  // ...
}

class InputManager implements P5EventClass {
  // we MUST implement mousePressed, and any other interface method
  void mousePressed() {
    // do things here
  }
}

// we're going to hand off all events to things in this list
ArrayList<P5EventClass> eventlisteners = new ArrayList<P5EventClass>();

void setup() {
  // bind at least one input manager, but maybe more later on.
  eventlisteners.add(new InputManager());
}

void draw() {
  // ...
}

void mousePressed() {
  // instead of handling input globally, we let
  // the event handling obejct(s) take care of it
  for(P5EventClass p5ec: eventlisteners) {
   p5ec.mousePressed();
  }
}

我个人也会通过显式传递事件变量来使它变得更紧,所以“void mousePressed(int x,int y);”在界面中然后调用“p5ec.mousePressed(mouseX,mouseY);”在草图体中,仅仅因为依赖于全局变量而不是局部变量会使您的代码容易出现并发错误。

答案 2 :(得分:0)

最简单的方法是:

class InputManager{
    void mousePressed(){
       print(hit);
    }
}

InputManager im = new InputManager();

void setup() {
   // ...
}

void draw() {
   // ...
}

void mousePressed() {
   im.mousePressed();
}

这可以解决您在课堂上使用变量作用域时遇到的任何问题。

注意:在类中,它甚至不必命名为mousePressed,只要在mousePressed主方法中调用它,就可以将它命名为任何名称。