Files

128 lines
3.3 KiB
Python

from game.util import *
import pygame as pg
import math
class Enemy(pg.sprite.Sprite):
def __init__(self, game, speed, health):
super().__init__()
self.game = game
self.waypoints = self.game.tilemap.waypoints
self.speed = speed
self.angle = 0
self.health = health
self.image = pg.transform.rotate(self.game.assets['enemy'].copy(), self.angle)
self.rect = self.image.get_rect()
self.pos = pg.Vector2(
tile_to_pixel(self.waypoints[0], self.game.tilemap.tile_size, True)
)
self.target_index = 1
self.rect.center = self.pos
self.healthbar = HealthBar(
18,
5,
self.health
)
def update(self):
self.move()
self.rotate()
def move(self):
if self.target_index >= len(self.waypoints):
return
tile_size = self.game.tilemap.tile_size
self.target = pg.Vector2(
tile_to_pixel(
self.waypoints[self.target_index],
tile_size,
True
)
)
direction = self.target - self.pos
distance = direction.length()
if distance <= self.speed:
self.pos = self.target
self.target_index += 1
else:
direction = direction.normalize()
self.pos += direction * self.speed
def rotate(self):
dist = self.target - self.pos
self.angle = math.degrees(math.atan2(-dist[1], dist[0]))
self.image = pg.transform.rotate(self.game.assets['enemy'].copy(), self.angle)
self.rect = self.image.get_rect()
self.rect.center = self.pos
def render(self, surf, camera):
zoom = camera.zoom
scaled_rect = self.rect.scale_by(zoom)
scaled_image = pg.transform.scale(
self.image,
(scaled_rect.size[0], scaled_rect.size[1])
)
scaled_pos = camera.world_to_screen(self.pos)
scaled_rect.center = scaled_pos
surf.blit(scaled_image, scaled_rect)
self.healthbar.render(
surf,
camera,
self.pos,
self.rect.height
)
def take_damage(self, amount):
self.health -= amount
self.healthbar.hp = self.health
if self.health <= 0:
self.kill()
class EnemyGroup(pg.sprite.Group):
def render(self, surf, camera):
for enemy in self.sprites():
enemy.render(surf, camera)
def update(self):
for enemy in self.sprites():
enemy.update()
class HealthBar():
def __init__(self, w, h, max_hp):
self.w = w
self.h = h
self.hp = max_hp
self.max_hp = max_hp
def render(self, surf, camera, pos, enemy_height):
ratio = self.hp / self.max_hp
world_pos = (
pos.x - self.w / 2,
pos.y + enemy_height / 2 -20
)
screen_pos = camera.world_to_screen(world_pos)
scaled_w = self.w * camera.zoom
scaled_h = self.h * camera.zoom
bg_rect = pg.Rect(screen_pos[0], screen_pos[1], scaled_w, scaled_h)
fg_rect = pg.Rect(screen_pos[0], screen_pos[1], scaled_w * ratio, scaled_h)
pg.draw.rect(surf, "red", bg_rect)
pg.draw.rect(surf, "green", fg_rect)