diff options
author | Mitchell Stokes <mogurijin@gmail.com> | 2012-11-05 00:56:02 +0400 |
---|---|---|
committer | Mitchell Stokes <mogurijin@gmail.com> | 2012-11-05 00:56:02 +0400 |
commit | f840bd4a9f89815ca213d8398c99865fc6d64e4c (patch) | |
tree | b2c27e3ec22ac337120ab6f8db47b5071b6c49cb /source/gameengine/Ketsji/KX_CharacterWrapper.cpp | |
parent | cc77001416b385b289e7824cd5d71cad2bddfefb (diff) |
BGE: This patch adds a character wrapper (similar to the already implemented vehicle wrapper) to control character physics options. Currently supported options are:
* jump() -- causes the character to jump
* onGround -- specifies whether or not the character is on the ground
* gravity -- controls the "gravity" that the character physics uses for the character
More options could be added (such as jump speed, step height, make fall speed, max slope, etc).
Diffstat (limited to 'source/gameengine/Ketsji/KX_CharacterWrapper.cpp')
-rw-r--r-- | source/gameengine/Ketsji/KX_CharacterWrapper.cpp | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/source/gameengine/Ketsji/KX_CharacterWrapper.cpp b/source/gameengine/Ketsji/KX_CharacterWrapper.cpp new file mode 100644 index 00000000000..ce208f3a75f --- /dev/null +++ b/source/gameengine/Ketsji/KX_CharacterWrapper.cpp @@ -0,0 +1,94 @@ +/** \file gameengine/Ketsji/KX_CharacterWrapper.cpp + * \ingroup ketsji + */ + + +#include "KX_CharacterWrapper.h" +#include "PHY_ICharacter.h" + +KX_CharacterWrapper::KX_CharacterWrapper(PHY_ICharacter* character) : + PyObjectPlus(), + m_character(character) +{ +} + +KX_CharacterWrapper::~KX_CharacterWrapper() +{ + if (m_character) + delete m_character; // We're responsible for the character object! +} + +#ifdef WITH_PYTHON + +PyTypeObject KX_CharacterWrapper::Type = { + PyVarObject_HEAD_INIT(NULL, 0) + "KX_CharacterWrapper", + sizeof(PyObjectPlus_Proxy), + 0, + py_base_dealloc, + 0, + 0, + 0, + 0, + py_base_repr, + 0,0,0,0,0,0,0,0,0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + 0,0,0,0,0,0,0, + Methods, + 0, + 0, + &PyObjectPlus::Type, + 0,0,0,0,0,0, + py_base_new +}; + +PyAttributeDef KX_CharacterWrapper::Attributes[] = { + KX_PYATTRIBUTE_RO_FUNCTION("onGround", KX_CharacterWrapper, pyattr_get_onground), + KX_PYATTRIBUTE_RW_FUNCTION("gravity", KX_CharacterWrapper, pyattr_get_gravity, pyattr_set_gravity), + { NULL } //Sentinel +}; + +PyObject *KX_CharacterWrapper::pyattr_get_onground(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_CharacterWrapper* self = static_cast<KX_CharacterWrapper*>(self_v); + + return PyBool_FromLong(self->m_character->OnGround()); +} + +PyObject *KX_CharacterWrapper::pyattr_get_gravity(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_CharacterWrapper* self = static_cast<KX_CharacterWrapper*>(self_v); + + return PyFloat_FromDouble(self->m_character->GetGravity()); +} + +int KX_CharacterWrapper::pyattr_set_gravity(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) +{ + KX_CharacterWrapper* self = static_cast<KX_CharacterWrapper*>(self_v); + double param = PyFloat_AsDouble(value); + + if (param == -1) + { + PyErr_SetString(PyExc_ValueError, "KX_CharacterWrapper.gravity: expected a float"); + return PY_SET_ATTR_FAIL; + } + + self->m_character->SetGravity((float)param); + return PY_SET_ATTR_SUCCESS; +} + +PyMethodDef KX_CharacterWrapper::Methods[] = { + KX_PYMETHODTABLE_NOARGS(KX_CharacterWrapper, jump), + {NULL,NULL} //Sentinel +}; + +KX_PYMETHODDEF_DOC_NOARGS(KX_CharacterWrapper, jump, + "jump()\n" + "makes the character jump.\n") +{ + m_character->Jump(); + + Py_RETURN_NONE; +} + +#endif // WITH_PYTHON |