Selaa lähdekoodia

Removes the need for games to call update() on forms and gamepads each frame,
and removes these calls from all tests and samples.
Also adds a few private methods to Gamepad in preparation for enabling gamepad control of UI forms.

Adam Blake 13 vuotta sitten
vanhempi
sitoutus
01401b8322

+ 9 - 0
gameplay/src/Form.h

@@ -48,6 +48,8 @@ class Theme;
 class Form : public Container
 class Form : public Container
 {
 {
     friend class Platform;
     friend class Platform;
+    friend class Game;
+    friend class Gamepad;
 
 
 public:
 public:
 
 
@@ -188,6 +190,11 @@ private:
      */
      */
     void updateBounds();
     void updateBounds();
 
 
+    /**
+     * Updates all visible, enabled forms.
+     */
+    static void updateInternal(float elapsedTime);
+
     /**
     /**
      * Propagate touch events to enabled forms.
      * Propagate touch events to enabled forms.
      *
      *
@@ -211,6 +218,8 @@ private:
      */
      */
     static bool mouseEventInternal(Mouse::MouseEvent evt, int x, int y, int wheelDelta);
     static bool mouseEventInternal(Mouse::MouseEvent evt, int x, int y, int wheelDelta);
 
 
+    static bool gamepadEventInternal(Gamepad::GamepadEvent evt, Gamepad* gamepad, unsigned int analogIndex);
+
     /**
     /**
      * Get the next highest power of two of an integer.  Used when creating framebuffers.
      * Get the next highest power of two of an integer.  Used when creating framebuffers.
      *
      *

+ 12 - 0
gameplay/src/Game.cpp

@@ -322,6 +322,12 @@ void Game::frame()
         // Update AI.
         // Update AI.
         _aiController->update(elapsedTime);
         _aiController->update(elapsedTime);
 
 
+        // Update gamepads.
+        Gamepad::updateInternal(elapsedTime);
+
+        // Update forms.
+        Form::updateInternal(elapsedTime);
+
         // Application Update.
         // Application Update.
         update(elapsedTime);
         update(elapsedTime);
 
 
@@ -348,6 +354,12 @@ void Game::frame()
     }
     }
 	else if (_state == Game::PAUSED)
 	else if (_state == Game::PAUSED)
     {
     {
+        // Update gamepads.
+        Gamepad::updateInternal(0);
+
+        // Update forms.
+        Form::updateInternal(0);
+
         // Application Update.
         // Application Update.
         update(0);
         update(0);
 
 

+ 57 - 7
gameplay/src/Gamepad.cpp

@@ -3,6 +3,8 @@
 #include "Game.h"
 #include "Game.h"
 #include "Button.h"
 #include "Button.h"
 #include "Platform.h"
 #include "Platform.h"
+#include "Form.h"
+#include "Joystick.h"
 
 
 namespace gameplay
 namespace gameplay
 {
 {
@@ -23,6 +25,7 @@ Gamepad::Gamepad(const char* formPath)
     for (int i = 0; i < 2; ++i)
     for (int i = 0; i < 2; ++i)
     {
     {
         _uiJoysticks[i] = NULL;
         _uiJoysticks[i] = NULL;
+        _triggers[i] = 0.0f;
     }
     }
 
 
     for (int i = 0; i < 20; ++i)
     for (int i = 0; i < 20; ++i)
@@ -47,6 +50,11 @@ Gamepad::Gamepad(GamepadHandle handle, unsigned int buttonCount, unsigned int jo
     {
     {
         _productString = productString;
         _productString = productString;
     }
     }
+
+    for (int i = 0; i < 2; ++i)
+    {
+        _triggers[i] = 0.0f;
+    }
 }
 }
 
 
 Gamepad::~Gamepad()
 Gamepad::~Gamepad()
@@ -181,6 +189,19 @@ Gamepad* Gamepad::getGamepad(unsigned int index, bool preferPhysical)
     return backupVirtual;
     return backupVirtual;
 }
 }
 
 
+Gamepad* Gamepad::getGamepad(GamepadHandle handle)
+{
+    unsigned int count = __gamepads.size();
+    for (unsigned int i = 0; i < count; ++i)
+    {
+        if (__gamepads[i]->_handle == handle)
+        {
+            return __gamepads[i];
+        }
+    }
+    return NULL;
+}
+
 Gamepad::ButtonMapping Gamepad::getButtonMappingFromString(const char* string)
 Gamepad::ButtonMapping Gamepad::getButtonMappingFromString(const char* string)
 {
 {
     if (strcmp(string, "A") == 0 || strcmp(string, "BUTTON_A") == 0)
     if (strcmp(string, "A") == 0 || strcmp(string, "BUTTON_A") == 0)
@@ -250,16 +271,18 @@ const char* Gamepad::getProductString() const
 
 
 void Gamepad::update(float elapsedTime)
 void Gamepad::update(float elapsedTime)
 {
 {
-    if (_form)
+    if (!_form)
     {
     {
-        if (_form->isEnabled())
-        {
-            _form->update(elapsedTime);
-        }
+        Platform::pollGamepadState(this);
     }
     }
-    else
+}
+
+void Gamepad::updateInternal(float elapsedTime)
+{
+    unsigned int size = __gamepads.size();
+    for (unsigned int i = 0; i < size; ++i)
     {
     {
-        Platform::pollGamepadState(this);
+        __gamepads[i]->update(elapsedTime);
     }
     }
 }
 }
 
 
@@ -356,4 +379,31 @@ Form* Gamepad::getForm() const
     return _form;
     return _form;
 }
 }
 
 
+void Gamepad::setButtons(unsigned int buttons)
+{
+    if (buttons != _buttons)
+    {
+        _buttons = buttons;
+        Form::gamepadEventInternal(BUTTONS_EVENT, this, 0);
+    }
+}
+
+void Gamepad::setJoystickValue(unsigned int index, float x, float y)
+{
+    if (_joysticks[index].x != x || _joysticks[index].y != y)
+    {
+        _joysticks[index].set(x, y);
+        Form::gamepadEventInternal(JOYSTICK_EVENT, this, index);
+    }
+}
+
+void Gamepad::setTriggerValue(unsigned int index, float value)
+{
+    if (_triggers[index] != value)
+    {
+        _triggers[index] = value;
+        Form::gamepadEventInternal(TRIGGER_EVENT, this, index);
+    }
+}
+
 }
 }

+ 21 - 7
gameplay/src/Gamepad.h

@@ -1,14 +1,16 @@
 #ifndef GAMEPAD_H_
 #ifndef GAMEPAD_H_
 #define GAMEPAD_H_
 #define GAMEPAD_H_
 
 
-#include "Form.h"
-#include "Joystick.h"
+#include "Vector2.h"
 
 
 namespace gameplay
 namespace gameplay
 {
 {
 
 
-class Platform;
 class Button;
 class Button;
+class Container;
+class Form;
+class Joystick;
+class Platform;
 
 
 /**
 /**
  * Defines an interface for handling gamepad input.
  * Defines an interface for handling gamepad input.
@@ -17,7 +19,6 @@ class Gamepad
 {
 {
     friend class Platform;
     friend class Platform;
     friend class Game;
     friend class Game;
-    friend class Control;
     friend class Button;
     friend class Button;
 
 
 public:
 public:
@@ -28,7 +29,10 @@ public:
     enum GamepadEvent
     enum GamepadEvent
     {
     {
         CONNECTED_EVENT,
         CONNECTED_EVENT,
-        DISCONNECTED_EVENT
+        DISCONNECTED_EVENT,
+        BUTTONS_EVENT,
+        JOYSTICK_EVENT,
+        TRIGGER_EVENT
     };
     };
 
 
     /**
     /**
@@ -196,6 +200,8 @@ private:
      */
      */
     Gamepad(const Gamepad& copy);
     Gamepad(const Gamepad& copy);
 
 
+    static void updateInternal(float elapsedTime);
+
     static Gamepad* add(GamepadHandle handle, 
     static Gamepad* add(GamepadHandle handle, 
                         unsigned int buttonCount, unsigned int joystickCount, unsigned int triggerCount,
                         unsigned int buttonCount, unsigned int joystickCount, unsigned int triggerCount,
                         unsigned int vendorId, unsigned int productId, 
                         unsigned int vendorId, unsigned int productId, 
@@ -211,8 +217,18 @@ private:
 
 
     static Gamepad* getGamepad(unsigned int index, bool preferPhysical = true);
     static Gamepad* getGamepad(unsigned int index, bool preferPhysical = true);
 
 
+    static Gamepad* getGamepad(GamepadHandle handle);
+
     static ButtonMapping getButtonMappingFromString(const char* string);
     static ButtonMapping getButtonMappingFromString(const char* string);
 
 
+    // The following setters are used by platforms when polling or handling gamepad events at the platform layer.
+    // They trigger gamepad state-changed events on forms as necessary.
+    void setButtons(unsigned int buttons);
+
+    void setJoystickValue(unsigned int index, float x, float y);
+
+    void setTriggerValue(unsigned int index, float value);
+
     /** 
     /** 
      * Destructor.
      * Destructor.
      */
      */
@@ -223,8 +239,6 @@ private:
      */
      */
     void bindGamepadControls(Container* container);
     void bindGamepadControls(Container* container);
 
 
-    static unsigned int getIndexFromMapping(Gamepad::ButtonMapping mapping);
-
     GamepadHandle _handle;        // The handle of the Gamepad.
     GamepadHandle _handle;        // The handle of the Gamepad.
     unsigned int _buttonCount;    // Number of buttons.
     unsigned int _buttonCount;    // Number of buttons.
     unsigned int _joystickCount;  // Number of joysticks.
     unsigned int _joystickCount;  // Number of joysticks.

+ 2 - 0
gameplay/src/lua/lua_Gamepad.cpp

@@ -3,8 +3,10 @@
 #include "lua_Gamepad.h"
 #include "lua_Gamepad.h"
 #include "Base.h"
 #include "Base.h"
 #include "Button.h"
 #include "Button.h"
+#include "Form.h"
 #include "Game.h"
 #include "Game.h"
 #include "Gamepad.h"
 #include "Gamepad.h"
+#include "Joystick.h"
 #include "Platform.h"
 #include "Platform.h"
 #include "lua_GamepadButtonMapping.h"
 #include "lua_GamepadButtonMapping.h"
 
 

+ 15 - 0
gameplay/src/lua/lua_GamepadGamepadEvent.cpp

@@ -8,6 +8,9 @@ static const char* enumStringEmpty = "";
 
 
 static const char* luaEnumString_GamepadGamepadEvent_CONNECTED_EVENT = "CONNECTED_EVENT";
 static const char* luaEnumString_GamepadGamepadEvent_CONNECTED_EVENT = "CONNECTED_EVENT";
 static const char* luaEnumString_GamepadGamepadEvent_DISCONNECTED_EVENT = "DISCONNECTED_EVENT";
 static const char* luaEnumString_GamepadGamepadEvent_DISCONNECTED_EVENT = "DISCONNECTED_EVENT";
+static const char* luaEnumString_GamepadGamepadEvent_BUTTONS_EVENT = "BUTTONS_EVENT";
+static const char* luaEnumString_GamepadGamepadEvent_JOYSTICK_EVENT = "JOYSTICK_EVENT";
+static const char* luaEnumString_GamepadGamepadEvent_TRIGGER_EVENT = "TRIGGER_EVENT";
 
 
 Gamepad::GamepadEvent lua_enumFromString_GamepadGamepadEvent(const char* s)
 Gamepad::GamepadEvent lua_enumFromString_GamepadGamepadEvent(const char* s)
 {
 {
@@ -15,6 +18,12 @@ Gamepad::GamepadEvent lua_enumFromString_GamepadGamepadEvent(const char* s)
         return Gamepad::CONNECTED_EVENT;
         return Gamepad::CONNECTED_EVENT;
     if (strcmp(s, luaEnumString_GamepadGamepadEvent_DISCONNECTED_EVENT) == 0)
     if (strcmp(s, luaEnumString_GamepadGamepadEvent_DISCONNECTED_EVENT) == 0)
         return Gamepad::DISCONNECTED_EVENT;
         return Gamepad::DISCONNECTED_EVENT;
+    if (strcmp(s, luaEnumString_GamepadGamepadEvent_BUTTONS_EVENT) == 0)
+        return Gamepad::BUTTONS_EVENT;
+    if (strcmp(s, luaEnumString_GamepadGamepadEvent_JOYSTICK_EVENT) == 0)
+        return Gamepad::JOYSTICK_EVENT;
+    if (strcmp(s, luaEnumString_GamepadGamepadEvent_TRIGGER_EVENT) == 0)
+        return Gamepad::TRIGGER_EVENT;
     GP_ERROR("Invalid enumeration value '%s' for enumeration Gamepad::GamepadEvent.", s);
     GP_ERROR("Invalid enumeration value '%s' for enumeration Gamepad::GamepadEvent.", s);
     return Gamepad::CONNECTED_EVENT;
     return Gamepad::CONNECTED_EVENT;
 }
 }
@@ -25,6 +34,12 @@ const char* lua_stringFromEnum_GamepadGamepadEvent(Gamepad::GamepadEvent e)
         return luaEnumString_GamepadGamepadEvent_CONNECTED_EVENT;
         return luaEnumString_GamepadGamepadEvent_CONNECTED_EVENT;
     if (e == Gamepad::DISCONNECTED_EVENT)
     if (e == Gamepad::DISCONNECTED_EVENT)
         return luaEnumString_GamepadGamepadEvent_DISCONNECTED_EVENT;
         return luaEnumString_GamepadGamepadEvent_DISCONNECTED_EVENT;
+    if (e == Gamepad::BUTTONS_EVENT)
+        return luaEnumString_GamepadGamepadEvent_BUTTONS_EVENT;
+    if (e == Gamepad::JOYSTICK_EVENT)
+        return luaEnumString_GamepadGamepadEvent_JOYSTICK_EVENT;
+    if (e == Gamepad::TRIGGER_EVENT)
+        return luaEnumString_GamepadGamepadEvent_TRIGGER_EVENT;
     GP_ERROR("Invalid enumeration value '%d' for enumeration Gamepad::GamepadEvent.", e);
     GP_ERROR("Invalid enumeration value '%d' for enumeration Gamepad::GamepadEvent.", e);
     return enumStringEmpty;
     return enumStringEmpty;
 }
 }

+ 3 - 0
gameplay/src/lua/lua_Global.cpp

@@ -377,6 +377,9 @@ void luaRegister_lua_Global()
         scopePath.push_back("Gamepad");
         scopePath.push_back("Gamepad");
         gameplay::ScriptUtil::registerConstantString("CONNECTED_EVENT", "CONNECTED_EVENT", scopePath);
         gameplay::ScriptUtil::registerConstantString("CONNECTED_EVENT", "CONNECTED_EVENT", scopePath);
         gameplay::ScriptUtil::registerConstantString("DISCONNECTED_EVENT", "DISCONNECTED_EVENT", scopePath);
         gameplay::ScriptUtil::registerConstantString("DISCONNECTED_EVENT", "DISCONNECTED_EVENT", scopePath);
+        ScriptUtil::registerConstantString("BUTTONS_EVENT", "BUTTONS_EVENT", scopePath);
+        ScriptUtil::registerConstantString("JOYSTICK_EVENT", "JOYSTICK_EVENT", scopePath);
+        ScriptUtil::registerConstantString("TRIGGER_EVENT", "TRIGGER_EVENT", scopePath);
     }
     }
 
 
     // Register enumeration Gesture::GestureEvent.
     // Register enumeration Gesture::GestureEvent.