Domanda

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 usare immagini incorporate (che devono essere manipolate con rotazione, colore, ecc.).

Sfortunatamente, dopo aver investigato un po ', sembra che tu debba incorporare manualmente le immagini prima di poterle usare. Al momento l'ho installato in questo modo:

File di classe Resource.as:

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

Quindi, solo per una nave per cui devo:

  

Metti l'immagine nella cartella corretta con il nome corretto   Denominalo nello stesso modo nel file Resource.as   Crea la costante con lo stesso nome nel file Resource.as

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

Per peggiorare le cose, devo ancora chiamarlo usando:

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

Devono esserci modi migliori per gestire le risorse quando si creano applicazioni molto grandi? Immagina di aver bisogno di migliaia di immagini, questo sistema semplicemente non si adatterebbe.

È stato utile?

Soluzione

anziché

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

Usa

myImage.source = Resource.SHIPS_1;

L'incorporamento è corretto. : D il modo in cui lo usi è sbagliato :)

Adrian

Altri suggerimenti

Se devi gestire un gran numero di risorse puoi seguire questi 3 passaggi:

  1. Inseriscili in un archivio zip non compresso

  2. Incorpora il file zip come dati binari:

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

  3. Accedi alle risorse usando FZip

Se scegli un metodo diverso che prevede il caricamento di file esterni, tieni presente che alcuni siti Web di giochi flash richiedono che i giochi che ospitano siano contenuti in un singolo file swf.

Questo è davvero lo scopo di Flash CS4. Mi sembra che tu vada bene, anche se non userei tutte le maiuscole per un nome di classe, anche se è una costante. Abbassa la testa e copia e incolla!

In alternativa puoi caricare i file in fase di esecuzione.

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

Uso un approccio diverso. Creo un filmato swf con Flash Professional e importare tutta la grafica in esso, quindi contrassegnarli tutti per & Quot; Esporta per ActionScript & Quot ;. Compila SWF e nel tuo progetto principale incorpora solo SWF e accedi a tutta la grafica attraverso di essa ...

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

Ho appena visto questo fantastico tutorial sul framework Starling: http://www.hsharma.com/tutorials/ partendo-con-starling-ep-3-sprite tecniche /

Sembra che gli spritesheets siano esattamente ciò che stai cercando: Raggruppa tutte le singole trame in un'unica grande trama che si chiama foglio di calcolo e crea un file xml che contiene informazioni in cui le trame si trovano all'interno del foglio di calcolo. Per fare ciò puoi usare questo strumento: http://www.codeandweb.com/texturepacker

Non sono sicuro che puoi usarlo per progetti commerciali e la quantità di texture di cui stai parlando non sembra che lo stai facendo solo per hobby, quindi potresti voler controllare la licenza. È disponibile anche una versione pro.

Texturepacker crea due file: spritesheet.png e spritesheet.xml. Li copi 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 puoi accedere a tutte le trame dello spritesheet chiamando

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

È semplicemente fantastico. Quando usi texturepacker, il nome file di ciascuno degli sprite che hai raggruppato nel foglio sprite diventa il suo nome testo.

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

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

Dipende da quanto sono grandi le tue singole immagini ma potresti metterle tutte in un'unica immagine come uno sprite. Se vuoi disegnare una nave particolare usa l'offset xy corretto nell'immagine per quella nave e usa copyPixels per disegnarla sulla tua bitmap.

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

Mi piace fare le mie lezioni in Biblioteca in questo modo.

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 {}

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

Buona idea, ok

Questa è una bella soluzione come Source-Engine con vtf e vmt vtf = immagine vmt = script (come xml o javascript)

Bene, vorrei suggerire per TexturePacker, TexturePath o TextureTarget: P

Grazie per la punta.

Ad esempio: mytexture.js:

xml o javascript:

  

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

Non credo perché la trama predefinita ottiene un errore da qualche parte mytexture.png non esiste più di quanto non accada :)

  

[Incorpora (fonte = " ../ assets / editors / error_texture.png ")] statico pubblico   const ERROR_TEX: classe; ...

Come faccio a sapere perché Actionscript 3 dovrebbe " leggi " a javascript come jsBirdge o ExternalInterface.call ();

È possibile?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top