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

游戏引擎

开发平台:

Visual C++

  1. /*
  2. * Copyright (c) 2006-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. // Contributed by caspin.
  19. #ifndef CONTACT_CB_H
  20. #define CONTACT_CB_H
  21. #include <set>
  22. #include <deque>
  23. #include <sstream>
  24. #include <string>
  25. #include <iostream>
  26. bool key_comp( const ContactPoint& lhs, const ContactPoint& rhs )
  27. {
  28. if( lhs.fixtureA < rhs.fixtureA ) return true;
  29. if( lhs.fixtureA == rhs.fixtureA && lhs.fixtureB < rhs.fixtureB ) return true;
  30. if( lhs.fixtureA == rhs.fixtureA && lhs.fixtureB == rhs.fixtureB && lhs.id.key < rhs.id.key ) return true;
  31. return false;
  32. }
  33. class ContactCB : public Test
  34. {
  35. public:
  36. ContactCB()
  37. : m_set(&key_comp)
  38. {
  39. b2PolygonDef sd;
  40. sd.friction = 0;
  41. sd.vertexCount = 3;
  42. sd.vertices[0].Set(10,10);
  43. sd.vertices[1].Set(9,7);
  44. sd.vertices[2].Set(10,0);
  45. m_world->GetGroundBody()->CreateFixture(&sd);
  46. sd.vertices[0].Set(9,7);
  47. sd.vertices[1].Set(8,0);
  48. sd.vertices[2].Set(10,0);
  49. m_world->GetGroundBody()->CreateFixture(&sd);
  50. sd.vertices[0].Set(9,7);
  51. sd.vertices[1].Set(8,5);
  52. sd.vertices[2].Set(8,0);
  53. m_world->GetGroundBody()->CreateFixture(&sd);
  54. sd.vertices[0].Set(8,5);
  55. sd.vertices[1].Set(7,4);
  56. sd.vertices[2].Set(8,0);
  57. m_world->GetGroundBody()->CreateFixture(&sd);
  58. sd.vertices[0].Set(7,4);
  59. sd.vertices[1].Set(5,0);
  60. sd.vertices[2].Set(8,0);
  61. m_world->GetGroundBody()->CreateFixture(&sd);
  62. sd.vertices[0].Set(7,4);
  63. sd.vertices[1].Set(5,3);
  64. sd.vertices[2].Set(5,0);
  65. m_world->GetGroundBody()->CreateFixture(&sd);
  66. sd.vertices[0].Set(5,3);
  67. sd.vertices[1].Set(2,2);
  68. sd.vertices[2].Set(5,0);
  69. m_world->GetGroundBody()->CreateFixture(&sd);
  70. sd.vertices[0].Set(2,2);
  71. sd.vertices[1].Set(0,0);
  72. sd.vertices[2].Set(5,0);
  73. m_world->GetGroundBody()->CreateFixture(&sd);
  74. sd.vertices[0].Set(2,2);
  75. sd.vertices[1].Set(-2,2);
  76. sd.vertices[2].Set(0,0);
  77. m_world->GetGroundBody()->CreateFixture(&sd);
  78. sd.vertices[2].Set(-2,2);
  79. sd.vertices[1].Set(0,0);
  80. sd.vertices[0].Set(-5,0);
  81. m_world->GetGroundBody()->CreateFixture(&sd);
  82. sd.vertices[2].Set(-5,3);
  83. sd.vertices[1].Set(-2,2);
  84. sd.vertices[0].Set(-5,0);
  85. m_world->GetGroundBody()->CreateFixture(&sd);
  86. sd.vertices[2].Set(-7,4);
  87. sd.vertices[1].Set(-5,3);
  88. sd.vertices[0].Set(-5,0);
  89. m_world->GetGroundBody()->CreateFixture(&sd);
  90. sd.vertices[2].Set(-7,4);
  91. sd.vertices[1].Set(-5,0);
  92. sd.vertices[0].Set(-8,0);
  93. m_world->GetGroundBody()->CreateFixture(&sd);
  94. sd.vertices[2].Set(-8,5);
  95. sd.vertices[1].Set(-7,4);
  96. sd.vertices[0].Set(-8,0);
  97. m_world->GetGroundBody()->CreateFixture(&sd);
  98. sd.vertices[2].Set(-9,7);
  99. sd.vertices[1].Set(-8,5);
  100. sd.vertices[0].Set(-8,0);
  101. m_world->GetGroundBody()->CreateFixture(&sd);
  102. sd.vertices[2].Set(-9,7);
  103. sd.vertices[1].Set(-8,0);
  104. sd.vertices[0].Set(-10,0);
  105. m_world->GetGroundBody()->CreateFixture(&sd);
  106. sd.vertices[2].Set(-10,10);
  107. sd.vertices[1].Set(-9,7);
  108. sd.vertices[0].Set(-10,0);
  109. m_world->GetGroundBody()->CreateFixture(&sd);
  110. sd.SetAsBox(.5,6,b2Vec2(10.5,6),0);
  111. m_world->GetGroundBody()->CreateFixture(&sd);
  112. sd.SetAsBox(.5,6,b2Vec2(-10.5,6),0);
  113. m_world->GetGroundBody()->CreateFixture(&sd);
  114. b2BodyDef bd;
  115. bd.position.Set(9.5,60);
  116. b2Body* m_ball = m_world->CreateBody( &bd );
  117. #if 1
  118. b2PolygonDef cd;
  119. cd.vertexCount = 8;
  120. float32 w = 0.95f;
  121. float32 b = w / (2.0f + sqrtf(2.0f));
  122. float32 s = sqrtf(2.0f) * b;
  123. cd.vertices[0].Set(0.5f * s, 0.0f);
  124. cd.vertices[1].Set(0.5f * w, b);
  125. cd.vertices[2].Set(0.5f * w, b + s);
  126. cd.vertices[3].Set(0.5f * s, w);
  127. cd.vertices[4].Set(-0.5f * s, w);
  128. cd.vertices[5].Set(-0.5f * w, b + s);
  129. cd.vertices[6].Set(-0.5f * w, b);
  130. cd.vertices[7].Set(-0.5f * s, 0.0f);
  131. cd.density = 1.0f;
  132. #else
  133. b2CircleDef cd;
  134. cd.radius = 0.33f;
  135. cd.friction = 0;
  136. cd.density = 1;
  137. #endif
  138. m_ball_shape = m_ball->CreateFixture(&cd);
  139. m_ball->SetMassFromShapes();
  140. }
  141. void Step(Settings* settings)
  142. {
  143. Test::Step(settings);
  144. std::ostringstream oss;
  145. oss << std::hex;
  146. for (int32 i=0; i< m_pointCount; ++i)
  147. {
  148. #if 0
  149. if (m_points[i].shape1 > m_points[i].shape2)
  150. {
  151. b2Swap(m_points[i].shape1, m_points[i].shape2);
  152. m_points[i].normal *= -1.0f;
  153. m_points[i].velocity *= -1.0f;
  154. }
  155. #endif
  156. oss.str("");
  157. switch( m_points[i].state )
  158. {
  159. case e_contactAdded:
  160. {
  161. if( ! m_set.insert( m_points[i] ).second )
  162. {
  163. oss << "ERROR ";
  164. }
  165. else
  166. {
  167. oss << "      ";
  168. }
  169. oss << "added:   " << m_points[i].fixtureA << " -> " << m_points[i].fixtureB;
  170. oss << " : " << m_points[i].id.key;
  171. m_strings.push_back( oss.str() );
  172. std::cout << oss.str() << std::endl;
  173. break;
  174. }
  175. case e_contactRemoved:
  176. {
  177. if( m_set.find( m_points[i] ) == m_set.end() )
  178. {
  179. oss << "ERROR ";
  180. }
  181. else
  182. {
  183. oss << "      ";
  184. }
  185. oss << "removed: " << m_points[i].fixtureA << " -> " << m_points[i].fixtureB;
  186. oss << " : " << m_points[i].id.key;
  187. m_strings.push_back( oss.str() );
  188. std::cout << oss.str() << std::endl;
  189. m_set.erase( m_points[i] );
  190. break;
  191. }
  192. case e_contactPersisted:
  193. {
  194. if( m_set.find( m_points[i] ) == m_set.end() )
  195. {
  196. oss << "ERROR persist: " << m_points[i].fixtureA << " -> ";
  197. oss << m_points[i].fixtureB << " : " << m_points[i].id.key;
  198. m_strings.push_back( oss.str() );
  199. std::cout << oss.str() << std::endl;
  200. }
  201. break;
  202. }
  203. }
  204. }
  205. while( m_strings.size() > 15 )
  206. {
  207. m_strings.pop_front();
  208. }
  209. for( unsigned i=0; i<m_strings.size(); ++i )
  210. {
  211. m_debugDraw.DrawString(5, m_textLine, m_strings[i].c_str() );
  212. m_textLine += 15;
  213. }
  214. }
  215. static Test* Create()
  216. {
  217. return new ContactCB;
  218. }
  219. b2Body* m_ball;
  220. b2Body* m_bullet;
  221. b2Fixture* m_ball_shape;
  222. std::set<ContactPoint,bool(*)(const ContactPoint&,const ContactPoint&)> m_set;
  223. std::deque<std::string> m_strings;
  224. };
  225. #endif // CONTACT_CB_H