web.bmx 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. SuperStrict
  2. Framework Physics.Box2d
  3. Import SDL.SDLRenderMax2D
  4. Import "test.bmx"
  5. Graphics 800,600, 0
  6. SetBlend alphablend
  7. Run(New Web.Create(), New TSettings)
  8. Type Web Extends Test
  9. Field m_bodies:b2Body[] = New b2Body[4]
  10. Field m_joints:b2Joint[] = New b2Joint[8]
  11. Method Create:Web()
  12. Init(18, 18)
  13. Local ground:b2Body
  14. Local sd:b2PolygonDef = New b2PolygonDef
  15. sd.SetAsBox(50.0, 10.0)
  16. Local bd:b2BodyDef = New b2BodyDef
  17. bd.SetPosition(New b2Vec2.Create(0.0, -10.0))
  18. ground = m_world.CreateBody(bd)
  19. ground.CreateShape(sd)
  20. sd = New b2PolygonDef
  21. sd.SetAsBox(0.5, 0.5)
  22. sd.SetDensity(5.0)
  23. sd.SetFriction(0.2)
  24. bd = New b2BodyDef
  25. bd.SetPositionXY(-5.0, 5.0)
  26. m_bodies[0] = m_world.CreateBody(bd)
  27. m_bodies[0].CreateShape(sd)
  28. m_bodies[0].SetMassFromShapes()
  29. bd.SetPositionXY(5.0, 5.0)
  30. m_bodies[1] = m_world.CreateBody(bd)
  31. m_bodies[1].CreateShape(sd)
  32. m_bodies[1].SetMassFromShapes()
  33. bd.SetPositionXY(5.0, 15.0)
  34. m_bodies[2] = m_world.CreateBody(bd)
  35. m_bodies[2].CreateShape(sd)
  36. m_bodies[2].SetMassFromShapes()
  37. bd.SetPositionXY(-5.0, 15.0)
  38. m_bodies[3] = m_world.CreateBody(bd)
  39. m_bodies[3].CreateShape(sd)
  40. m_bodies[3].SetMassFromShapes()
  41. Local jd:b2DistanceJointDef = New b2DistanceJointDef
  42. Local p1:b2Vec2 = New b2Vec2.Create()
  43. Local p2:b2Vec2 = New b2Vec2.Create()
  44. Local d:b2Vec2 = New b2Vec2.Create()
  45. jd.SetFrequencyHz(4.0)
  46. jd.SetDampingRatio(0.5)
  47. jd.SetBody1(ground)
  48. jd.SetBody2(m_bodies[0])
  49. jd.SetLocalAnchor1(Vec2(-10.0, 10.0))
  50. jd.SetLocalAnchor2(Vec2(-0.5, -0.5))
  51. p1 = jd.GetBody1().GetWorldPoint(jd.GetLocalAnchor1())
  52. p2 = jd.GetBody2().GetWorldPoint(jd.GetLocalAnchor2())
  53. d = p2.Subtract(p1)
  54. jd.SetLength(d.Length())
  55. m_joints[0] = m_world.CreateJoint(jd)
  56. jd.SetBody1(ground)
  57. jd.SetBody2(m_bodies[1])
  58. jd.SetLocalAnchor1(Vec2(10.0, 10.0))
  59. jd.SetLocalAnchor2(Vec2(0.5, -0.5))
  60. p1 = jd.GetBody1().GetWorldPoint(jd.GetLocalAnchor1())
  61. p2 = jd.GetBody2().GetWorldPoint(jd.GetLocalAnchor2())
  62. d = p2.Subtract(p1)
  63. jd.SetLength(d.Length())
  64. m_joints[1] = m_world.CreateJoint(jd)
  65. jd.SetBody1(ground)
  66. jd.SetBody2(m_bodies[2])
  67. jd.SetLocalAnchor1(Vec2(10.0, 30.0))
  68. jd.SetLocalAnchor2(Vec2(0.5, 0.5))
  69. p1 = jd.GetBody1().GetWorldPoint(jd.GetLocalAnchor1())
  70. p2 = jd.GetBody2().GetWorldPoint(jd.GetLocalAnchor2())
  71. d = p2.Subtract(p1)
  72. jd.SetLength(d.Length())
  73. m_joints[2] = m_world.CreateJoint(jd)
  74. jd.SetBody1(ground)
  75. jd.SetBody2(m_bodies[3])
  76. jd.SetLocalAnchor1(Vec2(-10.0, 30.0))
  77. jd.SetLocalAnchor2(Vec2(-0.5, 0.5))
  78. p1 = jd.GetBody1().GetWorldPoint(jd.GetLocalAnchor1())
  79. p2 = jd.GetBody2().GetWorldPoint(jd.GetLocalAnchor2())
  80. d = p2.Subtract(p1)
  81. jd.SetLength(d.Length())
  82. m_joints[3] = m_world.CreateJoint(jd)
  83. jd.SetBody1(m_bodies[0])
  84. jd.SetBody2(m_bodies[1])
  85. jd.SetLocalAnchor1(Vec2(0.5, 0.0))
  86. jd.SetLocalAnchor2(Vec2(-0.5, 0.0))
  87. p1 = jd.GetBody1().GetWorldPoint(jd.GetLocalAnchor1())
  88. p2 = jd.GetBody2().GetWorldPoint(jd.GetLocalAnchor2())
  89. d = p2.Subtract(p1)
  90. jd.SetLength(d.Length())
  91. m_joints[4] = m_world.CreateJoint(jd)
  92. jd.SetBody1(m_bodies[1])
  93. jd.SetBody2(m_bodies[2])
  94. jd.SetLocalAnchor1(Vec2(0.0, 0.5))
  95. jd.SetLocalAnchor2(Vec2(0.0, -0.5))
  96. p1 = jd.GetBody1().GetWorldPoint(jd.GetLocalAnchor1())
  97. p2 = jd.GetBody2().GetWorldPoint(jd.GetLocalAnchor2())
  98. d = p2.Subtract(p1)
  99. jd.SetLength(d.Length())
  100. m_joints[5] = m_world.CreateJoint(jd)
  101. jd.SetBody1(m_bodies[2])
  102. jd.SetBody2(m_bodies[3])
  103. jd.SetLocalAnchor1(Vec2(-0.5, 0.0))
  104. jd.SetLocalAnchor2(Vec2(0.5, 0.0))
  105. p1 = jd.GetBody1().GetWorldPoint(jd.GetLocalAnchor1())
  106. p2 = jd.GetBody2().GetWorldPoint(jd.GetLocalAnchor2())
  107. d = p2.Subtract(p1)
  108. jd.SetLength(d.Length())
  109. m_joints[6] = m_world.CreateJoint(jd)
  110. jd.SetBody1(m_bodies[3])
  111. jd.SetBody2(m_bodies[0])
  112. jd.SetLocalAnchor1(Vec2(0.0, -0.5))
  113. jd.SetLocalAnchor2(Vec2(0.0, 0.5))
  114. p1 = jd.GetBody1().GetWorldPoint(jd.GetLocalAnchor1())
  115. p2 = jd.GetBody2().GetWorldPoint(jd.GetLocalAnchor2())
  116. d = p2.Subtract(p1)
  117. jd.SetLength(d.Length())
  118. m_joints[7] = m_world.CreateJoint(jd)
  119. Return Self
  120. End Method
  121. Method Keyboard()
  122. Super.Keyboard()
  123. If KeyHit(KEY_B) Then
  124. For Local i:Int = 0 Until 4
  125. If m_bodies[i] Then
  126. m_world.DestroyBody(m_bodies[i])
  127. m_bodies[i] = Null
  128. Exit
  129. End If
  130. Next
  131. End If
  132. If KeyHit(KEY_J) Then
  133. For Local i:Int = 0 Until 8
  134. If m_joints[i] Then
  135. m_world.DestroyJoint(m_joints[i])
  136. m_joints[i] = Null
  137. Exit
  138. End If
  139. Next
  140. End If
  141. End Method
  142. Method DoStep(settings:TSettings)
  143. Super.DoStep(settings)
  144. DrawString "This demonstrates a soft distance joint.", 5, m_textLine
  145. m_textLine :+ 12
  146. DrawString "Press: (b) to delete a body, (j) to delete a joint", 5, m_textLine
  147. m_textLine :+ 12
  148. End Method
  149. Method JointDestroyed(joint:b2Joint)
  150. For Local i:Int = 0 Until 8
  151. If m_joints[i] = joint Then
  152. m_joints[i] = Null
  153. Exit
  154. End If
  155. Next
  156. End Method
  157. End Type