juegos-python/Battles/Code/Troops.py
2023-04-10 00:48:44 +02:00

777 lines
29 KiB
Python

"""
~~~~~~~~~
Troops.py
~~~~~~~~~
By - JATIN KUMAR MANDAV
This library contains different Troops classes for the game
Troops: 1. SHOOTERS
2. TANKS
3. HELICOPTERS
Also contains funcions to draw different shapes
This is completely coded in using PYGAME library of PYTHON 2.7
Lines - 777
"""
# Imports
import pygame
import sys
from math import *
# Initialize PyGame
pygame.init()
margin = 0
width = 400
height = 400
display = None
def initTroops(screen, size, m):
global display, width, height, margin
display = screen
width = size[0]
height = size[1]
margin = m
def getCoordPoly(x, y, r, n, rotate=0, anchor=(0, 0)):
coords = []
for i in range(n):
coords.append([x - anchor[0] + r*cos(2*pi*i/n + rotate), y - anchor[1] + r*sin(2*pi*i/n + rotate)])
#pygame.draw.polygon(display, black, coords, 1)
return coords[:]
class Shots:
def __init__(self, x, y, r1, speed, angle, color=(0, 0, 0), type="circle", r2=0):
self.x = x
self.y = y
self.r1 = r1
if r2 == 0:
self.r2 = r1
else:
self.r2 = r2
self.type = type
self.speed = speed
self.angle = angle
self.color = color
def draw(self):
if self.type == "circle":
pygame.draw.ellipse(display, self.color, (self.x - self.r1, self.y - self.r2, self.r1*2, self.r2*2))
elif self.type == "line":
x2 = self.x + self.r1*cos(self.angle)
y2 = self.y + self.r1*sin(self.angle)
pygame.draw.line(display, self.color, (self.x, self.y), (x2, y2), 2)
def move(self):
self.x += self.speed*cos(self.angle)
self.y += self.speed*sin(self.angle)
class Shooter:
def __init__(self, x, y, r, speed, range, level, shotSpeed, radius):
self.x = x
self.y = y
self.range = range
self.shotSpeed = shotSpeed
self.radius = radius
self.r = r
self.speed = speed
self.speedMemory = speed
self.level = level
self.slow = 20
if self.level == 1:
self.colorBase = (125, 102, 8)
self.colorHead = (212, 172, 13)
self.colorGun = (40, 55, 71)
self.hitPoint = 45
self.health = self.hitPoint
self.damage = 8
elif self.level == 2:
self.colorBase = (19, 141, 117)
self.colorHead = (11, 83, 69)
self.colorGun = (52, 73, 94)
self.hitPoint = 60
self.health = self.hitPoint
self.damage = 14
elif self.level == 3:
self.colorBase = (46, 134, 193)
self.colorHead = (21, 67, 96)
self.colorGun = (33, 47, 60)
self.hitPoint = 80
self.health = self.hitPoint
self.damage = 23
elif self.level == 4:
self.colorBase = (26, 82, 118)
self.colorHead = (20, 143, 119)
self.colorGun = (23, 32, 42)
self.hitPoint = 100
self.health = self.hitPoint
self.damage = 25
self.slow = 30
elif self.level == 5:
self.colorBase = (69, 179, 157)
self.colorHead = (244, 208, 63)
self.colorGun = (23, 32, 42)
self.hitPoint = 120
self.health = self.hitPoint
self.damage = 35
self.slow = 30
self.angle = 0
self.delay = 0
self.gunCoord = []
self.gunCoord2 = []
self.shots = []
self.nearestPos = None
self.type = "GROUND"
self.font = pygame.font.SysFont("Agency FB", 15)
def updateHealth(self, defenceStruct):
error = self.r
for struct in defenceStruct:
if not (struct.type == "HEADQUARTERS" or struct.type == "RESOURCE") and (struct.attackType == "GROUND" or struct.attackType == "GROUND AND AIR"):
if (abs(struct.nearestPos[0] - self.x) < error) and (abs(struct.nearestPos[1] - self.y) < error):
for shot in struct.shots:
if struct.isHit((shot.x, shot.y)):
self.health -= struct.damage
def isHit(self, coord):
error = 30
dist = ((self.nearestPos[0] - coord[0])**2 + (self.nearestPos[1] - coord[1])**2)**0.5
if dist < error:
return True
return False
def removeHit(self):
tempList = self.shots[:]
for shot in self.shots:
if self.isHit((shot.x, shot.y)):
tempList.remove(shot)
self.shots = tempList[:]
def shoot(self):
self.delay = (self.delay + 1)%100
if self.delay%self.slow == 0:
pos = self.nearestPos
dist = ((self.x - pos[0])**2 + (self.y - pos[1])**2)**0.5
self.angle = atan2(pos[1] - self.y, pos[0] - self.x)
if dist < self.range/2:
shot = Shots((self.gunCoord[1][0] + self.gunCoord[2][0])/2, (self.gunCoord[1][1] + self.gunCoord[2][1])/2, self.radius, self.shotSpeed, self.angle)
self.shots.append(shot)
if self.level >= 4:
shot = Shots((self.gunCoord2[1][0] + self.gunCoord2[2][0])/2, (self.gunCoord2[1][1] + self.gunCoord2[2][1])/2, self.radius, self.shotSpeed, self.angle)
self.shots.append(shot)
tempList = self.shots[:]
for shot in self.shots:
shot.move()
shot.draw()
if not ((margin < shot.x < width) and (margin < shot.y < height)):
tempList.remove(shot)
self.shots = tempList[:]
def rotate(self, coord, angle, anchor=(0, 0), corr=270):
corr = corr
return ((coord[0] - anchor[0])*cos(angle + radians(corr)) - (coord[1] - anchor[1])*sin(angle + radians(corr)),
(coord[0] - anchor[0])*sin(angle + radians(corr)) + (coord[1] - anchor[1])*cos(angle + radians(corr)))
def translate(self, coord):
return [coord[0] + self.x, coord[1] + self.y]
def draw(self):
w = self.r*4/5
h = self.r*4
#pos = pygame.mouse.get_pos()
pos = self.nearestPos
rotate = atan2(pos[1] - self.y, pos[0] - self.x)
rectCoord = [(0, 0), (0, h), (w, h), (w, 0)]
baseCoord = []
for point in rectCoord:
baseCoord.append(self.translate(self.rotate(point, rotate, (w/2, h/2), 180)))
w = self.r/2
h = self.r*2
rectCoord = [(0, 0), (0, h), (w, h), (w, 0)]
self.gunCoord = []
shift = w/2
if self.level >= 4:
shift = 2*w
self.gunCoord2 = []
for point in rectCoord:
self.gunCoord2.append(self.translate(self.rotate(point, rotate, (-2*w, 0), 270)))
for point in rectCoord:
self.gunCoord.append(self.translate(self.rotate(point, rotate, (shift, 0), 270)))
pygame.draw.rect(display, (231, 76, 60), (self.x, self.y - self.r*5, 40, 8))
pygame.draw.rect(display, (0, 255, 0), (self.x + 1, self.y - self.r*5 + 1, int(.4*(float(self.health)/self.hitPoint)*100) - 2, 8 - 2))
if self.level >= 4:
pygame.draw.polygon(display, self.colorGun, self.gunCoord2)
pygame.draw.polygon(display, self.colorGun, self.gunCoord)
pygame.draw.polygon(display, self.colorBase, baseCoord)
pygame.draw.ellipse(display, self.colorHead, (self.x - self.r, self.y - self.r, self.r*2, self.r*2))
#pygame.draw.ellipse(display, (123, 125, 125), (self.x - self.range/2, self.y - self.range/2, self.range, self.range), 1)
def move(self, defenceStruct):
if len(defenceStruct):
nearestPos = 0
lowestDist = float("inf")
for struct in defenceStruct:
dist = (self.x - struct.x)**2 + (self.y - struct.y)**2
if lowestDist > dist:
self.nearestPos = [struct.x, struct.y]
lowestDist = dist
else:
self.nearestPos = pygame.mouse.get_pos()
angle = atan2(self.nearestPos[1] - self.y, self.nearestPos[0] - self.x)
self.x += self.speed*cos(angle)
self.y += self.speed*sin(angle)
dist = abs(self.nearestPos[1] - self.y) + abs(self.nearestPos[0] - self.x)
if dist < self.range/2:
self.speed = 0
else:
self.speed = self.speedMemory
class Tank:
def __init__(self, x, y, r, speed, range, level, shotSpeed, radius):
self.x = x
self.y = y
self.barrelX = x
self.barrelY = y
self.range = range
self.shotSpeed = shotSpeed
self.radius = radius
self.r = r
self.speed = speed
self.speedMemory = speed
self.level = level
if self.level == 1:
self.colorBase = (125, 102, 8)
self.colorWheel = (11, 83, 69)
self.colorGun = (14, 98, 81)
self.colorHead = (20, 90, 50)
self.hitPoint = 300
self.damage = 5
elif self.level == 2:
self.colorBase = (19, 141, 117)
self.colorWheel = (14, 98, 81)
self.colorGun = (11, 83, 69)
self.colorHead = (14, 98, 81)
self.hitPoint = 430
self.damage = 8
elif self.level == 3:
self.colorBase = (41, 128, 185)
self.colorWheel = (21, 67, 96)
self.colorGun = (36, 113, 163)
self.colorHead = (21, 67, 96)
self.hitPoint = 570
self.damage = 12
elif self.level == 4:
self.colorBase = (52, 73, 94)
self.colorWheel = (33, 47, 61)
self.colorGun = (23, 32, 42)
self.colorHead = (33, 47, 61)
self.hitPoint = 730
self.damage = 13
self.gunCoord2 = []
self.angle = 0
self.health = self.hitPoint
self.gunCoord = []
self.shots = []
self.type = "GROUND"
self.nearestPos = None
self.recoil = r/8
self.rebound = 0.2
self.font = pygame.font.SysFont("Agency FB", 15)
def updateHealth(self, defenceStruct):
error = self.r
for struct in defenceStruct:
if (not (struct.type == "HEADQUARTERS" or struct.type == "RESOURCE")) and (struct.attackType == "GROUND" or struct.attackType == "GROUND AND AIR"):
if (abs(struct.nearestPos[0] - self.x) < error) and (abs(struct.nearestPos[1] - self.y) < error):
for shot in struct.shots:
if struct.isHit((shot.x, shot.y)):
self.health -= struct.damage
def isHit(self, coord):
error = self.r
dist = ((self.nearestPos[0] - coord[0])**2 + (self.nearestPos[1] - coord[1])**2)**0.5
if dist < error:
return True
return False
def removeHit(self):
tempList = self.shots[:]
for shot in self.shots:
if self.isHit((shot.x, shot.y)):
tempList.remove(shot)
self.shots = tempList[:]
def shoot(self):
error = 0.5
if not ((abs(self.barrelX - self.x) < error) and (abs(self.barrelY - self.y) < error)):
self.barrelX += self.rebound*cos(self.angle)
self.barrelY += self.rebound*sin(self.angle)
else:
pos = self.nearestPos
#pos = pygame.mouse.get_pos()
dist = ((self.barrelX - pos[0])**2 + (self.barrelY - pos[1])**2)**0.5
self.angle = atan2(pos[1] - self.barrelY, pos[0] - self.barrelX)
if dist < self.range/2:
shot = Shots((self.gunCoord[1][0] + self.gunCoord[2][0])/2, (self.gunCoord[1][1] + self.gunCoord[2][1])/2, self.radius, self.shotSpeed, self.angle)
self.shots.append(shot)
if self.level == 4:
shot = Shots((self.gunCoord2[1][0] + self.gunCoord2[2][0])/2, (self.gunCoord2[1][1] + self.gunCoord2[2][1])/2, self.radius, self.shotSpeed, self.angle)
self.shots.append(shot)
self.barrelX -= self.recoil*cos(self.angle)
self.barrelY -= self.recoil*sin(self.angle)
tempList = self.shots[:]
for shot in self.shots:
shot.move()
shot.draw()
if not ((margin < shot.x < width) and (margin < shot.y < height)):
tempList.remove(shot)
self.shots = tempList[:]
def rotate(self, coord, angle, anchor=(0, 0), corr=270):
corr = corr
return ((coord[0] - anchor[0])*cos(angle + radians(corr)) - (coord[1] - anchor[1])*sin(angle + radians(corr)),
(coord[0] - anchor[0])*sin(angle + radians(corr)) + (coord[1] - anchor[1])*cos(angle + radians(corr)))
def translate(self, coord, point=-1):
if point == -1:
return [coord[0] + self.x, coord[1] + self.y]
else:
return [coord[0] + point[0], coord[1] + point[1]]
def draw(self):
#pos = pygame.mouse.get_pos()
pos = self.nearestPos
rotate = atan2(pos[1] - self.y, pos[0] - self.x)
baseCoord = []
w = self.r
h = self.r*7/4
base = [(0, 0), (0, h), (w, h), (w, 0)]
for point in base:
baseCoord.append(self.translate(self.rotate(point, rotate, (w/2, h/2))))
w = self.r/3
h = self.r*2
wheels = [(0, 0), (0, h), (w, h), (w, 0)]
wheel1 = []
wheel2 = []
for point in wheels:
wheel1.append(self.translate(self.rotate(point, rotate, (w/2 - self.r/2 - w/2, h/2))))
wheel2.append(self.translate(self.rotate(point, rotate, (w/2 + self.r/2 + w/2, h/2))))
sides = 5
if self.level >= 3:
sides = 8
head = getCoordPoly(self.barrelX, self.barrelY , self.r/2, sides, rotate)
w = self.r/4
h = self.r*1.2
coord = [(0, 0), (0, h), (w, h), (w, 0)]
self.gunCoord = []
self.gunCoord2 = []
if self.level == 4:
for point in coord:
self.gunCoord.append(self.translate(self.rotate(point, rotate, (w/2 + w, 0)), (self.barrelX, self.barrelY)))
self.gunCoord2.append(self.translate(self.rotate(point, rotate, (w/2 - w, 0)), (self.barrelX, self.barrelY)))
else:
for point in coord:
self.gunCoord.append(self.translate(self.rotate(point, rotate, (w/2, 0)), (self.barrelX, self.barrelY)))
pygame.draw.rect(display, (231, 76, 60), (self.x, self.y - self.r*2, 40, 8))
pygame.draw.rect(display, (0, 255, 0), (self.x + 1, self.y - self.r*2 + 1, int(.4*(float(self.health)/self.hitPoint)*100) - 2, 8 - 2))
pygame.draw.polygon(display, self.colorBase, baseCoord)
pygame.draw.polygon(display, self.colorWheel, wheel1)
pygame.draw.polygon(display, self.colorWheel, wheel2)
pygame.draw.polygon(display, self.colorGun, self.gunCoord)
if self.level == 4:
pygame.draw.polygon(display, self.colorGun, self.gunCoord2)
pygame.draw.polygon(display, self.colorHead, head)
if self.level == 2:
pygame.draw.ellipse(display, self.colorBase, (self.barrelX - self.r/4, self.barrelY - self.r/4, self.r/2, self.r/2))
if self.level >= 3:
coord = getCoordPoly(self.barrelX, self.barrelY, self.r/3, 3, rotate)
pygame.draw.polygon(display, self.colorBase, coord)
#pygame.draw.ellipse(display, (123, 125, 125), (self.x - self.range/2, self.y - self.range/2, self.range, self.range), 1)
def move(self, defenceStruct):
if len(defenceStruct):
nearestPos = 0
lowestDist = float("inf")
for struct in defenceStruct:
dist = (self.x - struct.x)**2 + (self.y - struct.y)**2
if lowestDist > dist:
self.nearestPos = [struct.x, struct.y]
lowestDist = dist
else:
self.nearestPos = pygame.mouse.get_pos()
#self.nearestPos = pygame.mouse.get_pos()
angle = atan2(self.nearestPos[1] - self.y, self.nearestPos[0] - self.x)
self.x += self.speed*cos(angle)
self.y += self.speed*sin(angle)
self.barrelX += self.speed*cos(angle)
self.barrelY += self.speed*sin(angle)
dist = abs(self.nearestPos[1] - self.y) + abs(self.nearestPos[0] - self.x)
if dist < self.range/2:
self.speed = 0
else:
self.speed = self.speedMemory
class Helicopter:
def __init__(self, x, y, r, speed, range, level, shotSpeed=5, radius=2):
self.x = x
self.y = y
self.barrelX = x
self.barrelY = y
self.range = range
self.shotSpeed = shotSpeed
self.radius = radius
self.r = r
self.speed = speed
self.speedMemory = speed
self.level = level
if self.level == 1:
self.colorFront = (26, 82, 118)
self.colorBody = (26, 82, 118)
self.colorTail = (26, 82, 118)
self.colorTailHead = (26, 82, 118)
self.colorFan = (23, 32, 42)
self.colorGun = (23, 32, 42)
self.hitPoint = 700
self.damage = 30
elif self.level == 2:
self.colorFront = (11, 83, 69)
self.colorBody = (22, 160, 133)
self.colorTail = (11, 83, 69)
self.colorTailHead = (11, 83, 69)
self.colorFan = (23, 32, 42)
self.colorGun = (23, 32, 42)
self.hitPoint = 900
self.damage = 50
elif self.level == 3:
self.colorFront = (28, 40, 51)
self.colorBody = (21, 67, 96)
self.colorTail = (28, 40, 51)
self.colorTailHead = (28, 40, 51)
self.colorFan = (23, 32, 42)
self.colorGun = (23, 32, 42)
self.hitPoint = 1300
self.damage = 52
self.angle = 0
self.rotAngle = 0
self.fanAngle = 0
self.type = "AIR"
self.gunCoord = []
self.gunCoord2 = []
self.shots = []
self.nearestPos = None
self.health = self.hitPoint
self.delay = 0
self.font = pygame.font.SysFont("Agency FB", 15)
def updateHealth(self, defenceStruct):
error = self.r
for struct in defenceStruct:
if not (struct.type == "HEADQUARTERS" or struct.type == "RESOURCE") and (struct.attackType == "AIR" or struct.attackType == "GROUND AND AIR"):
if (abs(struct.nearestPos[0] - self.x) < error) and (abs(struct.nearestPos[1] - self.y) < error):
for shot in struct.shots:
if struct.isHit((shot.x, shot.y)):
self.health -= struct.damage
def isHit(self, coord):
error = self.r
dist = ((self.nearestPos[0] - coord[0])**2 + (self.nearestPos[1] - coord[1])**2)**0.5
if dist < error:
return True
return False
def removeHit(self):
tempList = self.shots[:]
for shot in self.shots:
if self.isHit((shot.x, shot.y)):
tempList.remove(shot)
self.shots = tempList[:]
def shoot(self):
self.delay = (self.delay + 1)%100
if self.level == 1:
if self.speed == 0 and self.rotAngle == -90 and self.delay%7 == 0:
pos = self.nearestPos
#pos = pygame.mouse.get_pos()
dist = ((self.x - pos[0])**2 + (self.y - pos[1])**2)**0.5
self.angle = atan2(pos[1] - self.y, pos[0] - self.x)
if dist < self.range/2:
shot = Shots((self.gunCoord[1][0] + self.gunCoord[2][0])/2, (self.gunCoord[1][1] + self.gunCoord[2][1])/2, self.radius, self.shotSpeed, self.angle, (0, 0, 0), "line")
self.shots.append(shot)
if self.level == 2:
if self.delay%10 == 0:
pos = self.nearestPos
#pos = pygame.mouse.get_pos()
dist = ((self.x - pos[0])**2 + (self.y - pos[1])**2)**0.5
self.angle = atan2(pos[1] - self.y, pos[0] - self.x)
if dist < self.range/2:
shot = Shots((self.gunCoord[1][0] + self.gunCoord[2][0])/2, (self.gunCoord[1][1] + self.gunCoord[2][1])/2, self.radius, self.shotSpeed, self.angle, (0, 0, 0), "line")
self.shots.append(shot)
elif self.level == 3:
if self.delay%10 == 0:
pos = self.nearestPos
#pos = pygame.mouse.get_pos()
dist = ((self.x - pos[0])**2 + (self.y - pos[1])**2)**0.5
self.angle = atan2(pos[1] - self.y, pos[0] - self.x)
if dist < self.range/2:
shot = Shots((self.gunCoord[1][0] + self.gunCoord[2][0])/2, (self.gunCoord[1][1] + self.gunCoord[2][1])/2, self.radius, self.shotSpeed, self.angle, (0, 0, 0), "line")
self.shots.append(shot)
shot = Shots((self.gunCoord2[1][0] + self.gunCoord2[2][0])/2, (self.gunCoord2[1][1] + self.gunCoord2[2][1])/2, self.radius, self.shotSpeed, self.angle, (0, 0, 0), "line")
self.shots.append(shot)
tempList = self.shots[:]
for shot in self.shots:
shot.move()
shot.draw()
if not ((margin < shot.x < width) and (margin < shot.y < height)):
tempList.remove(shot)
self.shots = tempList[:]
def rotate(self, coord, angle, anchor=(0, 0), corr=270):
corr = corr
return ((coord[0] - anchor[0])*cos(angle + radians(corr)) - (coord[1] - anchor[1])*sin(angle + radians(corr)),
(coord[0] - anchor[0])*sin(angle + radians(corr)) + (coord[1] - anchor[1])*cos(angle + radians(corr)))
def translate(self, coord, point=-1):
if point == -1:
return [coord[0] + self.x, coord[1] + self.y]
else:
return [coord[0] + point[0], coord[1] + point[1]]
def draw(self):
#pos = pygame.mouse.get_pos()
pos = self.nearestPos
rotate = atan2(pos[1] - self.y, pos[0] - self.x)
self.fanAngle = (self.fanAngle + 46)%360
len = (self.r*2)/(3**0.5)
centre = (self.x, self.y)
top = (self.x + len*cos(radians(self.fanAngle)), self.y + len*sin(radians(self.fanAngle)))
left = (self.x + len*cos(radians(self.fanAngle - 120)), self.y + len*sin(radians(self.fanAngle - 120)))
right = (self.x + len*cos(radians(self.fanAngle + 120)), self.y + len*sin(radians(self.fanAngle + 120)))
w = self.r/2
h = self.r/2
if self.level >= 2:
w = self.r/4
h = self.r/2
points = [(0, 0), (0, h), (w, h), (w, 0)]
base = []
if self.speed == 0 and self.rotAngle > -90 and self.level == 1:
self.rotAngle -= 3
for point in points:
base.append(self.translate(self.rotate(point, rotate + radians(self.rotAngle), (w/2, h/2))))
front = getCoordPoly((base[1][0] + base[2][0])/2, (base[1][1] + base[2][1])/2, w/2, 8, rotate + radians(self.rotAngle))
if self.level >= 2:
back = getCoordPoly((base[0][0] + base[3][0])/2, (base[0][1] + base[3][1])/2, w, 8, rotate + radians(self.rotAngle))
else:
back = getCoordPoly((base[0][0] + base[3][0])/2, (base[0][1] + base[3][1])/2, w/2, 8, rotate + radians(self.rotAngle))
tail = []
if self.level >= 2:
w = self.r/3
h = self.r/2
points = [(0, 0), (0, h), (w, h), (w, 0)]
base2 = []
for point in points:
base2.append(self.translate(self.rotate(point, rotate + radians(self.rotAngle), (w/2, h*2/3))))
flap1 = []
flap2 = []
w = self.r/3
h = self.r/4
points = [(0, 0), (0, h), (w, h), (w, 0)]
for point in points:
flap1.append(self.translate(self.rotate(point, rotate + radians(self.rotAngle), (w/2 + w, h))))
flap2.append(self.translate(self.rotate(point, rotate + radians(self.rotAngle), (w/2 - w, h))))
w = self.r/8
h = self.r*1.2
points = [(0, 0), (0, h), (w, h), (w, 0)]
for point in points:
tail.append(self.translate(self.rotate(point, rotate + radians(self.rotAngle), (w/2, h))))
if self.level == 1:
self.gunCoord = []
w = self.r/15
h = self.r/2.5
points = [(0, 0), (0, h), (w, h), (w, 0)]
for point in points:
self.gunCoord.append(self.translate(self.rotate(point, rotate + radians(90) + radians(self.rotAngle), (w/2, 0))))
elif self.level == 2:
self.gunCoord = []
w = self.r/15
h = self.r/2.5
points = [(0, 0), (0, h), (w, h), (w, 0)]
for point in points:
self.gunCoord.append(self.translate(self.rotate(point, rotate + radians(180) + radians(self.rotAngle), (w/2, h*3/2))))
elif self.level == 3:
self.gunCoord = []
self.gunCoord2 = []
w = self.r/15
h = self.r/2.5
points = [(0, 0), (0, h), (w, h), (w, 0)]
for point in points:
self.gunCoord.append(self.translate(self.rotate(point, rotate + radians(180) + radians(self.rotAngle), (w/2 + 5*w, h/2))))
self.gunCoord2.append(self.translate(self.rotate(point, rotate + radians(180) + radians(self.rotAngle), (w/2 - 5*w, h/2))))
tailHead = []
w = self.r/10
h = self.r/3
points = [(0, 0), (0, h), (w, h), (w, 0)]
for point in points:
tailHead.append(self.translate(self.rotate(point, rotate + radians(90) + radians(self.rotAngle), (self.r + w, h/2))))
pygame.draw.rect(display, (231, 76, 60), (self.x, self.y - self.r*2, 40, 8))
pygame.draw.rect(display, (0, 255, 0), (self.x + 1, self.y - self.r*2 + 1, int(.4*(float(self.health)/self.hitPoint)*100) - 2, 8 - 2))
pygame.draw.polygon(display, self.colorFront, front)
pygame.draw.polygon(display, self.colorGun, self.gunCoord)
pygame.draw.polygon(display, self.colorBody, back)
pygame.draw.polygon(display, self.colorBody, base)
if self.level >= 2:
pygame.draw.polygon(display, self.colorBody, base2)
pygame.draw.polygon(display, self.colorFront, flap1)
pygame.draw.polygon(display, self.colorFront, flap2)
if self.level == 3:
pygame.draw.polygon(display, self.colorGun, self.gunCoord2)
pygame.draw.polygon(display, self.colorTail, tail)
pygame.draw.polygon(display, self.colorTailHead, tailHead)
pygame.draw.line(display, self.colorFan, top, centre, 5)
pygame.draw.line(display, self.colorFan, left, centre, 5)
pygame.draw.line(display, self.colorFan, right, centre, 5)
def move(self, defenceStruct):
if len(defenceStruct):
nearestPos = 0
lowestDist = float("inf")
for struct in defenceStruct:
if struct.type == "HEADQUARTERS" or struct.type == "RESOURCE":
dist = (self.x - struct.x)**2 + (self.y - struct.y)**2
else:
dist = (self.x - struct.xOld)**2 + (self.y - struct.yOld)**2
if lowestDist > dist:
if struct.type == "HEADQUARTERS" or struct.type == "RESOURCE":
self.nearestPos = [struct.x, struct.y]
else:
self.nearestPos = [struct.xOld, struct.yOld]
lowestDist = dist
else:
self.nearestPos = pygame.mouse.get_pos()
#self.nearestPos = pygame.mouse.get_pos()
angle = atan2(self.nearestPos[1] - self.y, self.nearestPos[0] - self.x)
self.x += self.speed*cos(angle)
self.y += self.speed*sin(angle)
dist = abs(self.nearestPos[1] - self.y) + abs(self.nearestPos[0] - self.x)
if dist < self.range/2:
self.speed = 0
else:
self.speed = self.speedMemory
self.rotAngle = 0