Tank.py 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. #
  2. # Tank.py
  3. #
  4. # base class Tank
  5. #
  6. import math as Math
  7. D1 = Math.pi / 180
  8. D360 = 2 * Math.pi
  9. class Tank:
  10. def __init__(self, field, data):
  11. self.field = field
  12. self.canvas = field.canvas
  13. self.team = data["team"]
  14. self.tankLength = data["tankLength"]
  15. self.tankWidth = data["tankWidth"]
  16. self.cannonLength = data["cannonLength"]
  17. self.cannonFront = data["cannonFront"]
  18. self.cannonBack = data["cannonBack"]
  19. self.x = data["x"]
  20. self.y = data["y"]
  21. self.angle = 0 #later on set
  22. self.cannonAngle = 0 #later on set
  23. self.moveSpeed = data["moveSpeed"]
  24. self.rotateSpeed = data["rotateSpeed"]
  25. self.cannonSpeed = data["cannonSpeed"]
  26. self.health = data["health"]
  27. self.damage = data["damage"]
  28. self.reloadTime = data["reloadTime"]
  29. borderwidth = 1
  30. self.radius = Math.sqrt(Math.pow(self.tankWidth+borderwidth,2)+Math.pow(self.tankLength+borderwidth,2))
  31. self.bodyCoords = [(self.x-self.tankLength, self.y-self.tankWidth), (self.x+self.tankLength, self.y-self.tankWidth),
  32. (self.x+self.tankLength, self.y+self.tankWidth), (self.x-self.tankLength, self.y+self.tankWidth)]
  33. self.cannonCoords = [(self.x-self.cannonLength*0.5, self.y-self.cannonBack), (self.x+self.cannonLength*0.5, self.y-self.cannonBack),
  34. (self.x+self.cannonLength*0.5, self.y-self.cannonFront), (self.x+self.cannonLength*1.5, self.y-self.cannonFront),
  35. (self.x+self.cannonLength*1.5, self.y+self.cannonFront), (self.x+self.cannonLength*0.5, self.y+self.cannonFront),
  36. (self.x+self.cannonLength*0.5, self.y+self.cannonBack), (self.x-self.cannonLength*0.5, self.y+self.cannonBack)]
  37. self.rotateBody(data["angle"])
  38. self.rotateCannon(data["angle"])
  39. self.bodyImage = self.canvas.create_polygon([(0,0),(0,0)],outline="black",width=borderwidth,tags="tank", fill=data["color-fill"])
  40. self.cannonImage = self.canvas.create_polygon([(0,0),(0,0)],outline="black",width=borderwidth,tags="cannon", fill=data["color-fill"])
  41. self.healthImage = self.canvas.create_text(0, 0, text=self.health, fill="green", font=("Helvectica", "8"), tags="health")
  42. self.draw()
  43. def getTeam(self):
  44. return self.team
  45. def getReloadTime(self):
  46. return self.reloadTime
  47. def getImage(self):
  48. return self.bodyImage
  49. def getX(self):
  50. return self.x
  51. def getY(self):
  52. return self.y
  53. def getPosition(self):
  54. return (self.x,self.y)
  55. def getAngle(self):
  56. return self.angle
  57. def getHealth(self):
  58. return self.health
  59. def doDamage(self,damage):
  60. oldHealth = self.health
  61. self.health -= damage
  62. if self.health <= 0 :
  63. self.destroy()
  64. return True
  65. elif self.health <= 10 and oldHealth > 10 :
  66. self.canvas.itemconfig(self.healthImage,fill="red")
  67. elif self.health <= 30 and oldHealth > 30 :
  68. self.canvas.itemconfig(self.healthImage,fill="orange")
  69. self.canvas.itemconfig(self.healthImage,text=self.health)
  70. return False
  71. def getCoords(self):
  72. return self.bodyCoords
  73. def getRadius(self):
  74. return self.radius
  75. def destroy(self):
  76. self.canvas.delete(self.bodyImage)
  77. self.canvas.delete(self.cannonImage)
  78. self.canvas.delete(self.healthImage)
  79. def draw(self):
  80. self.drawBody()
  81. self.drawCannon()
  82. self.drawHealth()
  83. def drawBody(self):
  84. self.canvas.coords(self.bodyImage,*[item for sublist in self.bodyCoords for item in sublist])
  85. def drawCannon(self):
  86. self.canvas.coords(self.cannonImage,*[item for sublist in self.cannonCoords for item in sublist])
  87. def drawHealth(self):
  88. self.canvas.coords(self.healthImage,self.x,self.y)
  89. #---------------------------------#
  90. def moveTank(self,xoffset,yoffset):
  91. #Move body first for collision detection
  92. self.moveBody(xoffset,yoffset)
  93. self.moveCannon(xoffset,yoffset)
  94. self.x += xoffset
  95. self.y += yoffset
  96. def moveBody(self,xoffset,yoffset):
  97. if xoffset != 0 or yoffset !=0 :
  98. newxy = []
  99. for x, y in self.bodyCoords:
  100. newxy.append((x+xoffset,y+yoffset))
  101. self.bodyCoords = newxy
  102. def moveCannon(self,xoffset,yoffset):
  103. if xoffset != 0 or yoffset !=0 :
  104. newxy = []
  105. for x, y in self.cannonCoords:
  106. newxy.append((x+xoffset,y+yoffset))
  107. self.cannonCoords = newxy
  108. #------------------------------#
  109. def rotateTank(self,angleOffset):
  110. self.rotateBody(angleOffset)
  111. self.rotateCannon(angleOffset)
  112. def rotateBody(self,angleOffset):
  113. newxy = []
  114. for x, y in self.bodyCoords:
  115. newxy.append(self.rotate(x,y,angleOffset))
  116. self.bodyCoords = newxy
  117. self.angle += angleOffset
  118. self.angle = self.angle % D360
  119. def rotateCannon(self,angleOffset):
  120. newxy = []
  121. for x, y in self.cannonCoords:
  122. newxy.append(self.rotate(x,y,angleOffset))
  123. self.cannonCoords = newxy
  124. self.cannonAngle += angleOffset
  125. self.cannonAngle = self.cannonAngle % D360
  126. #------------------------------#
  127. def turnCannon(self,angleOffset):
  128. self.rotateCannon(angleOffset)
  129. #-------------------------------#
  130. def shoot(self):
  131. angle = self.cannonAngle
  132. self.field.addBullet(self.x+(Math.cos(angle)*(self.cannonLength*1.5)),self.y-(Math.sin(angle)*(self.cannonLength*1.5)), self.team, angle, self.damage, self.cannonFront-1)
  133. def moveUp(self):
  134. x = Math.cos(self.angle)*self.moveSpeed
  135. y = - Math.sin(self.angle)*self.moveSpeed
  136. self.moveTank(x,y)
  137. def turnRight(self):
  138. angle = -(self.rotateSpeed * D1)
  139. self.rotateTank(angle)
  140. def moveDown(self):
  141. y = Math.sin(self.angle)*self.moveSpeed
  142. x = -Math.cos(self.angle)*self.moveSpeed
  143. self.moveTank(x,y)
  144. def turnLeft(self):
  145. angle = (self.rotateSpeed * D1)
  146. self.rotateTank(angle)
  147. def turnCannonLeft(self):
  148. angle = self.cannonSpeed * D1
  149. self.turnCannon(angle)
  150. def turnCannonRight(self):
  151. angle = -(self.cannonSpeed * D1)
  152. self.turnCannon(angle)
  153. def rotate(self,x,y,angle):
  154. #note: the rotation is done in the opposite fashion from for a right-handed coordinate system due to the left-handedness of computer coordinates
  155. x -= self.x
  156. y -= self.y
  157. _x = x * Math.cos(angle) + y * Math.sin(angle)
  158. _y = -x * Math.sin(angle) + y * Math.cos(angle)
  159. return [_x + self.x, _y + self.y]
  160. def update(self, delta):
  161. pass