2009-06-27 12 views
13

Sto creando un gioco in cui vengono utilizzate molte immagini in Actionscript/Flex 3 (Flash). Ora che ho raggiunto la fase di progettazione, devo elaborare un modo strutturale di utilizzare le immagini incorporate (che devono essere manipolate con rotazione, colore, ecc.).Come incorporare le immagini in Actionscript 3/Flex 3 nel modo giusto?

Sfortunatamente, dopo aver esaminato un po ', sembra che sia necessario inserire manualmente le immagini prima di poterle utilizzare. Al momento ho è messa a punto in questo modo:

Resource.as file di classe:

package 
{ 
    public final class Resource 
    { 
     [Embed (source="/assets/ships/1.gif")] 
     public static const SHIPS_1:Class; 
    } 
} 

Così, solo per una nave che così per devo:

mettere l'immagine nella cartella corretta con il nome corretto nome nello stesso modo nei Resource.as il file Creare il costante con lo stesso nome nelle Resource.as presentare

Anche se ciò dovrebbe essere possibile semplicemente inserendo il file in una cartella specificata.

Per rendere le cose ancora peggiori, ho ancora chiamare utilizzando:

var test:Bitmap = new Resource.SHIPS_1(); 

Ci devono essere modi migliori per gestire le risorse per la creazione di applicazioni molto grandi? Immagina di aver bisogno di migliaia di immagini, questo sistema semplicemente non andrebbe bene.

+2

non so nulla sullo sviluppo del gioco, ma avresti davvero bisogno di incorporare migliaia di immagini? Sembra che lo SWF diventi piuttosto pesante – Ronn

risposta

6

invece di

var test:Bitmap = new Resource.SHIPS_1(); 

Usa

myImage.source = Resource.SHIPS_1; 

L'incorporamento è corretta. : D il modo di usare è sbagliato :)

Adrian

+1

Ma questo modo di incorporare causa un sacco di problemi. Non c'è un modo migliore? – Tom

+0

Modifica: come può essere corretto Resource.SHIPS_1 quando la Risorsa non è nemmeno definita? – Tom

+0

1. Resource.SHIPS_1 deve essere definito in precedenza. 2. Non c'è altro modo .. tranne l'incorporamento nei file css, ma questo è ancora peggio :( –

5

Questo è veramente ciò che Flash CS4 è per. La tua strada mi sembra comunque buona, anche se non userei mai le maiuscole per un nome di classe, anche se è una costante. Basta mettere la testa bassa e ottenere copia-incolla!

In alternativa è possibile caricare i file in fase di esecuzione.

+2

+1 sul caricamento dei file in fase di esecuzione, altrimenti potresti finire con un SWF più grande di quello che realmente dovresti aver bisogno – Jacob

+0

Stai dicendo che dovrei caricarli da un webserver quindi? – Tom

+1

Il (grande) svantaggio di ciò sarebbe che tutti possono semplicemente scaricare tutti i miei contenuti grafici. – Tom

16

Se avete bisogno di gestire un gran numero di risorse è possibile seguire questi 3 passi:

  1. metterli in un archivio zip compresso

  2. Incorporare il file zip come dati binari:

    [Embed (fonte = 'resources.zip', mimeType = 'application/octet-stream')]

  3. accedere alle risorse usin g FZip

Se si sceglie un metodo diverso che coinvolge il caricamento di file esterni essere consapevoli del fatto che alcuni siti web gioco in flash richiedono i giochi che di accoglienza per essere contenuti in un unico file SWF.

1

Dipende quanto è grande il tuo singole immagini sono ma loro tutto ciò che potrebbe mettere in una sola immagine come uno spritesheet. Se vuoi disegnare una particolare nave usa l'offset xy corretto nell'immagine per quella nave e usa copyPixels per disegnarla sulla tua bitmap.

2

Questo è vecchio ma da quando mi sono imbattuto è alla ricerca di qualcosa di diverso scriverò qui per le generazioni future:)

io uso un approccio diverso. Creo un filmato swf con flash professionale e importare tutti gli elementi grafici in esso e quindi contrassegnarli tutti per "Esporta per ActionScript". Compila la swf e nel tuo progetto principale incorpora solo la swf e accedi a tutti i grafici attraverso di essa ...

Trovo questo approccio molto più organizzato. Perché scrivere l'intera classe di risorse quando è possibile farlo importando i file giusto? ;)

+2

Perché gli sviluppatori odiano lo strumento di authoring Flash * uckin (CS5, CS4, Cs3, ecc. Ecc.). È obsoleto, è vecchio. Voglio dire - Adoro Flash ma Adobe ha incasinato il software di authoring Flash. Gli sviluppatori desiderano utilizzare i propri editor di testo di propria scelta in combinazione con la struttura flessibile. Il tuo suggerimento significherebbe che uno sviluppatore ha dovuto passare tra Flash e un editor - e questo fa schifo! – drpelz

+1

Non sono d'accordo, rispettosamente. Anche se odio assolutamente l'ambiente Flash per lo sviluppo (io stesso sono un ragazzo FlashDevelop), quando c'è un ambiente grafico perfettamente funzionante per il layout disponibile, quindi esegui il layout lì!Chi vuole copiare e incollare le coordinate x e y, quando è possibile assemblare il tutto in Flash dai prototipi di Photoshop? Bene, immagino che tutto dipenda dal tuo flusso di lavoro e da quanto di uno sviluppatore pure-play sei. –

+0

@TomAuger C'è ancora un problema con l'utilizzo del software di authoring: è totalmente bloccato dal fornitore. Una volta che la tua opera d'arte entra nell'ambiente Adobe, rimane intrappolata lì per sempre, dal momento che non può essere utilizzata in nessun altro software oltre al costoso bloatware di Adobe. – SasQ

1
package 
{ 
    public final class Resource 
    { 
     [Embed (source="/assets/ships/1.gif")] 
     public static const SHIPS_1:Class; 
    } 
} 
0
[Embed (source="/assets/ships/1.gif")] 
    public static const SHIPS_1:Class; 
0

mi piace fare le mie classi Library Ti piace questa.

ho preso il codice GSkinners per il singleton: http://gskinner.com/blog/archives/2006/07/as3_singletons.html

package 
{ 
    import flash.display.Bitmap; 
    import flash.display.BitmapData; 

    public class Lib 
    { 
     /* 
     Make this an Singleton, so you only load all the images only Once 
     */ 

     private static var instance:Lib; 
     public static function getInstance():Lib { 
      if (instance == null) { 
       instance = new Lib(new SingletonBlocker()); 
      } 
      return instance; 
     } 
     public function Lib(p_key:SingletonBlocker):void { 
      // this shouldn't be necessary unless they fake out the compiler: 
      if (p_key == null) { 
       throw new Error("Error: Instantiation failed: Use Singleton.getInstance() instead of new."); 
      } 
     } 

     /* 
     The actual embedding 
     */ 
     [Embed(source="assets/images/someImage.png")] 
     private var ImageClass:Class; 
     private var _imageClass:Bitmap = new ImageClass() as Bitmap; 

     [Embed(source="assets/images/someOtherImage.png")] 
     private var OtherImageClass:Class; 
     private var _otherImageClass:Bitmap = new ImageClass() as Bitmap; 

     public function get imgClass():Bitmap{ 
      return _imageClass; 
     } 
     public function get imgClassData():BitmapData{ 
      return _imageClass.BitmapData; 
     } 

     public function get otherImageClass():Bitmap{ 
      return _otherImageClass; 
     } 
     public function get otherImageClassData():BitmapData{ 
      return _otherImageClass.BitmapData; 
     } 
    } 
} 
internal class SingletonBlocker {} 
0

[Embed (source = "/ assets/images/123.png")] public static const className: Class;

2

Ho appena visto questa grande esercitazione sul quadro Starling: http://www.hsharma.com/tutorials/starting-with-starling-ep-3-sprite-sheets/

Sembra spritesheets sono esattamente quello che stai cercando: si bundle tutte le texture individuali in un unico grande consistenza che si chiama spritesheet e crea un file xml che contenga informazioni in cui le trame siano all'interno del foglio di sprite. Per farlo puoi usare questo strumento: http://www.codeandweb.com/texturepacker

Non sono sicuro che se lo si può usare per progetti commerciali e la quantità di trame di cui si sta parlando non sembra che lo si stia facendo proprio come un hobby, quindi potresti voler controllare la licenza. C'è anche una versione pro disponibile.

Texturepacker crea due file: spritesheet.png e spritesheet.xml. Li copi semplicemente nel tuo progetto. Quindi aggiungi questo codice a una delle tue classi.

private static var gameTextureAtlas:TextureAtlas; 

    [Embed(source="../media/graphics/mySpriteSheet.png")] 
    public static const AtlasTextureGame:Class; 

    [Embed(source="../media/graphics/mySpritesheet.xml", mimeType="application/octet-stream")] 
    public static const AtlasXmlGame:Class; 

    public static function getAtlas():TextureAtlas 
    { 
     if(gameTextureAtlas==null) 
     { 
      var texture:Texture=getTexture("AtlasTextureGame"); 
      var xml:XML=XML(new AtlasXmlGame()); 
      gameTextureAtlas=new TextureAtlas(texture,xml); 
     } 
     return gameTextureAtlas; 
    } 

Ora è possibile accedere a tutte le texture del spritesheet chiamando

YourClass.getAtlas().getTexture("name"); 

E 'semplicemente impressionante. Quando usi texturepacker, il nome file di ciascuno degli sprite che hai inserito nel foglio sprite diventa il suo texturename.

Probabilmente è troppo tardi per aiutarti, ma spero che i futuri visitatori possano trarre vantaggio da questa soluzione elegante.

Vorrei sottolineare che questa risposta è fondamentalmente un estratto dal tutorial di Sharma. Mi sono persino sentito libero di riprodurre il codice che ha usato nel suo screencast.Tutto il merito va a lui

0

Buona idea, LHK

che è bello soluzione come Source-motore con VTF e vmt VTF = immagine VMT = sceneggiatura (come XML o JavaScript)

bene i vorrebbe suggerire per TexturePacker, TexturePath o TextureTarget: P

Grazie per la mancia.

Ad esempio: mytexture.js:

xml o javascript:

funzione mytexture() {basedir = "/assets/mytexture.png", normalmap = "/ attività/mytexture_bump .png ", normalcube) [1, 1, 1]};

Non credo perché texture di default ottiene errore da qualche parte mytexture.png non esiste quello che succede di nuovo :)

[Embed (source =" ../ assets/editori/error_texture .png ")] public static const ERROR_TEX: Class; ...

Come faccio a sapere perché Actionscript 3 deve "leggere" in javascript come jsBirdge o ExternalInterface.call();

È possibile?

Problemi correlati