CharacterProxy.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. #include "CharacterProxy.h"
  2. #include "PhysicsScene.h"
  3. #include "PhysCharacter.h"
  4. CharacterProxy::CharacterProxy(float radius, float height, PhysicsScene& scene) :
  5. IPhysCharacter(&scene),
  6. IProxy(scene),
  7. CONSTRUCT_MCALLS,//m_calls(__FILE__, __LINE__),
  8. m_realChar(NULL),
  9. m_radius(radius),
  10. m_height(height),
  11. m_position(0.0f),
  12. m_changedPosition(false)
  13. {
  14. }
  15. CharacterProxy::~CharacterProxy(void)
  16. {
  17. if (m_realChar)
  18. m_realChar->Release(), m_realChar = NULL;
  19. DELETE_MCALLS
  20. //for (unsigned int i = 0; i < m_calls.Size(); ++i) def_delete(m_calls[i]);
  21. //m_calls.DelAll();
  22. }
  23. //////////////////////////////////////////////////////////////////////////
  24. // IPhysCharacter
  25. //////////////////////////////////////////////////////////////////////////
  26. //Установить радиус персонажу
  27. void CharacterProxy::SetRadius(float v)
  28. {
  29. m_radius = v;
  30. m_calls.Add
  31. (
  32. MakeDeferrer<IPhysCharacter, void, float>(DEF_FREF(IPhysCharacter::SetRadius), v)
  33. );
  34. }
  35. //Получить радиус персонажа
  36. float CharacterProxy::GetRadius()
  37. {
  38. if (!m_realChar)
  39. return m_radius;
  40. return m_realChar->GetRadius();
  41. }
  42. //Установить высоту персонажу
  43. void CharacterProxy::SetHeight(float v)
  44. {
  45. m_height = v;
  46. m_calls.Add
  47. (
  48. MakeDeferrer<IPhysCharacter, void, float>(DEF_FREF(IPhysCharacter::SetHeight), v)
  49. );
  50. }
  51. //Получить высоту персонажа
  52. float CharacterProxy::GetHeight()
  53. {
  54. if (!m_realChar)
  55. return m_height;
  56. return m_realChar->GetHeight();
  57. }
  58. //Установить позицию
  59. void CharacterProxy::SetPosition(const Vector & pos)
  60. {
  61. m_changedPosition = true;
  62. m_position = pos;
  63. m_calls.Add
  64. (
  65. MakeDeferrer<IPhysCharacter, void, const Vector&>(DEF_FREF(IPhysCharacter::SetPosition), pos)
  66. );
  67. }
  68. //Получить позицию
  69. Vector CharacterProxy::GetPosition()
  70. {
  71. if (!m_realChar || m_changedPosition)
  72. return m_position;
  73. return m_realChar->GetPosition();
  74. }
  75. //Передвинуть персонажа
  76. dword CharacterProxy::Move(const Vector & move, dword collisionGroups)
  77. {
  78. m_calls.Add
  79. (
  80. MakeDeferrer<IPhysCharacter, dword, const Vector&, dword>(DEF_FREF(IPhysCharacter::Move), move, collisionGroups)
  81. );
  82. //Assert("how to return collision flags ?")
  83. //Возвращаем коллижн флаги с предыдущего кадра, если есть m_realChar
  84. if (m_realChar)
  85. return ((PhysCharacter*)m_realChar)->GetMoveCollisionFlags();
  86. return 0;
  87. }
  88. //Активировать/деактивировать персонажа
  89. void CharacterProxy::Activate(bool isActive)
  90. {
  91. m_calls.Add
  92. (
  93. MakeDeferrer<IPhysCharacter, void, bool>(DEF_FREF(IPhysCharacter::Activate), isActive)
  94. );
  95. }
  96. //Если не 0.0f, то на все объекты при столкновении будет приложена сила v
  97. void CharacterProxy::ApplyForceToObjects(float v)
  98. {
  99. m_calls.Add
  100. (
  101. MakeDeferrer<IPhysCharacter, void, float>(DEF_FREF(IPhysCharacter::ApplyForceToObjects), v)
  102. );
  103. }
  104. bool CharacterProxy::Release()
  105. {
  106. return IProxy::AddReleaseCount();
  107. //m_bReleaseCall = true;
  108. //return false;
  109. }
  110. //////////////////////////////////////////////////////////////////////////
  111. // IProxy
  112. //////////////////////////////////////////////////////////////////////////
  113. void CharacterProxy::OnSyncCreate()
  114. {
  115. if (m_realChar)
  116. return;
  117. m_realChar = NEW PhysCharacter(GetFileName(), GetFileLine(), m_radius, m_height, &m_scene);
  118. Assert(m_realChar);
  119. SetRealPhysObject(m_realChar);
  120. }
  121. void CharacterProxy::OnSyncCalls()
  122. {
  123. Assert(m_realChar);
  124. for (unsigned int i = 0; i < m_calls.Size(); ++i)
  125. {
  126. m_calls[i]->Call(m_realChar);
  127. def_delete(m_calls[i]);
  128. }
  129. m_calls.Empty();
  130. m_changedPosition = false;
  131. }
  132. bool CharacterProxy::OnSyncRelease()
  133. {
  134. return IProxy::ReleaseCounts(this);
  135. //if (m_bReleaseCall)
  136. // return IPhysBase::Release();
  137. //return false;
  138. }
  139. void CharacterProxy::OnSyncTrace()
  140. {
  141. TRACE_MCALLS
  142. }