游戏可以运行
This commit is contained in:
61
game/projectile.py
Normal file
61
game/projectile.py
Normal file
@@ -0,0 +1,61 @@
|
||||
import pygame
|
||||
import math
|
||||
from game.config import COLOR_WHITE, COLOR_ORANGE, COLOR_CYAN
|
||||
from game.utils import distance
|
||||
|
||||
|
||||
class Projectile:
|
||||
def __init__(self, x, y, target, damage, proj_type="arrow", splash=0, slow_factor=0, slow_duration=0):
|
||||
self.x = x
|
||||
self.y = y
|
||||
self.target = target
|
||||
self.damage = damage
|
||||
self.proj_type = proj_type
|
||||
self.splash = splash
|
||||
self.slow_factor = slow_factor
|
||||
self.slow_duration = slow_duration
|
||||
self.speed = 400
|
||||
self.alive = True
|
||||
|
||||
def update(self, dt, enemies):
|
||||
if not self.alive:
|
||||
return
|
||||
|
||||
if not self.target or not self.target.alive:
|
||||
self.alive = False
|
||||
return
|
||||
|
||||
tx, ty = self.target.x, self.target.y
|
||||
dx = tx - self.x
|
||||
dy = ty - self.y
|
||||
dist = math.hypot(dx, dy)
|
||||
|
||||
move = self.speed * dt
|
||||
if dist <= move:
|
||||
self._hit(enemies)
|
||||
else:
|
||||
self.x += dx / dist * move
|
||||
self.y += dy / dist * move
|
||||
|
||||
def _hit(self, enemies):
|
||||
self.alive = False
|
||||
if self.proj_type == "cannon" and self.splash > 0:
|
||||
for e in enemies:
|
||||
if e.alive and distance(self.target.x, self.target.y, e.x, e.y) <= self.splash:
|
||||
e.take_damage(self.damage)
|
||||
else:
|
||||
self.target.take_damage(self.damage)
|
||||
|
||||
if self.proj_type == "slow" and self.target.alive:
|
||||
self.target.apply_slow(self.slow_factor, self.slow_duration)
|
||||
|
||||
def draw(self, surface):
|
||||
if not self.alive:
|
||||
return
|
||||
ix, iy = int(self.x), int(self.y)
|
||||
if self.proj_type == "arrow":
|
||||
pygame.draw.circle(surface, COLOR_WHITE, (ix, iy), 3)
|
||||
elif self.proj_type == "cannon":
|
||||
pygame.draw.circle(surface, COLOR_ORANGE, (ix, iy), 5)
|
||||
elif self.proj_type == "slow":
|
||||
pygame.draw.circle(surface, COLOR_CYAN, (ix, iy), 4)
|
||||
Reference in New Issue
Block a user