class SpriteElement(Element): def __init__(self, pos, type, input, frames, frames_per_row): super().__init__(pos, input) self.sprite = SpriteSheet(res.textures[type]) self.sprite.init(frames, frames_per_row) self.sprite.position = pos self.local_bounds = self.sprite.local_bounds self.center = sf.Vector2(self.local_bounds.width/2, self.local_bounds.height/2) def update(self, dt): self.sprite.position = self.local_bounds.position def draw(self, target): target.draw(self.sprite)
class SpriteElement(Element): def __init__(self, pos, type, frames, frames_per_row, input): super().__init__(pos, input) self.sprite = SpriteSheet(res.textures[type]) self.sprite.init(frames, frames_per_row) self.sprite.position = pos self.local_bounds = self.sprite.local_bounds def update(self, dt): if self.sprite.position != self.local_bounds.position: self.sprite.position = self.local_bounds.position def draw(self, target): target.draw(self.sprite)
class Projectile: def __init__(self): self.sprite = SpriteSheet(res.laser_light1) self.sprite.init(4, 4) self.sprite.origin = self.sprite.frame_dim/2 self.explosion_sprite = SpriteSheet(res.explosion_missile1) self.explosion_sprite.init(9, 9, 0.05) self.explosion_sprite.origin = self.explosion_sprite.frame_dim/2 self.damage = 1 self.phase = 0 # 0 = Weapon to offscreen, 1 = offscreen to target, 2 = detonation self.target_room = None self.start_position = sf.Vector2(0, 0) self.to_offscreen_position = sf.Vector2(0, 0) self.from_offscreen_position = sf.Vector2(0, 0) self.target_position = sf.Vector2(0, 0) self.fire_time = 0 self.hit_time = 0 self.hit = True # Hit or miss? self.hit_shields = False # Hit shields or ship? self.active = False self.is_mine = False # Does this projectile belong to me? (Client only, used for lock_window stuff) def apply_simulation_time(self, time): if self.phase == 0: start_position = self.start_position end_position = self.to_offscreen_position interp = (time - self.fire_time)/(1.0) # Half a second to offscreen if time > self.fire_time+1.0: self.phase = 1 elif self.phase == 1: start_position = self.from_offscreen_position end_position = self.target_position interp = (time - (self.hit_time-0.7))/(0.7) # Third of a second from offscreen to target #if time > self.hit_time: # self.phase = 2 self.sprite.rotation = math.degrees(math.atan2(end_position.y-start_position.y, end_position.x-start_position.x)) self.sprite.position = start_position + (end_position-start_position)*interp def detonate(self): if self.hit_shields: self.target_room.ship.shield_system.shields -= self.damage else: self.target_room.ship.hull_points -= self.damage if self.target_room.system: self.target_room.system.deal_damage(self.damage) self.active = False self.phase = 2 self.explosion_sprite.set_frame_loop(0, 8, False) self.explosion_sprite.position = self.sprite.position
class Weapon: def __init__(self, id): self.id = id self.sprite = SpriteSheet(res.weapon) self.sprite.init(12, 12, 0.06) self.sprite.set_frame_loop(5, 5, False) self.slot = None # WeaponSlot this weapon is in self.position = sf.Vector2(0, 0) self.firing = False # Whether or not it's firing this turn self.powered = False # Is the weapon powered or unpowered self.was_powered = False # Was the weapon powered last turn? (Used for weapon slide out/in animation) self.target = None # Target room self.charge = 0 self.required_charge = 1 self.required_power = 1 # Power consumption self.projectile_type = None self.num_shots = 2 self.projectiles = [Projectile(), Projectile()] def apply_simulation_time(self, time): if time <= 0.3: # weapon slide in/out animation if self.powered and not self.was_powered: self.position = self.slot.position + self.slot.powered_offset * ( time / 0.3) if not self.powered and self.was_powered: self.position = self.slot.position + self.slot.powered_offset - self.slot.powered_offset * ( time / 0.3) if self.firing: for projectile in self.projectiles: if time >= projectile.fire_time: if time <= projectile.hit_time: if not projectile.active: self.sprite.set_frame_loop(5, 11, False) projectile.active = True else: if projectile.hit and projectile.active: projectile.detonate() def tuplify(self): return (self.id, )