Come dovrei configurare questo tipo per essere intuitivo?

3

Ho i seguenti tipi:

data Bomb = TimedBomb   { bPos :: Point, bPower :: Float, detTime :: Float }

data Enviro = Enviro { bombs :: [Bomb], stuff :: [Picture]}

Quando il timer TimedBomb raggiunge 0, ho bisogno che esploda, danneggi eventuali nemici all'interno del suo raggio di esplosione (controllato da bPower ), e permetti per alcuni secondi di aggiungere alla possibilità che causi danni. Per fare ciò, stavo pensando di creare un altro oggetto che rappresenta un'esplosione, quindi controlla se alcuni nemici sono all'interno dei suoi limiti. Il problema è che non riesco a pensare al miglior set-up per contenere le esplosioni che si stanno verificando. Sto usando la libreria Gloss di Haskell, quindi la totalità di ciò che viene disegnato deve essere contenuta all'interno di un singolo oggetto "mondo". Quello che ho pensato:

  1. Potrei fare un'esplosione un tipo di Bomb , tenerlo in bombs nell'ambiente e mappare su bombs quando voglio controllare le collisioni. Sembra la strada più semplice, ma potrebbe comportare probabilmente controlli su non esplosione- Bombs , che è inefficiente. L'esplosione non è nemmeno una bomba; è il risultato finale, quindi i tipi non hanno un senso intuitivo.

  2. Potrei trasformare le esplosioni in un tipo separato, quindi aggiungere un altro campo a Enviro chiamato esplosioni di tipo [Esplosione]. Ciò ha più senso, ma aggiunge un altro campo a Enviro , che tende già ad essere un tipo disordinato.

  3. Potrei pensare a tutto il set-up in modo errato, e c'è un terzo modo più sensato per farlo.

Qualsiasi commento qui sarebbe apprezzato

    
posta Carcigenicate 07.11.2014 - 17:44
fonte

1 risposta

5

La chiave per la chiarezza è la separazione

Devi separare i dati costanti di Bomb dallo stato mutabile:

data Bomb
  = Bomb 
  { bPos    :: Point
  , bPower  :: Float
  , bState  :: BombState
  }
  deriving (Eq,Read,Show)

data BombState
  = Armed       { detTime :: Float }
  | Discharging { expTime :: Float }
  deriving (Eq,Read,Show)

data Enviro
  = Enviro
  { bombs :: [Bomb]
  , stuff :: [Picture]
  }
  deriving (Eq,Read,Show)

isDischarging (Discharging _) = True
isDischarging  _              = False

exploding :: Enviro -> [Bomb]
exploding = filter (isDischarging . bState) . bombs

Ciò ti consentirebbe di aggiungere più stati successivamente, come Disarmed e Inert

data BombState
  = Armed       { detTime :: Float }
  | Discharging { expTime :: Float }
  | Disarmed    ( remTime :: Float }
  | Inert
    
risposta data 08.11.2014 - 18:15
fonte

Leggi altre domande sui tag