class Euclidean(Draw): """ Base class for all matrix objects """ def render(self): """ Substitutes trace method for render method """ self.trace() def pinata(self,radius): """ Creates a set of circle instances associated with points in a matrix """ for i in range(len(self.matrix)): Global.enemies += [Circle(self.position+self.matrix[i],radius,self.color, self.color2)] def follow(self): """ Calculates the unit direction vector from object position to player position a displacer is added to slightly disperse a horde of enemies""" self.direction = -(self.position-(Global.SpaceShip_position+self.displacer)) def attack(self): """ Similar to the follow method except the object is directed slightly ahead of the spaceship""" self.direction = -(self.position-(self.displacer+Global.SpaceShip_position+\ Global.SpaceShip_direction*100)) def accelerate(self): """ Overrides base method in system, to account for deathstars, enemy objects are attracted to the closest deathstart""" if Global.deathstars != []: closest_deathstar = sorted(Global.deathstars,key= lambda x: abs(self.position-x.position))[0] self.direction = -(self.position-(closest_deathstar.position+self.displacer)) Draw.accelerate(self) def load(self): """ Prepares enemy object """ self.position = Vector()*50 + Vector.origin self.position *= [choice([1,-1]),choice([1,-1])] self.original = self.copy() self.speed = 0.05 self.direction = Vector() self.displacer = Vector()*32 self.time = Time() def bounce(self): """ flips direction of objects to stop going off screen """ if abs(self.position.x) >= Global.window[0]/2: self.direction.x *= -1 self.position.x *= 0.99 elif abs(self.position.y) >= Global.window[1]/2: self.direction.y *= -1 self.position.y *= 0.99 def reload(self): """ base reload method """ self.bounce() self.rotate(Global.milliseconds/10) self.accelerate() def fusion(self,radius): """ draws a set of circles associated with points in a matrix """ for i in range(len(self.matrix)): self.nice_circle(self.position+self.matrix[i],radius,self.color,self.color2) def remove(self): Global.enemies.remove(self) def destruct(self): """ base destruct method""" Global.particles.append(Explosion(self.position.tupl(),15,self.color)) Global.enemies.remove(self) Global.score += self.score
class SpaceShip(Sprite): """ SpaceShip object player controlled""" def init(self): self.image = 'player.png' self.load() self.position = Vector(0,0) self.speed = 0.35 self.shooting = False self.shot_delay = 0.15 self.direction = Vector(0,0) self.time = Time() def start_shooting(self): self.shooting = True def stop_shooting(self): self.shooting = False def reload(self): if self.shooting: if self.time > self.shot_delay: self.time.reset() angle = (self._cursor.position - self.position).angle() Global.bullets += [Bullet(self.position.tupl(),angle)] if Global.score > 150000: Global.bullets += [Bullet(self.position.tupl(),angle-3)] if Global.score > 25000: Global.bullets += [Bullet(self.position.tupl(),angle+3)] elif Global.score > 50000: self.shot_delay = 0.09 elif Global.score > 10000: self.shot_delay = 0.12 if (self.position.x <= -Global.window[0]/2 and self.direction.x < 0) or \ (self.position.x >= Global.window[0]/2 and self.direction.x > 0): self.direction.x = 0 elif (self.position.y <= -Global.window[1]/2 and self.direction.y < 0) or \ (self.position.y >= Global.window[1]/2 and self.direction.y > 0): self.direction.y = 0 for terrorist in Global.enemies + Global.deathstars: if abs(terrorist.position-self.position) < 32: self.destruct() break else: self.accelerate() Global.SpaceShip_position = self.position.tupl() Global.SpaceShip_direction = ~self.direction def destruct(self): while len(Global.enemies) > 0: Global.enemies[-1].remove() while len(Global.deathstars) > 0: Global.deathstars[-1].destruct() Global.lives -= 1 if Global.lives < 1: Global.particles.append(Explosion(self.position.tupl(),200,(255,255,200),5,0.2)) self.load_main_menu() self.score = Text() << Global.score self.score.log('scores.txt') self.play('die.wav') else: Global.particles.append(Explosion(self.position.tupl(),200,(255,255,200))) self.init() self.play('die1.wav')