def __init__(self, world): super(Ship, self).__init__(world) self.position = [world.width / 2, world.height / 2] self.points = [[1, 0], [util.cos(140), util.sin(140)], [-0.3, 0], [util.cos(220), util.sin(220)]] self.shield_points = [] for i in range(5): self.shield_points.append([util.cos(i * 360 / 5 - 15), util.sin(i * 360 / 5 - 15)]) self.shield_points.append([util.cos(i * 360 / 5 + 15), util.sin(i * 360 / 5 + 15)]) self.velocity = [0, 0] self.angle = 0 self.scale = 5 self.reload_timer = 0 self.regenerate_timer = 0 self.max_shields = 3 self.shields = self.max_shields self.shield_tick = 0 self.jet_tick = 0 self.shield_timer = 0 self.shield_mode = SHIELDMODE self.engines = False self.fire_sound = mixer.Sound(os.path.join("sounds", "shot.ogg")) self.engine_sound = mixer.Sound(os.path.join("sounds", "engine.ogg")) self.fire_channel = pygame.mixer.Channel(2) self.engine_channel = pygame.mixer.Channel(1)
def __init__(self, world): super(Bullet, self).__init__(world) self.points = [[1, 0], [util.cos(120), util.sin(120)], [util.cos(240), util.sin(240)]] self.scale = 2 self.life = 100 self.angle = 0
def step_from_to(self, n1, n2): if n1.__class__.__name__ == "Node": p1 = n1.point else: p1 = n1 if n2.__class__.__name__ == "Node": p2 = n2.point else: p2 = n2 if dist(n1, n2) > self.EPSILON: theta = atan2(p2[1] - p1[1], p2[0] - p1[0]) p_new = [ p1[0] + self.EPSILON * cos(theta), p1[1] + self.EPSILON * sin(theta) ] else: p_new = p2 diff = int(max(abs(p1[0] - p_new[0]), abs(p1[1] - p_new[1]), 2)) point_array = zip(np.linspace(p1[0], p_new[0], diff), np.linspace(p1[1], p_new[1], diff)) return p_new, point_array
def jet(self, position, velocity, angle): angle = angle + random.randint(-10, 10) + 180 u = 2 * util.cos(angle) v = 2 * util.sin(angle) self.add([position[0] + 3 * u, position[1] + 3 * v], [velocity[0] + u, velocity[1] + v], random.randint(50, 200), random.randint(20, 200), random.randint(20, 30))
def __init__(self, world, scale, max_speed): super(Asteroid, self).__init__(world) world.n_asteroids += 1 # spawn on a screen edge if random.randint(0, 1) == 0: x = random.randint(0, world.width) y = random.randint(0, 1) * world.height else: x = random.randint(0, 1) * world.width y = random.randint(0, world.height) self.position = [x, y] n_points = random.randint(5, 10) self.points = [] for i in range(n_points): angle = i * 360 / n_points + random.randint(-20, 20) distance = random.random() / 4.0 + 0.75 self.points.append([distance * util.cos(angle), distance * util.sin(angle)]) self.velocity = [random.random() * max_speed * 2 - max_speed, random.random() * max_speed * 2 - max_speed] self.angle = 0 self.scale = scale self.angular_velocity = random.random() * 4 - 2
def draw_string(surface, string, colour, scale, position, centre=False, angle=0): kern = 2.5 x = position[0] y = position[1] a = scale * util.cos(angle) b = scale * -util.sin(angle) c = -b d = a if centre: x -= a * kern * len(string) / 2.0 y -= c * kern * len(string) / 2.0 for ch in string: if ch in char_points: screen = [[int(-a * u - b * v + x), int(-c * u - d * v + y)] for u, v in char_points[ch]] for i in range(0, len(screen), 2): pygame.draw.line(surface, util.WHITE, screen[i], screen[i + 1]) x += a * kern y += c * kern
def explosion2(self, n_points, position, velocity): for i in range(n_points): delta = 360.0 / n_points angle = i * delta + random.randint(int(-delta), int(delta)) speed = random.random() * 4.0 self.add(position, [ velocity[0] + speed * util.cos(angle), velocity[1] + speed * util.sin(angle) ], n_colour - random.randint(1, 50), -1, random.randint(50, 300))
def thrust(self): u = 0.1 * util.cos(self.angle) v = 0.1 * util.sin(self.angle) self.velocity = [self.velocity[0] + u, self.velocity[1] + v] self.jet_tick -= 1 if self.jet_tick < 0: self.jet_tick = 3 self.world.particle.jet(self.position, self.velocity, self.angle)
def explosion2(self, n_points, position, velocity): for i in range(n_points): delta = 360.0 / n_points angle = i * delta + random.randint(int(-delta), int(delta)) speed = random.random() * 4.0 self.add(position, [velocity[0] + speed * util.cos(angle), velocity[1] + speed * util.sin(angle)], n_colour - random.randint(1, 50), -1, random.randint(50, 300))
def sparks(self, position, velocity): n_points = 3 delta = 360 / n_points for i in range(n_points): angle = i * delta + random.randint(-delta / 2, delta / 2) speed = random.random() * 2.0 self.add(position, [ velocity[0] + speed * util.cos(angle), velocity[1] + speed * util.sin(angle) ], n_colour - random.randint(1, 200), -113, random.randint(50, 100))
def explosion(self, n_points, position, velocity): self.explosion1_sound.play() for i in range(int(n_points)): delta = 360 / n_points angle = i * delta + random.randint(int(-delta / 2), int(delta / 2)) speed = random.random() * 2.0 self.add(position, [velocity[0] + speed * util.cos(angle), velocity[1] + speed * util.sin(angle)], n_colour - random.randint(1, 50), -1, random.randint(50, 100))
def sparks(self, position, velocity): n_points = 3 delta = 360 / n_points for i in range(n_points): angle = i * delta + random.randint(-delta / 2, delta / 2) speed = random.random() * 2.0 self.add(position, [velocity[0] + speed * util.cos(angle), velocity[1] + speed * util.sin(angle)], n_colour - random.randint(1, 200), -113, random.randint(50, 100))
def __init__(self, world): super(Ship, self).__init__(world) self.position = [world.width / 2, world.height / 2] self.points = [[1, 0], [util.cos(140), util.sin(140)], [-0.3, 0], [util.cos(220), util.sin(220)]] self.shield_points = [] for i in range(5): self.shield_points.append( [util.cos(i * 360 / 5 - 15), util.sin(i * 360 / 5 - 15)]) self.shield_points.append( [util.cos(i * 360 / 5 + 15), util.sin(i * 360 / 5 + 15)]) self.velocity = [0, 0] self.angle = 0 self.scale = 5 self.reload_timer = 0 self.regenerate_timer = 0 self.max_shields = 3 self.shields = self.max_shields self.shield_tick = 0 self.jet_tick = 0
def fire(self): if self.reload_timer == 0: a = util.cos(self.angle) b = util.sin(self.angle) projectile = bullet.Bullet(self.world) self.world.score = max(self.world.score - self.world.settings.bullet_cost, 0) projectile.position = [self.position[0] + self.scale * a, self.position[1] + self.scale * b] projectile.velocity = [a * 7.0 + self.velocity[0], b * 7.0 + self.velocity[1]] projectile.angle = self.angle self.reload_timer = 10
def __init__(self, world): super(Ship, self).__init__(world) self.position = [world.width / 2, world.height / 2] self.points = [[1, 0], [util.cos(140), util.sin(140)], [-0.3, 0], [util.cos(220), util.sin(220)]] self.shield_points = [] for i in range(5): self.shield_points.append([util.cos(i * 360 / 5 - 15), util.sin(i * 360 / 5 - 15)]) self.shield_points.append([util.cos(i * 360 / 5 + 15), util.sin(i * 360 / 5 + 15)]) self.velocity = [0, 0] self.angle = 0 self.scale = 5 self.reload_timer = 0 self.regenerate_timer = 0 self.max_shields = 3 self.shields = self.max_shields self.shield_tick = 0 self.jet_tick = 0
def fire(self): if self.reload_timer == 0: self.fire_channel.stop() self.fire_channel.play(self.fire_sound) a = util.cos(self.angle) b = util.sin(self.angle) projectile = bullet.Bullet(self.world) projectile.position = [self.position[0] + self.scale * a, self.position[1] + self.scale * b] projectile.velocity = [a * 7.0 + self.velocity[0], b * 7.0 + self.velocity[1]] projectile.angle = self.angle self.reload_timer = 10
def thrust(self, power): # engine state changed? if power != self.engines: if power: self.engine_channel.play(self.engine_sound, loops = -1) else: self.engine_channel.fadeout(500) self.engines = power if power: u = 0.1 * util.cos(self.angle) v = 0.1 * util.sin(self.angle) self.velocity = [self.velocity[0] + u, self.velocity[1] + v] self.jet_tick -= 1 if self.jet_tick < 0: self.jet_tick = 3 self.world.particle.jet(self.position, self.velocity, self.angle)
def draw(self): a = self.scale * util.cos(self.angle) b = self.scale * -util.sin(self.angle) c = -b d = a screen_points = [[int(a * x + b * y + self.position[0]), int(c * x + d * y + self.position[1])] for x, y in self.points] if self.continuous: pygame.draw.lines(self.world.surface, util.WHITE, True, screen_points) else: for i in range(0, len(screen_points), 2): pygame.draw.line(self.world.surface, util.WHITE, screen_points[i], screen_points[i + 1])
def draw(self): super(Ship, self).draw() for i in range(max(0, self.shields)): radius = int(self.scale + 5 + 4 * i) angle = ((i & 1) * 2 - 1) * self.shield_tick a = radius * util.cos(angle) b = radius * -util.sin(angle) c = -b d = a screen_points = [[ int(a * x + b * y + self.position[0]), int(c * x + d * y + self.position[1]) ] for x, y in self.shield_points] for i in range(0, len(screen_points), 2): pygame.draw.line(self.world.surface, util.WHITE, screen_points[i], screen_points[i + 1])
def draw(self): super(Ship, self).draw() for i in range(max(0, self.shields)): radius = int(self.scale + 5 + 4 * i) angle = ((i & 1) * 2 - 1) * self.shield_tick a = radius * util.cos(angle) b = radius * -util.sin(angle) c = -b d = a screen_points = [[int(a * x + b * y + self.position[0]), int(c * x + d * y + self.position[1])] for x, y in self.shield_points] for i in range(0, len(screen_points), 2): pygame.draw.line(self.world.surface, util.WHITE, screen_points[i], screen_points[i + 1])
def draw_string(surface, string, colour, scale, position, centre = False, angle = 0): kern = 2.5 x = position[0] y = position[1] a = scale * util.cos(angle) b = scale * -util.sin(angle) c = -b d = a if centre: x -= a * kern * len(string) / 2.0 y -= c * kern * len(string) / 2.0 for ch in string: if ch in char_points: screen = [[int(-a * u - b * v + x), int(-c * u - d * v + y)] for u, v in char_points[ch]] for i in range(0, len(screen), 2): pygame.draw.line(surface, util.WHITE, screen[i], screen[i + 1]) x += a * kern y += c * kern
imageDimensions = (2048, 2048) canvas = Image.new('RGBA', imageDimensions, (0, 0, 0, 0)) painter = ImageDraw.Draw(canvas) center = (imageDimensions[0] / 2, imageDimensions[1] / 2) colorWhite = (255, 255, 255) colorBlack = (0, 0, 0) isEven = True angleInc = 2 maxAngle = 540 radius = 1000 radiusInc = radius * angleInc / maxAngle for angle in range(0, maxAngle, angleInc): points = [] points.append(center[0] + radius * util.cos(angle + 0)) points.append(center[1] + radius * util.sin(angle + 0)) points.append(center[0] + radius * util.cos(angle + 120)) points.append(center[1] + radius * util.sin(angle + 120)) points.append(center[0] + radius * util.cos(angle + 240)) points.append(center[1] + radius * util.sin(angle + 240)) radius -= radiusInc painter.polygon(points, fill=colorBlack if isEven else colorWhite, outline=colorWhite) isEven = not isEven #canvas.save(util.get_filename(__file__)) canvas.show()