📄 sensoreventagent.java
字号:
} /** * Gets the <code>SensorButtonListener</code> implementations bound to * the given sensor and button. * * @param sensor the sensor of interest * @param button the button of interest * @return array of <code>SensorButtonListener</code> implementations * bound to the given sensor and button, or null */ public SensorButtonListener[] getSensorButtonListeners(Sensor sensor, int button) { if (sensor == null) throw new NullPointerException("\nsensor is null") ; if (button >= sensor.getSensorButtonCount()) throw new ArrayIndexOutOfBoundsException ("\nbutton " + button + " >= sensor button count " + sensor.getSensorButtonCount()) ; SensorBinding sb = getSensorBinding(sensor) ; if (sb == null) return null ; ArrayList listeners = new ArrayList() ; for (int i = 0 ; i < sb.buttonBindingsList.size() ; i++) { SensorButtonBinding sbb = (SensorButtonBinding)sb.buttonBindingsList.get(i) ; if (sbb.listeners[button] != null) listeners.add(sbb.listeners[button]) ; } if (listeners.size() == 0) return null ; else return (SensorButtonListener[])listeners.toArray (new SensorButtonListener[listeners.size()]) ; } /** * Remove the SensorButtonListener from the given SensorBinding. */ private void removeSensorButtonListener (SensorBinding sb, SensorButtonListener listener) { Iterator i = sb.buttonBindingsList.iterator() ; while (i.hasNext()) { int instanceCount = 0 ; SensorButtonBinding sbb = (SensorButtonBinding)i.next() ; for (int j = 0 ; j < sbb.listeners.length ; j++) { if (sbb.listeners[j] == listener) sbb.listeners[j] = null ; else if (sbb.listeners[j] != null) instanceCount++ ; } if (instanceCount == 0) { i.remove() ; } } listsDirty = true ; } /** * Remove the given <code>SensorButtonListener</code> binding from the * specified sensor. * * @param sensor the sensor from which to remove the listener * @param listener the listener to be removed */ public synchronized void removeSensorButtonListener (Sensor sensor, SensorButtonListener listener) { if (sensor == null) throw new NullPointerException("\nsensor is null") ; SensorBinding sb = getSensorBinding(sensor) ; if (sb == null) return ; removeSensorButtonListener(sb, listener) ; if (sb.buttonBindingsList.size() == 0 && sb.readBindingsList.size() == 0) removeSensorBinding(sensor) ; listsDirty = true ; } /** * Remove the given <code>SensorButtonListener</code> from all sensors. * * @param listener the listener to remove */ public synchronized void removeSensorButtonListener (SensorButtonListener listener) { Iterator i = bindingsList.iterator() ; while (i.hasNext()) { SensorBinding sb = (SensorBinding)i.next() ; removeSensorButtonListener(sb, listener) ; if (sb.buttonBindingsList.size() == 0 && sb.readBindingsList.size() == 0) { i.remove() ; } } listsDirty = true ; } /** * Creates a binding of the specified sensor to the given * <code>SensorReadListener</code>. The read listener is invoked * every time <code>dispatchEvents</code> is called and a button * listener is <i>not</i> invoked. * * @param sensor the sensor to be bound * @param readListener the <code>SensorReadListener</code> * implementation */ public synchronized void addSensorReadListener (Sensor sensor, SensorReadListener readListener) { if (sensor == null) throw new NullPointerException("\nsensor is null") ; SensorBinding sb = getSensorBinding(sensor) ; if (sb == null) { sb = new SensorBinding(sensor) ; bindingsList.add(sb) ; } sb.readBindingsList.add(readListener) ; listsDirty = true ; } /** * Gets the <code>SensorReadListeners</code> bound to the specified * sensor. * * @param sensor the sensor of interest * @return array of <code>SensorReadListeners</code> bound to the * given sensor, or null */ public SensorReadListener[] getSensorReadListeners(Sensor sensor) { if (sensor == null) throw new NullPointerException("\nsensor is null") ; SensorBinding sb = getSensorBinding(sensor) ; if (sb == null) return null ; else if (sb.readBindingsList.size() == 0) return null ; else return (SensorReadListener[])sb.readBindingsList.toArray (new SensorReadListener[sb.readBindingsList.size()]) ; } /** * Remove the SensorReadListener from the given SensorBinding. */ private void removeSensorReadListener (SensorBinding sb, SensorReadListener listener) { Iterator i = sb.readBindingsList.iterator() ; while (i.hasNext()) { if (((SensorReadListener)i.next()) == listener) i.remove() ; } listsDirty = true ; } /** * Remove the given <code>SensorReadListener</code> binding from the * specified sensor. * * @param sensor the sensor from which to remove the listener * @param listener the listener to be removed */ public synchronized void removeSensorReadListener (Sensor sensor, SensorReadListener listener) { if (sensor == null) throw new NullPointerException("\nsensor is null") ; SensorBinding sb = getSensorBinding(sensor) ; if (sb == null) return ; removeSensorReadListener(sb, listener) ; if (sb.buttonBindingsList.size() == 0 && sb.readBindingsList.size() == 0) removeSensorBinding(sensor) ; listsDirty = true ; } /** * Remove the given <code>SensorReadListener</code> from all sensors. * * @param listener the listener to remove */ public synchronized void removeSensorReadListener (SensorReadListener listener) { Iterator i = bindingsList.iterator() ; while (i.hasNext()) { SensorBinding sb = (SensorBinding)i.next() ; removeSensorReadListener(sb, listener) ; if (sb.buttonBindingsList.size() == 0 && sb.readBindingsList.size() == 0) { i.remove() ; } } listsDirty = true ; } /** * Remove all sensor listeners bound to the given sensor. */ public synchronized void removeSensorBinding(Sensor sensor) { Iterator i = bindingsList.iterator() ; while (i.hasNext()) { SensorBinding sb = (SensorBinding)i.next() ; if (sb.sensor == sensor) { i.remove() ; break ; } } listsDirty = true ; } /** * Returns an array of references to all sensors that have been bound * to listeners. * @return an array of sensors, or null if no sensors have been bound */ public Sensor[] getSensors() { if (bindingsList.size() == 0) return null ; Sensor[] s = new Sensor[bindingsList.size()] ; for (int i = 0 ; i < bindingsList.size() ; i++) s[i] = ((SensorBinding)bindingsList.get(i)).sensor ; return s ; } /** * Copies binding lists to arrays for event dispatch. This allows * listeners to add or remove themselves or other listeners safely. */ private synchronized void updateArrays() { bindings = (SensorBinding[])bindingsList.toArray (new SensorBinding[bindingsList.size()]) ; for (int i = 0 ; i < bindings.length ; i++) { bindings[i].updateArrays() ; } } /** * Reads all sensor button state and dispatches events to registered * button and read listeners. This method is intended to be called from * the <code>processStimulus</code> implementation of a * <code>Behavior</code> or the <code>pollAndProcessInput</code> method of * an event-driven implementation of <code>InputDevice</code>. */ public void dispatchEvents() { long t1 = t0 ; t0 = J3DTimer.getValue() ; if (listsDirty) { updateArrays() ; listsDirty = false ; } // Loop through all sensor bindings. for (int k = 0 ; k < bindings.length ; k++) { SensorBinding sb = bindings[k] ; Sensor s = sb.sensor ; Transform3D read = sb.read ; int[] buttons = sb.buttons ; int dragButton = 0 ; boolean callReadListeners = true ; boolean callDraggedListener = false ; // Get this sensor's readings. s.getRead(read) ; s.lastButtons(buttons) ; // Dispatch button listeners. for (int j = 0 ; j < sb.buttonBindings.length ; j++) { SensorButtonBinding sbb = sb.buttonBindings[j] ; for (int i = 0 ; i < buttons.length ; i++) { if (sbb.listeners[i] == null) continue ; // Check for button release. if (sbb.prevButtons[i]) { if (buttons[i] == 0) { e.set(source, SensorEvent.RELEASED, s, read, buttons, i, t0, t1) ; sbb.listeners[i].released(e) ; sbb.prevButtons[i] = false ; sbb.buttonsHandled-- ; } else { callDraggedListener = true ; dragButton = i ; } callReadListeners = false ; } // Check for button press. // Ignore multiple button presses if not enabled; // otherwise, one listener is bound to all buttons. else if (buttons[i] == 1) { if (sbb.buttonsHandled == 0 || sbb.multiButton) { e.set(source, SensorEvent.PRESSED, s, read, buttons, i, t0, t1) ; sbb.listeners[i].pressed(e) ; sbb.prevButtons[i] = true ; sbb.buttonsHandled++ ; callReadListeners = false ; } } } if (callDraggedListener) { // One drag event even if multiple buttons down. // Called after all pressed() and released() calls. e.set(source, SensorEvent.DRAGGED, s, read, buttons, SensorEvent.NOBUTTON, t0, t1) ; sbb.listeners[dragButton].dragged(e) ; } } // Dispatch read listeners. if (callReadListeners) { e.set(source, SensorEvent.READ, s, read, buttons, SensorEvent.NOBUTTON, t0, t1) ; for (int r = 0 ; r < sb.readBindings.length ; r++) { sb.readBindings[r].read(e) ; } } } } public String toString() { String s = "SensorEventAgent@" + Integer.toHexString(hashCode()) ; s += "\nsensor bindings:\n\n" ; for (int i = 0 ; i < bindingsList.size() ; i++) { s += ((SensorBinding)bindingsList.get(i)).toString() + "\n" ; } return s ; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -