Explorar o código

Merge pull request #86 from blackberry-gaming/next

Next
Sean Paul Taylor %!s(int64=13) %!d(string=hai) anos
pai
achega
614576a044
Modificáronse 5 ficheiros con 55 adicións e 20 borrados
  1. 4 2
      README.md
  2. BIN=BIN
      gameplay-template/icon.png
  3. BIN=BIN
      gameplay/res/icon.png
  4. BIN=BIN
      gameplay/res/icon.psd
  5. 51 18
      gameplay/src/PlatformAndroid.cpp

+ 4 - 2
README.md

@@ -10,10 +10,12 @@ An open-source, cross-platform 3D native game framework making it easy to learn
 - Microsoft Windows 7 (using Microsoft Visual Studio 2010)
 - Apple MacOS X (using Apple XCode 4.3.2)
 
-## Roadmap for 'next' branch
-- Lua Scripting
+## Roadmap for 'next' branch
+- Shadows
+- Lua Script Bindings
 - Terrain
 - Editor
+- Performance/Optimizations
 
 ## Licence
 The project is open sourced under the Apache 2.0 license.

BIN=BIN
gameplay-template/icon.png


BIN=BIN
gameplay/res/icon.png


BIN=BIN
gameplay/res/icon.psd


+ 51 - 18
gameplay/src/PlatformAndroid.cpp

@@ -42,6 +42,7 @@ const ASensor* __accelerometerSensor;
 
 static int __orientationAngle = 90; // Landscape by default.
 static bool __multiTouch = false;
+static int __primaryTouchId = -1;
 bool __displayKeyboard = false;
 
 static const char* __glExtensions;
@@ -532,25 +533,57 @@ static int32_t engine_handle_input(struct android_app* app, AInputEvent* event)
 {
     if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION)
     {
-        int32_t data = AMotionEvent_getAction(event);
-        Touch::TouchEvent touchEvent;
-        size_t pointerCount = AMotionEvent_getPointerCount(event);
-        for (size_t i = 0; i < pointerCount; ++i)
+        int32_t action = AMotionEvent_getAction(event);
+        size_t pointerIndex;
+        size_t pointerId;
+        size_t pointerCount;
+        switch (action & AMOTION_EVENT_ACTION_MASK)
         {
-            switch (data & AMOTION_EVENT_ACTION_MASK)
-            {
-                case AMOTION_EVENT_ACTION_DOWN:
-                    touchEvent = Touch::TOUCH_PRESS;
-                    break;
-                case AMOTION_EVENT_ACTION_UP:
-                    touchEvent = Touch::TOUCH_RELEASE;
-                    break;
-                case AMOTION_EVENT_ACTION_MOVE:
-                    touchEvent = Touch::TOUCH_MOVE;
-                    break;
-            }
-            size_t pointerId = AMotionEvent_getPointerId(event, i);
-            gameplay::Platform::touchEventInternal(touchEvent, AMotionEvent_getX(event, i), AMotionEvent_getY(event, i), pointerId);
+            case AMOTION_EVENT_ACTION_DOWN:
+                // Primary pointer down
+                pointerId = AMotionEvent_getPointerId(event, 0);
+                gameplay::Platform::touchEventInternal(Touch::TOUCH_PRESS, AMotionEvent_getX(event, 0), AMotionEvent_getY(event, 0), pointerId);
+                __primaryTouchId = pointerId;
+                break;
+            case AMOTION_EVENT_ACTION_UP:
+                pointerId = AMotionEvent_getPointerId(event, 0);
+                if (__multiTouch || __primaryTouchId == pointerId)
+                {
+                    gameplay::Platform::touchEventInternal(Touch::TOUCH_RELEASE, AMotionEvent_getX(event, 0), AMotionEvent_getY(event, 0), pointerId);
+                }
+                __primaryTouchId = -1;
+                break;
+            case AMOTION_EVENT_ACTION_POINTER_DOWN:
+                // Non-primary pointer down
+                if (__multiTouch)
+                {
+                    pointerIndex = (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
+                    pointerId = AMotionEvent_getPointerId(event, pointerIndex);
+                    gameplay::Platform::touchEventInternal(Touch::TOUCH_PRESS, AMotionEvent_getX(event, pointerIndex), AMotionEvent_getY(event, pointerIndex), pointerId);
+                }
+                break;
+            case AMOTION_EVENT_ACTION_POINTER_UP:
+                pointerIndex = (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
+                pointerId = AMotionEvent_getPointerId(event, pointerIndex);
+                if (__multiTouch || __primaryTouchId == pointerId)
+                {
+                    gameplay::Platform::touchEventInternal(Touch::TOUCH_RELEASE, AMotionEvent_getX(event, pointerIndex), AMotionEvent_getY(event, pointerIndex), pointerId);
+                }
+                if (__primaryTouchId == pointerId)
+                    __primaryTouchId = -1;
+                break;
+            case AMOTION_EVENT_ACTION_MOVE:
+                // ACTION_MOVE events are batched, unlike the other events.
+                pointerCount = AMotionEvent_getPointerCount(event);
+                for (size_t i = 0; i < pointerCount; ++i)
+                {
+                    pointerId = AMotionEvent_getPointerId(event, i);
+                    if (__multiTouch || __primaryTouchId == pointerId)
+                    {
+                        gameplay::Platform::touchEventInternal(Touch::TOUCH_MOVE, AMotionEvent_getX(event, i), AMotionEvent_getY(event, i), pointerId);
+                    }
+                }
+                break;
         }
         return 1;
     }