Sto creando un gioco RPG in cui un giocatore ha una serie di abilità, ognuna delle quali può salire di livello per migliorare il suo effetto. Ecco due abilità di esempio:
-
health
: aumenta la salute massima del giocatore -
regeneration
: lentamente rigenera la salute perduta del giocatore
Le abilità hanno molti attributi simili, come name
, description
, maximum_level
, e alcuni callback di eventi che indicano cosa dovrebbe fare l'abilità, quindi ho pensato che dovrei forse creare una classe e queste sarebbero istanze di essa :
class Skill:
def __init__(self, name, description, max_level, level=0):
self.name = name
self.description = description
self.max_level = max_level
self.level = level
self.event_callbacks = {}
def register_callback(self, event_name):
def decorator(f):
self.event_callbacks[event_name] = f
return f
return decorator
health_skill = Skill('health', 'increase player\'s maximum health', 8)
@health_skill.register_callback('player_spawn')
def on_player_spawn(skill, player):
player.maximum_health += skill.level * 5
regeneration_skill = Skill('regeneration', 'regenerate player\'s lost health back', 8)
@regeneration_skill.register_callback('time_tick_second')
def on_second_tick(skill, player):
if player.health < player.maximum_health:
player.health = max(player.health + skill.level, player.maximum_health)
player.skills.extend([health_skill, regeneration_skill])
E questo sistema funziona bene, ma ecco il problema: il mio gioco può avere più giocatori e ognuno di essi ha bisogno della propria istanza di ogni abilità. Ora ho bisogno di capire in qualche modo una buona struttura dove posso
- crea facilmente competenze
- crea facilmente più istanze di ogni abilità
Qualche idea di una buona struttura? Metaclassi? Subclassing? Di solito, come fanno i giochi?
Modifica: questa struttura simile è usata in molti giochi popolari come League of Legends, Dota 2, Hearthstone, ecc ... Un altro buon esempio di questo problema è eroi / campioni in questi giochi: ciascuno l'eroe è simile e ovviamente hanno una base comune, ma ogni eroe ha bisogno di molti attributi di istanza personalizzati come salute, mana, livello, ecc.