123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- #
- # Tank.py
- #
- # base class Tank
- #
- import math as Math
- D1 = Math.pi / 180
- D360 = 2 * Math.pi
- class Tank:
- def __init__(self, field, data):
- self.field = field
- self.canvas = field.canvas
- self.team = data["team"]
- self.tankLength = data["tankLength"]
- self.tankWidth = data["tankWidth"]
- self.cannonLength = data["cannonLength"]
- self.cannonFront = data["cannonFront"]
- self.cannonBack = data["cannonBack"]
- self.x = data["x"]
- self.y = data["y"]
- self.angle = 0 #later on set
- self.cannonAngle = 0 #later on set
- self.moveSpeed = data["moveSpeed"]
- self.rotateSpeed = data["rotateSpeed"]
- self.cannonSpeed = data["cannonSpeed"]
- self.health = data["health"]
- self.damage = data["damage"]
- self.reloadTime = data["reloadTime"]
- borderwidth = 1
- self.radius = Math.sqrt(Math.pow(self.tankWidth+borderwidth,2)+Math.pow(self.tankLength+borderwidth,2))
-
- self.bodyCoords = [(self.x-self.tankLength, self.y-self.tankWidth), (self.x+self.tankLength, self.y-self.tankWidth),
- (self.x+self.tankLength, self.y+self.tankWidth), (self.x-self.tankLength, self.y+self.tankWidth)]
-
- self.cannonCoords = [(self.x-self.cannonLength*0.5, self.y-self.cannonBack), (self.x+self.cannonLength*0.5, self.y-self.cannonBack),
- (self.x+self.cannonLength*0.5, self.y-self.cannonFront), (self.x+self.cannonLength*1.5, self.y-self.cannonFront),
- (self.x+self.cannonLength*1.5, self.y+self.cannonFront), (self.x+self.cannonLength*0.5, self.y+self.cannonFront),
- (self.x+self.cannonLength*0.5, self.y+self.cannonBack), (self.x-self.cannonLength*0.5, self.y+self.cannonBack)]
- self.rotateBody(data["angle"])
- self.rotateCannon(data["angle"])
-
- self.bodyImage = self.canvas.create_polygon([(0,0),(0,0)],outline="black",width=borderwidth,tags="tank", fill=data["color-fill"])
- self.cannonImage = self.canvas.create_polygon([(0,0),(0,0)],outline="black",width=borderwidth,tags="cannon", fill=data["color-fill"])
- self.healthImage = self.canvas.create_text(0, 0, text=self.health, fill="green", font=("Helvectica", "8"), tags="health")
- self.draw()
-
-
- def getTeam(self):
- return self.team
-
- def getReloadTime(self):
- return self.reloadTime
-
- def getImage(self):
- return self.bodyImage
-
- def getX(self):
- return self.x
-
- def getY(self):
- return self.y
-
- def getPosition(self):
- return (self.x,self.y)
-
- def getAngle(self):
- return self.angle
-
- def getHealth(self):
- return self.health
-
- def doDamage(self,damage):
- oldHealth = self.health
- self.health -= damage
- if self.health <= 0 :
- self.destroy()
- return True
- elif self.health <= 10 and oldHealth > 10 :
- self.canvas.itemconfig(self.healthImage,fill="red")
- elif self.health <= 30 and oldHealth > 30 :
- self.canvas.itemconfig(self.healthImage,fill="orange")
- self.canvas.itemconfig(self.healthImage,text=self.health)
- return False
-
- def getCoords(self):
- return self.bodyCoords
-
- def getRadius(self):
- return self.radius
-
- def destroy(self):
- self.canvas.delete(self.bodyImage)
- self.canvas.delete(self.cannonImage)
- self.canvas.delete(self.healthImage)
-
- def draw(self):
- self.drawBody()
- self.drawCannon()
- self.drawHealth()
-
- def drawBody(self):
- self.canvas.coords(self.bodyImage,*[item for sublist in self.bodyCoords for item in sublist])
-
- def drawCannon(self):
- self.canvas.coords(self.cannonImage,*[item for sublist in self.cannonCoords for item in sublist])
-
- def drawHealth(self):
- self.canvas.coords(self.healthImage,self.x,self.y)
-
- #---------------------------------#
-
-
- def moveTank(self,xoffset,yoffset):
- #Move body first for collision detection
- self.moveBody(xoffset,yoffset)
- self.moveCannon(xoffset,yoffset)
- self.x += xoffset
- self.y += yoffset
-
- def moveBody(self,xoffset,yoffset):
- if xoffset != 0 or yoffset !=0 :
- newxy = []
- for x, y in self.bodyCoords:
- newxy.append((x+xoffset,y+yoffset))
- self.bodyCoords = newxy
-
- def moveCannon(self,xoffset,yoffset):
- if xoffset != 0 or yoffset !=0 :
- newxy = []
- for x, y in self.cannonCoords:
- newxy.append((x+xoffset,y+yoffset))
- self.cannonCoords = newxy
-
- #------------------------------#
-
- def rotateTank(self,angleOffset):
- self.rotateBody(angleOffset)
- self.rotateCannon(angleOffset)
-
- def rotateBody(self,angleOffset):
- newxy = []
- for x, y in self.bodyCoords:
- newxy.append(self.rotate(x,y,angleOffset))
- self.bodyCoords = newxy
- self.angle += angleOffset
- self.angle = self.angle % D360
-
- def rotateCannon(self,angleOffset):
- newxy = []
- for x, y in self.cannonCoords:
- newxy.append(self.rotate(x,y,angleOffset))
-
- self.cannonCoords = newxy
- self.cannonAngle += angleOffset
- self.cannonAngle = self.cannonAngle % D360
-
- #------------------------------#
-
- def turnCannon(self,angleOffset):
- self.rotateCannon(angleOffset)
-
- #-------------------------------#
- def shoot(self):
- angle = self.cannonAngle
- 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)
- def moveUp(self):
- x = Math.cos(self.angle)*self.moveSpeed
- y = - Math.sin(self.angle)*self.moveSpeed
- self.moveTank(x,y)
- def turnRight(self):
- angle = -(self.rotateSpeed * D1)
- self.rotateTank(angle)
- def moveDown(self):
- y = Math.sin(self.angle)*self.moveSpeed
- x = -Math.cos(self.angle)*self.moveSpeed
- self.moveTank(x,y)
- def turnLeft(self):
- angle = (self.rotateSpeed * D1)
- self.rotateTank(angle)
-
- def turnCannonLeft(self):
- angle = self.cannonSpeed * D1
- self.turnCannon(angle)
- def turnCannonRight(self):
- angle = -(self.cannonSpeed * D1)
- self.turnCannon(angle)
- def rotate(self,x,y,angle):
- #note: the rotation is done in the opposite fashion from for a right-handed coordinate system due to the left-handedness of computer coordinates
- x -= self.x
- y -= self.y
- _x = x * Math.cos(angle) + y * Math.sin(angle)
- _y = -x * Math.sin(angle) + y * Math.cos(angle)
- return [_x + self.x, _y + self.y]
-
- def update(self, delta):
- pass
|