2017-02-16 4 views
1

私はHemanth SharmaのStarlingビデオチュートリアルに従おうとしています。私は彼の2番目のビデオ(linked here)で行ったようにコードを入力しましたが、私は同じ結果を得るのが難しいです。私のコードは、氏シャルマさんをマッチとして登場したときにまずこのEmbed&Textureでコードが作成されないのは何ですか?

は、:

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"); 

、私は氏シャルマのコードでエラーが出る理由は、氏シャルマはAssets[name]を使用してアクセスしclassObjは、nullに初期化していることであることを確認することができています。

Mr. Sharmaには静的変数の値を設定するコンストラクタがありません。したがって、埋め込みメタタグはこのフィールドへの値の割り当てと関係があると仮定します。

私のコードをそのファイルからコピーして下に貼り付けます。

  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

アセット[name]というコードでは、「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; 
} 

StarlightのUIボタンではなく、Feathers UI Buttonを使用しています(Feathers Buttonsの機能は豊富ですが、そのアイデアは同じです)。

関連する問題