777 lines
29 KiB
Python
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
|
||
|
|