Ho chiesto a domanda sulla strutturazione di un gioco di Tower Defense qualche tempo fa, e alla fine ho utilizzato il modello di peso vivo per le mie torri. Ecco cosa guarda ora il mio TowerType
(sto usando Python ma sto cercando risposte generiche per l'architettura):
class TowerType:
def __init__(self, name, image, attack_speed, damage,
splash_radius, range, cost, upgrade, purchasable):
self.name = name
self.image = image
... # etc
E in realtà carico questi tipi dinamicamente da un file JSON:
[
{
"name": "Arrow Tower 1",
"image": "images/arrow.png",
"attack_speed": 1.5,
"damage": 10,
"splash_radius": 0,
"range": 80,
"cost": 80,
"upgrade": "Arrow Tower 2",
"purchasable": true
},
{
"name": "Arrow Tower 2",
...
},
...
]
Ora la mia classe Tower
non fa molto altro che cercare obiettivi e attaccarli:
class Tower(Entity):
def __init__(self, type_, x=0, y=0):
self.type = type_
self.x = x
self.y = y
self._attack_timer = self.type.attack_speed
def update(self, dt, game): # This is called from the main/game loop
self._attack_timer += dt
time_between_attacks = 1 / self.type.attack_speed * 1000
if self._attack_timer >= time_between_attacks:
self._attack_timer -= time_between_attacks
self.attack(game.monsters)
def find_target(self, monsters):
for monster in monsters:
if distance(self.position, monster.position) <= self.type.range:
return monster
return None
def attack(self, monsters):
target = self.find_target(monsters)
if target is None:
return
if self.type.splash_radius == 0:
target.health -= self.type.damage
return
# Splash damage!
for monster in monsters:
dist = distance(monster.position, target.position)
if dist > self.type.splash_radius:
continue
monster.health -= self.type.damage * (1 - dist / self.type.splash_radius)
Il problema è che le mie torri danneggiano immediatamente i servitori nemici. Quello che voglio è una specie di proiettili che volano dalla mia torre al mostro nemico. Sto cercando aiuto su come strutturare questi proiettili nel mio sistema:
- Devo spostare
damage
esplash_radius
daTowerType
aProjectileType
, o dovrei semplicemente copiarlo daTower
aProjectile
? - Desidero quindi anche una classe
ProjectileType
, o dovrei semplicemente creare% randomProjectile
s al volo? - Dovrei provare a mettere i proiettili anche nel JSON? Dovrebbero essere in un file JSON separato o dovrei metterli all'interno delle torri corrispondenti?
- Qualcosa che mi è sfuggito?