浏览代码

Android: added pressure to TouchEvent, fixed trigger handling

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7577 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
kim..ng 14 年之前
父节点
当前提交
443e49925d

+ 26 - 5
engine/src/core/com/jme3/input/InputManager.java

@@ -40,6 +40,7 @@ import com.jme3.input.controls.KeyTrigger;
 import com.jme3.input.controls.MouseAxisTrigger;
 import com.jme3.input.controls.MouseButtonTrigger;
 import com.jme3.input.controls.TouchListener;
+import com.jme3.input.controls.TouchTrigger;
 import com.jme3.input.controls.Trigger;
 import com.jme3.input.event.InputEvent;
 import com.jme3.input.event.JoyAxisEvent;
@@ -606,6 +607,11 @@ public class InputManager implements RawInputListener {
             } else {
                 assert false;
             }
+            // larynx, 2011.06.10 - flag event as reusable because
+            // the android input uses a non-allocating ringbuffer which
+            // needs to know when the event is not anymore in inputQueue
+            // and therefor can be reused.
+            event.setConsumed();
         }
 
         inputQueue.clear();
@@ -645,17 +651,32 @@ public class InputManager implements RawInputListener {
 
     /**
      * Dispatches touch events to touch listeners
-     * @param evt
+     * @param evt The touch event to be dispatched to all onTouch listeners
      */
-    public void onTouchEventQueued(TouchEvent evt) {
-        for (Mapping mapping : mappings.values()) {
-            for (InputListener listener : mapping.listeners) {
+    public void onTouchEventQueued(TouchEvent evt) { 
+        ArrayList<Mapping> maps = bindings.get(TouchTrigger.getHash());
+        if (maps == null) {
+            return;
+        }
+
+        int size = maps.size();
+        for (int i = size - 1; i >= 0; i--) {
+            Mapping mapping = maps.get(i);
+            ArrayList<InputListener> listeners = mapping.listeners;
+            int listenerSize = listeners.size();
+            for (int j = listenerSize - 1; j >= 0; j--) {
+                InputListener listener = listeners.get(j);
                 if (listener instanceof TouchListener) {
                     ((TouchListener) listener).onTouch(mapping.name, evt, frameTPF); 
                 }
             }
-        } 
+        }               
     }
+    
+    /**
+     * Receives the touch events from the touch hardware via the input interface
+     * @param evt The touch Event received
+     */
     @Override
     public void onTouchEvent(TouchEvent evt) {
         if (!eventsPermitted) {

+ 5 - 1
engine/src/core/com/jme3/input/controls/TouchTrigger.java

@@ -40,11 +40,15 @@ public class TouchTrigger implements Trigger {
     
     @Override
     public int hashCode(){
-        return 0xfedcba98;
+        return getHash();
     }
     
     @Override
     public String getName() {
         return "TouchInput";
     }
+    
+    public static int getHash() {
+        return 0xfedcba98;
+    }
 }

+ 14 - 12
engine/src/core/com/jme3/input/event/TouchEvent.java

@@ -38,24 +38,23 @@ import com.jme3.math.Vector2f;
 /**
  * <code>TouchEvent</code> represents a single event from multi-touch input devices
  * @author larynx
- *
  */
 public class TouchEvent extends InputEvent
 {
     public static enum Type 
     {
         /**
-         * Touch down event, fields: posX, posY
+         * Touch down event, fields: posX, posY, pressure
          */
         DOWN,
         
         /**
-         * Move/Drag event, fields: posX, posY, deltaX, deltaY
+         * Move/Drag event, fields: posX, posY, deltaX, deltaY, pressure
          */
         MOVE,
         
         /**
-         * Touch up event, fields: posX, posY
+         * Touch up event, fields: posX, posY, pressure
          */
         UP,
 
@@ -111,6 +110,7 @@ public class TouchEvent extends InputEvent
     private float posY;
     private float deltaX;
     private float deltaY;
+    private float pressure;
     
     // Used only with KEY* events
     private int keyCode;
@@ -132,11 +132,7 @@ public class TouchEvent extends InputEvent
     
     public void set(Type type)
     {
-        this.type = type;
-        this.posX = 0f;
-        this.posY = 0f;
-        this.deltaX = 0f;
-        this.deltaY = 0f;
+        set(type, 0f, 0f, 0f, 0f);
     }
     
     public void set(Type type, float x, float y, float deltax, float deltay)
@@ -146,6 +142,7 @@ public class TouchEvent extends InputEvent
         this.posY = y;
         this.deltaX = deltax;
         this.deltaY = deltay;
+        consumed = false;
     }
 
 
@@ -173,10 +170,15 @@ public class TouchEvent extends InputEvent
     {
         return deltaY;
     }
-
-    public Vector2f getDelta()
+    
+    public float getPressure() 
+    {
+        return pressure;
+    }
+    
+    public void setPressure(float pressure) 
     {
-        return new Vector2f(deltaX,deltaY);
+        this.pressure = pressure;
     }
     
     public int getPointerId()