Come evitare un singleton in questo esempio?

5

Ho una classe Image e un'altra ImageStore. L'immagine è solo un oggetto valore contenente il nome del pacchetto e il nome dell'immagine. ImageStore esegue tutto il lavoro effettivo: calcola il percorso reale dell'immagine (in base al pacchetto e al nome dell'immagine) e lo carica dal server.

Ora ho una gerarchia di nodi abbastanza grande (e profonda) (questo è un motore di rendering per un gioco) quindi ad esempio ora sono in un gruppo e voglio inserire una nuova immagine. Lo faccio:

var image = new Image("packageName", "imageName");

In questo momento l'immagine non ha ancora alcuna dimensione, in quanto non desidero codificare le dimensioni dell'immagine (in questo caso questa può essere una tessera, che non è sempre 64 * 32 per esempio) nella mia vista di gioco.

  • quando l'immagine viene aggiunta al gruppo (suppongo che il gruppo sia già collegato al renderer) , il gruppo verrà invalidato
  • il Renderer richiederà un nuovo rendering di frame.
  • analizzerà l'albero gerarchico del nodo e quando troverà l'immagine che ho aggiunto prima
  • richiederà ImageStore (o TileImageStore, questo non solo memorizza la larghezza e l'altezza ma anche il punto centrale inferiore della tessera, solo quando il centro inferiore della tessera non corrisponde al centro in basso punto dell'immagine reale.) per ImageData;
  • ImageStore ora carica il pacchetto, che ha anche le informazioni sulla larghezza e l'altezza;
  • applicherà la nuova larghezza e altezza all'immagine e imposterà un flag come caricato.

Mi piacerebbe avere in qualche modo ImageStore staccato dal rendering. Per poter utilizzare solo Image e ImageStore senza la necessità del renderer.

Modifica Voglio farlo perché mi piacerebbe conoscere la dimensione di un'immagine anche quando l'immagine non è renderizzata. Per ottenere l'immagine bisogna chiedere a ImageStore le dimensioni, l'ancora e imageData. I pacchetti sono come questi:

package = {image01: {base64: "very very long string", width: 10, height: 20, anchorX: 1, anchorY: 10}}

Solo dopo che ImageStore carica questo grande file è in grado di conoscere la larghezza / altezza dell'immagine;

    
posta Totty.js 05.03.2013 - 23:19
fonte

2 risposte

3

Devi solo creare ImageStore e passarlo in una Renderer che fai. Non c'è motivo per singleton qui.

    
risposta data 06.03.2013 - 13:32
fonte
0

Senza conoscere davvero ulteriori dettagli:

Suggerisci di rinominare la struttura Image esistente, in ImageInfo E crea un nuovo oggetto chiamato SelfLoadingImage, che ha un'interfaccia 'Immagine' che il Renderer può usare per ottenere dati di pixel reali o altro.

Quindi sotto la cappa, come vengono recuperati i dati dei pixel è un problema diverso a cui il Renderer non interessa. Ora puoi, ad esempio, avere un HardcodedImage a scopo di test.

Nel caso di un SelfLoadingImage, ha un costruttore che prende un ImageInfo e un ImageStore e li usa quando è necessario. Ma queste istanze di SelfLoadingImage vengono aggiunte come oggetti 'Immagine' al tuo sistema di rendering.

    
risposta data 06.03.2013 - 13:35
fonte

Leggi altre domande sui tag