BGE: Added getActionName() function to KX_GameObject()
authorMateo de Mayo <mateodemayo@gmail.com>
Mon, 3 Aug 2015 21:47:46 +0000 (23:47 +0200)
committerPorteries Tristan <republicthunderbolt9@gmail.com>
Mon, 3 Aug 2015 22:10:33 +0000 (00:10 +0200)
It works similar to getActionFrame(), you have to give a layer or not (for layer 0) as the argument and it returns the name of the animation that the object is currently playing.

Example:

```
import bge
own = bge.logic.getCurrentController().owner
own.playAction("SomeAction",0,20)
print(own.getActionName())
```
>> SomeAction

Here is an example file, just open the blend file with the terminal opened
and press P, you can see how the current animation is being printed:
{F217484}

Reviewers: moguri, hg1, panzergame, campbellbarton

Reviewed By: panzergame

Subscribers: campbellbarton, hg1, #game_engine

Projects: #game_engine

Differential Revision: https://developer.blender.org/D1443

doc/python_api/rst/bge_types/bge.types.KX_GameObject.rst
source/gameengine/Ketsji/BL_Action.cpp
source/gameengine/Ketsji/BL_Action.h
source/gameengine/Ketsji/BL_ActionManager.cpp
source/gameengine/Ketsji/BL_ActionManager.h
source/gameengine/Ketsji/KX_GameObject.cpp
source/gameengine/Ketsji/KX_GameObject.h

index a24aa546cb900ce55ec4731c673c135754fa1d4a..88b1d7da076ad29873f7b9cf4eb234b011903d07 100644 (file)
@@ -972,6 +972,16 @@ base class --- :class:`SCA_IObject`
       :return: The current frame of the action
       :rtype: float
 
+   .. method:: getActionName(layer=0)
+
+      Gets the name of the current action playing in the supplied layer.
+
+      :arg layer: The layer that you want to get the action name from.
+      :type layer: integer
+
+      :return: The name of the current action
+      :rtype: string
+
    .. method:: setActionFrame(frame, layer=0)
 
       Set the current frame of the action playing in the supplied layer.
index 9bae119107e72934487dd4e40af582da2ccc19f9..12a1caee22150056e1922b1af0f95625b0d1367b 100644 (file)
@@ -301,6 +301,18 @@ float BL_Action::GetFrame()
        return m_localtime;
 }
 
+const char *BL_Action::GetName()
+{
+       if (m_action != NULL) {
+               return m_action->id.name + 2;
+       }
+       else {
+               return "";
+       }
+
+                   
+}
+
 void BL_Action::SetFrame(float frame)
 {
        // Clamp the frame to the start and end frame
index dd1cd1f69ff8e16eb2e1301540187b1859e6a770..379dd52df5b1272449b23a47e6e5b6cfdda4ec75 100644 (file)
@@ -112,6 +112,8 @@ public:
 
        // Accessors
        float GetFrame();
+       const char *GetName();
+
        struct bAction *GetAction();
 
        // Mutators
index 975f9ea6da8e3db2c16a62862adac64094674320..9e4690548d38c930dc15959df10b70f021614e93 100644 (file)
@@ -68,6 +68,12 @@ float BL_ActionManager::GetActionFrame(short layer)
        return action ? action->GetFrame() : 0.f;
 }
 
+const char *BL_ActionManager::GetActionName(short layer)
+{
+       BL_Action *action = GetAction(layer);
+       return action ? action->GetName() : "";
+}
+
 void BL_ActionManager::SetActionFrame(short layer, float frame)
 {
        BL_Action *action = GetAction(layer);
index 00e536655c78af55d7f806873679bdf63d6f141b..97d6d88cf22d4b850c101d88084e86bbcb16efd6 100644 (file)
@@ -84,6 +84,11 @@ public:
         */
        float GetActionFrame(short layer);
 
+       /**
+        * Gets the name of the current action
+        */        
+       const char *GetActionName(short layer);
+
        /**
         * Sets the current frame of an action
         */
index 536670dde1a5c45720f657ca8d92d5089359d6dd..651df9aebbea67124f7e9cf4d80553c50b60527b 100644 (file)
@@ -494,6 +494,11 @@ float KX_GameObject::GetActionFrame(short layer)
        return GetActionManager()->GetActionFrame(layer);
 }
 
+const char *KX_GameObject::GetActionName(short layer)
+{
+       return GetActionManager()->GetActionName(layer);
+}
+
 void KX_GameObject::SetActionFrame(short layer, float frame)
 {
        GetActionManager()->SetActionFrame(layer, frame);
@@ -1957,6 +1962,7 @@ PyMethodDef KX_GameObject::Methods[] = {
        KX_PYMETHODTABLE_KEYWORDS(KX_GameObject, playAction),
        KX_PYMETHODTABLE(KX_GameObject, stopAction),
        KX_PYMETHODTABLE(KX_GameObject, getActionFrame),
+       KX_PYMETHODTABLE(KX_GameObject, getActionName),
        KX_PYMETHODTABLE(KX_GameObject, setActionFrame),
        KX_PYMETHODTABLE(KX_GameObject, isPlayingAction),
        
@@ -3921,7 +3927,7 @@ KX_PYMETHODDEF_DOC(KX_GameObject, stopAction,
        "stopAction(layer=0)\n"
        "Stop playing the action on the given layer\n")
 {
-       short layer=0;
+       short layer = 0;
 
        if (!PyArg_ParseTuple(args, "|h:stopAction", &layer))
                return NULL;
@@ -3937,7 +3943,7 @@ KX_PYMETHODDEF_DOC(KX_GameObject, getActionFrame,
        "getActionFrame(layer=0)\n"
        "Gets the current frame of the action playing in the supplied layer\n")
 {
-       short layer=0;
+       short layer = 0;
 
        if (!PyArg_ParseTuple(args, "|h:getActionFrame", &layer))
                return NULL;
@@ -3947,11 +3953,25 @@ KX_PYMETHODDEF_DOC(KX_GameObject, getActionFrame,
        return PyFloat_FromDouble(GetActionFrame(layer));
 }
 
+KX_PYMETHODDEF_DOC(KX_GameObject, getActionName,
+       "getActionName(layer=0)\n"
+       "Gets the name of the current action playing in the supplied layer\n")
+{
+       short layer = 0;
+
+       if (!PyArg_ParseTuple(args, "|h:getActionName", &layer))
+               return NULL;
+
+       layer_check(layer, "getActionName");
+
+       return PyUnicode_FromString(GetActionName(layer));
+}
+
 KX_PYMETHODDEF_DOC(KX_GameObject, setActionFrame,
        "setActionFrame(frame, layer=0)\n"
        "Set the current frame of the action playing in the supplied layer\n")
 {
-       short layer=0;
+       short layer = 0;
        float frame;
 
        if (!PyArg_ParseTuple(args, "f|h:setActionFrame", &frame, &layer))
@@ -3968,7 +3988,7 @@ KX_PYMETHODDEF_DOC(KX_GameObject, isPlayingAction,
        "isPlayingAction(layer=0)\n"
        "Checks to see if there is an action playing in the given layer\n")
 {
-       short layer=0;
+       short layer = 0;
 
        if (!PyArg_ParseTuple(args, "|h:isPlayingAction", &layer))
                return NULL;
index 99c8a6d718bc162e23d8b2c46794a77839b76ce6..c10802a83b21f598f4d238606737cec396c5ca7f 100644 (file)
@@ -276,6 +276,11 @@ public:
         */
        float GetActionFrame(short layer);
 
+       /**
+        * Gets the name of the current action
+        */
+       const char *GetActionName(short layer);
+
        /**
         * Sets the current frame of an action
         */
@@ -1037,6 +1042,7 @@ public:
        KX_PYMETHOD_DOC(KX_GameObject, playAction);
        KX_PYMETHOD_DOC(KX_GameObject, stopAction);
        KX_PYMETHOD_DOC(KX_GameObject, getActionFrame);
+       KX_PYMETHOD_DOC(KX_GameObject, getActionName);
        KX_PYMETHOD_DOC(KX_GameObject, setActionFrame);
        KX_PYMETHOD_DOC(KX_GameObject, isPlayingAction);