def check(self, map): if self.activationTime > 0: self.activationTime -= 1 else: if self.fuel < 1: self.thrust = False if random.uniform(0,1) < 0.1: self.game.objects.append(Smoke(self.game, self.owner, self.x, self.y)) else: target = self.getClosestShip(300) if target != None: if self.target == None: self.target = target Sound.playSound(self.game.engine, 6, False) elif target == self.target: predictedTargetX = target.x - 5*self.dx predictedTargetY = target.y - 5*self.dy predictedSelfX = self.x + 5*self.dx predictedSelfY = self.y + 5*self.dy + 5 if predictedTargetX > predictedSelfX and predictedTargetY > predictedSelfY: targetAngle = math.atan((predictedSelfY-predictedTargetY)/(self.x+2*self.dx-predictedTargetX)) elif predictedTargetX < predictedSelfX and predictedTargetY > predictedSelfY: targetAngle = math.atan((predictedSelfY-predictedTargetY)/(self.x+2*self.dx-predictedTargetX)) + math.pi elif predictedTargetX < predictedSelfX and predictedTargetY < predictedSelfY: targetAngle = Functions.returnAngle(math.atan((predictedSelfY-predictedTargetY)/(self.x+2*self.dx-predictedTargetX))) + math.pi elif predictedTargetX > predictedSelfX and predictedTargetY < predictedSelfY: targetAngle = Functions.returnAngle(math.atan((predictedSelfY-predictedTargetY)/(self.x+2*self.dx-predictedTargetX)) + math.pi) + math.pi else: targetAngle = math.pi/2 if predictedTargetY > predictedSelfY: if Functions.returnAngle(self.angle) < Functions.returnAngle(targetAngle) or Functions.returnAngle(self.angle) > Functions.returnAngle(targetAngle + math.pi): self.angle += 0.1275 else: self.angle -= 0.1275 elif predictedTargetY < predictedSelfY: if Functions.returnAngle(self.angle) < Functions.returnAngle(targetAngle + math.pi) or Functions.returnAngle(self.angle) > Functions.returnAngle(targetAngle): self.angle -= 0.1275 else: self.angle += 0.1275 if math.fabs(Functions.returnAngle(self.angle) - targetAngle) < math.pi/8: self.fuel -= 1 self.thrust = True if random.uniform(0,1) < 0.3: self.game.objects.append(ThrustFlame(self.game, self.owner, self.x-2*self.dx-5*math.cos(self.angle), self.y-2*self.dy-5*math.sin(self.angle), self.dx-1*math.cos(self.angle), self.dy-1*math.sin(self.angle))) else: self.thrust = False self.activationTime = 10 self.target = None
def run(self, map): # Process if self.active: if self.hp <= 0: self.explode(map) self.angle = Functions.returnAngle(self.angle) self.check(map) if self.active: if self.checkCollisions: self.collision(map) self.move() self.draw(map)
def onGroundHit(self,map,x,y): # Triggered on ground hit self.x = x self.y = y if self.bounce: size = 10 xsum = 0 ysum = 0 points = 0 if int(self.x+size) > map.width: right = map.width else: right = int(self.x+size) if int(self.x-size) < 0: left = 0 else: left = int(self.x-size) for x in range(left, right): if (x-self.x)/(size+0.01) >= -1: for y in range(int((-math.sin(math.acos((x-self.x)/(size+0.01)))*size)+self.y), int((math.sin(math.acos((x-self.x)/(size+0.01)))*size)+self.y)): if y < map.height and y >= 0: maskValue = map.mask[x][y] if maskValue != map.maskimage.map_rgb((0,0,0, 255)): xsum += x ysum += y points += 1 if points > 0 and points < 0.95*math.pi*size**2: hitx = float(xsum)/points hity = float(ysum)/points if hitx-self.x == 0 and hity-self.y != 0: normalAngle = math.pi/2 elif hitx-self.x == 0 and hity-self.y == 0: normalAngle = None else: normalAngle = math.atan((hity-self.y)/(hitx-self.x)) else: normalAngle = None if normalAngle != None: if self.dx == 0: collisionAngle = math.pi/2 else: collisionAngle = math.atan(self.dy/self.dx) if Functions.returnAngle(normalAngle) < Functions.returnAngle(collisionAngle): if (self.dy > 0 and self.dx > 0) or (self.dy > 0 and self.dx < 0) or (self.dy < 0 and self.dx < 0): resultAngle = 2*normalAngle - collisionAngle else: resultAngle = 2*normalAngle - collisionAngle + math.pi else: if (self.dy < 0 and self.dx < 0) or (self.dy > 0 and self.dx < 0): resultAngle = 2*normalAngle - collisionAngle else: resultAngle = 2*normalAngle - collisionAngle + math.pi self.dx = math.sqrt(self.dx**2+self.dy**2)*math.cos(resultAngle) self.dy = math.sqrt(self.dx**2+self.dy**2)*math.sin(resultAngle) else: self.explode(map) elif self.onGroundExplode: self.explode(map)