2017-02-16 6 views
1

Я пытаюсь следовать учебным видеороликам Starling от Hemanth Sharma. Я набрал код, как он сделал на своем втором видео (linked here), но мне трудно получить те же результаты.Что мне недостает в этом встраивании и текстуре создать код?

Сначала, когда мой код соответствует г Шарма и появился как:

var bitmap:Bitmap = new Assets[name](); 
gameTextures[name] = Texture.fromBitmap(bitmap); 

я получил ошибку, используя этот код. Ошибка указала, что я пытаюсь создать экземпляр класса из не-объекта.

Я проследил процесс кода, разбив его на этапы. Теперь мой код выглядит как:

trace("Building for", name); 
var classObj : Class = Assets[name]; 
trace("Class", classObj); 
var bitmap : Bitmap = new classObj() as Bitmap; 
trace("Bitmap", bitmap); 
trace("Assign value"); 
Assets["gameTextures"][name] = Texture.fromBitmap(bitmap); 
trace("Value assigned"); 

Используя этот код, я могу видеть, что причина, я получаю сообщение об ошибке с кодом г Шарма является то, что classObj, что г-н Шарма обращается с помощью Assets[name], инициализирует null ,

Mr. Sharma не имеет конструктора для установки значения статических переменных, поэтому я предполагаю, что метатег Embed имеет какое-то отношение к присвоению значения этому полю.

Я скопирую код из этого файла и вставив его ниже.

  1. Кто-нибудь видит, где я делаю свою ошибку?

  2. Может ли кто-нибудь объяснить, как работать с метатегами, чтобы я мог найти ошибку с большим количеством навыков, чем сейчас?

Assets.as:

package 
{ 
    import flash.display.Bitmap; 
    import flash.utils.Dictionary; 

    import starling.textures.Texture; 

    public class Assets 
    { 
     [Embed(source="../media/graphics/bgWelcome.jpg")] 
     public static const BgWelcome:Class; 

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

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

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

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

     private static var gameTextures:Dictionary = new Dictionary(); 

     public static function getTexture(name: String): Texture 
     { 
      if(Assets.gameTextures[name] == undefined){ 
       trace("Building for", name); 
       var classObj : Class = Assets[name]; 
       trace("Class", classObj); 
       var bitmap : Bitmap = new classObj() as Bitmap; 
       trace("Bitmap", bitmap); 
       trace("Assign value"); 
       Assets["gameTextures"][name] = Texture.fromBitmap(bitmap); 
       trace("Value assigned"); 
      } 
      return Assets.gameTextures[name]; 
     } 
    } 
} 
+0

С кодом Активы [имя] действительны только значения имен «BgWelcome» или «WelcomeHero» или так далее. Тогда Assets.getTexture (...), очевидно, завершится неудачно, потому что словарь Assets.gemeTextures инициализирован, но никогда не заполняется. – Organis

+0

Это хороший момент. Я должен добавить вывод трассировки, чтобы вы могли видеть строку, вызывающую ошибку. Я считаю, что используемая строка - «BgWelcome». –

+0

@Organis, можете ли вы добавить свой комментарий в качестве ответа, чтобы я мог дать вам кредитные баллы. BgWelcome вызывается, как я подозревал, но поскольку я смотрю дальше в трассировку, строка, вызывающая ошибку, фактически является «WelcomePlayBtn», которая должна быть «WelcomePlayButton». –

ответ

1

Вы, а может try..catch это немедленно диагностировать ошибку.

public static function getTexture(name:String):Texture 
{ 
    if (!Assets.gameTextures[name]) 
    { 
     try 
     { 
      var aClass:Class = Assets[name]; 
      var aRaster:Bitmap = new aClass(); 
      Assets.gameTextures[name] = Texture.fromBitmap(aRaster); 
     } 
     catch (fail:Error) 
     { 
      throw "There's no texture <" + name + "> in Assets."; 
     } 
    } 

    return Assets.gameTextures[name]; 
} 
0

Я сейчас работаю над игрой и иметь подобную установку, как у вас, это код, который я использую с успехом:

EmbeddedAssets.as (внутри папки с именем Utils):

package utils 
{ 
    import starling.textures.Texture; 

    public class EmbeddedAssets 
    { 
     [Embed(source = "./../assets/icons/stats.png")] 
     private static const stats:Class; 
     public static const statsButtonTexture:Texture = Texture.fromEmbeddedAsset(stats); 

     Embed(source = "./../assets/icons/stats_down.png")] 
     private static const stats_down:Class; 
     public static const statsButtonDownTexture:Texture = Texture.fromEmbeddedAsset(stats_down); 

    } 
} 

Затем, где-то в моем коде я использую эти ссылки следующим образом:

private function setStatsButtonStyles(button:Button):void 
{ 
    var defaultICon:ImageLoader = new ImageLoader(); 
    defaultIcon.source = EmbeddedAssets.statsButtonTexture; 
    defaultIcon.width = 60; 
    defaultIcon.height = 60; 

    var downIcon:ImageLoader = new ImageLoader(); 
    downIcon.source = EmbeddedAssets.statsButtonDownTexture; 
    downIcon.width = 60; 
    downIcon.height = 60; 

    button.defaultIcon = defaultIcon; 
    button.downIcon = downIcon; 
    button.width = button.height = 60; 
} 

Обратите внимание, что я использую кнопку пользовательского интерфейса Feathers, а не Starling (кнопки «Перья» имеют больше функциональности, но идея такая же).

Смежные вопросы