SensorTest.h
上传用户:gb3593
上传日期:2022-01-07
资源大小:3028k
文件大小:4k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /*
  2. * Copyright (c) 2008-2009 Erin Catto http://www.gphysics.com
  3. *
  4. * This software is provided 'as-is', without any express or implied
  5. * warranty.  In no event will the authors be held liable for any damages
  6. * arising from the use of this software.
  7. * Permission is granted to anyone to use this software for any purpose,
  8. * including commercial applications, and to alter it and redistribute it
  9. * freely, subject to the following restrictions:
  10. * 1. The origin of this software must not be misrepresented; you must not
  11. * claim that you wrote the original software. If you use this software
  12. * in a product, an acknowledgment in the product documentation would be
  13. * appreciated but is not required.
  14. * 2. Altered source versions must be plainly marked as such, and must not be
  15. * misrepresented as being the original software.
  16. * 3. This notice may not be removed or altered from any source distribution.
  17. */
  18. #ifndef SENSOR_TEST_H
  19. #define SENSOR_TEST_H
  20. // This is used to test sensor shapes.
  21. class SensorTest : public Test
  22. {
  23. public:
  24. enum
  25. {
  26. e_count = 7
  27. };
  28. SensorTest()
  29. {
  30. {
  31. b2BodyDef bd;
  32. b2Body* ground = m_world->CreateBody(&bd);
  33. {
  34. b2PolygonShape shape;
  35. shape.SetAsEdge(b2Vec2(-40.0f, 0.0f), b2Vec2(40.0f, 0.0f));
  36. ground->CreateFixture(&shape, 0.0f);
  37. }
  38. #if 0
  39. {
  40. b2FixtureDef sd;
  41. sd.SetAsBox(10.0f, 2.0f, b2Vec2(0.0f, 20.0f), 0.0f);
  42. sd.isSensor = true;
  43. m_sensor = ground->CreateFixture(&sd);
  44. }
  45. #else
  46. {
  47. b2CircleShape shape;
  48. shape.m_radius = 5.0f;
  49. shape.m_p.Set(0.0f, 10.0f);
  50. b2FixtureDef fd;
  51. fd.shape = &shape;
  52. fd.isSensor = true;
  53. m_sensor = ground->CreateFixture(&fd);
  54. }
  55. #endif
  56. }
  57. {
  58. b2CircleShape shape;
  59. shape.m_radius = 1.0f;
  60. for (int32 i = 0; i < e_count; ++i)
  61. {
  62. b2BodyDef bd;
  63. bd.type = b2_dynamicBody;
  64. bd.position.Set(-10.0f + 3.0f * i, 20.0f);
  65. bd.userData = m_touching + i;
  66. m_touching[i] = false;
  67. m_bodies[i] = m_world->CreateBody(&bd);
  68. m_bodies[i]->CreateFixture(&shape, 1.0f);
  69. }
  70. }
  71. }
  72. // Implement contact listener.
  73. void BeginContact(b2Contact* contact)
  74. {
  75. b2Fixture* fixtureA = contact->GetFixtureA();
  76. b2Fixture* fixtureB = contact->GetFixtureB();
  77. if (fixtureA == m_sensor)
  78. {
  79. void* userData = fixtureB->GetBody()->GetUserData();
  80. if (userData)
  81. {
  82. bool* touching = (bool*)userData;
  83. *touching = true;
  84. }
  85. }
  86. if (fixtureB == m_sensor)
  87. {
  88. void* userData = fixtureA->GetBody()->GetUserData();
  89. if (userData)
  90. {
  91. bool* touching = (bool*)userData;
  92. *touching = true;
  93. }
  94. }
  95. }
  96. // Implement contact listener.
  97. void EndContact(b2Contact* contact)
  98. {
  99. b2Fixture* fixtureA = contact->GetFixtureA();
  100. b2Fixture* fixtureB = contact->GetFixtureB();
  101. if (fixtureA == m_sensor)
  102. {
  103. void* userData = fixtureB->GetBody()->GetUserData();
  104. if (userData)
  105. {
  106. bool* touching = (bool*)userData;
  107. *touching = false;
  108. }
  109. }
  110. if (fixtureB == m_sensor)
  111. {
  112. void* userData = fixtureA->GetBody()->GetUserData();
  113. if (userData)
  114. {
  115. bool* touching = (bool*)userData;
  116. *touching = false;
  117. }
  118. }
  119. }
  120. void Step(Settings* settings)
  121. {
  122. Test::Step(settings);
  123. // Traverse the contact results. Apply a force on shapes
  124. // that overlap the sensor.
  125. for (int32 i = 0; i < e_count; ++i)
  126. {
  127. if (m_touching[i] == false)
  128. {
  129. continue;
  130. }
  131. b2Body* body = m_bodies[i];
  132. b2Body* ground = m_sensor->GetBody();
  133. b2CircleShape* circle = (b2CircleShape*)m_sensor->GetShape();
  134. b2Vec2 center = ground->GetWorldPoint(circle->m_p);
  135. b2Vec2 position = body->GetPosition();
  136. b2Vec2 d = center - position;
  137. if (d.LengthSquared() < FLT_EPSILON * FLT_EPSILON)
  138. {
  139. continue;
  140. }
  141. d.Normalize();
  142. b2Vec2 F = 100.0f * d;
  143. body->ApplyForce(F, position);
  144. }
  145. }
  146. static Test* Create()
  147. {
  148. return new SensorTest;
  149. }
  150. b2Fixture* m_sensor;
  151. b2Body* m_bodies[e_count];
  152. bool m_touching[e_count];
  153. };
  154. #endif