2010-07-06 8 views
0

У меня есть png-изображение в библиотеке, которое я объявил через класс «Свойства как фон», который расширяет BitmapData. Когда я печатаю:
var BMDClass:Class = getDefinitionByName("Background") as Class; Я получаю: переменная Фон не определен !! Но когда я: trace(getQualifiedClassName(new Background(0,0))); Я получаю: Фон !! Я не могу понять причину ошибки.Почему я получаю эту ошибку

ответ

1

Я считаю, что это потому, что вам нужно иметь ссылку на класс Background, прежде чем вы сможете получить определение по имени. Просто импортирование класса Background не будет компилировать класс в ваш swf, вам нужно каким-то образом ссылаться на него. Создание экземпляра класса является одним из способов, однако вы можете также ссылаться на класс после импорта.

попробовать что-то вроде ...

import com.somedomain.Background; 
Background; 

Это должно создать ссылку на вас класс и убедиться, что он компилируется в ваш SWF.

Редактировать, чтобы показать использование нескольких классов.

Если у вас есть несколько фоновых классов, я бы рекомендовал попробовать их привязать к интерфейсу. Затем я также создаю фабричный заводский класс, который позволит вам создавать фоновые экземпляры из вашего файла конфигурации. Это также означает, что вы могли бы поместить все свои ссылки на свои фоновые классы в заводском классе. Вот как может выглядеть фабрика.

// let the compiler know we need these background classes 
import com.somedomain.backgrounds.*; 
DarkBackground; 
LightBackground; 
ImageBackground; 

class BackgroundFactory 
{ 
    public function create(type:String):Background 
    { 
     var bgClass:Class = getDefinitionByName(type) as Class; 
     return new bgClass(); 
    } 
} 

Затем, чтобы получить фоновую экземпляр из вашей конфигурации, вы могли бы сделать что-то вроде ...

// parse your config file...not sure what format you've got it in. 

// instantiate a background factory and create an instance based on the name from your config. 
var bgFactory:BackgroundFactory = new BackgroundFactory(); 
var bg:Background = bgFactory.create(someStr); 

Редактировать расширить пример

package com.somedomain.background 
{ 
    interface Background 
    { 
     function get img():Bitmap; 
    } 
} 

package com.somedomain.background 
{ 
    class SomeImageBackground extends Sprite implements Background 
    { 
     protected var _img:Bitmap; 

     public function SomeImageBackground():void 
     { 
      _img = new SomeAssetFromLibrary(); 
     } 

     public function get img():Bitmap 
     { 
      return _img; 
     } 
    } 
} 

Используя эти внешние классы будут дают вам немного больше контроля над тем, откуда появляются изображения. Вы можете загружать их внешние, внедрять их, используя метаданные встраивания и даже загружать их со сцены.

+0

Я думаю, что вы правы. Я тестирую его, как вы предлагаете и работали! Но теперь гибкость getDefinitionByName заблокирована, так как мне придется создавать экземпляр класса, но я хотел бы получить его экземпляр по его имени, чтобы использовать файл конфигурации. Можете ли вы предложить решение? – Ponty

+0

Я попытался дать более подробный ответ о том, как вы можете это сделать с вашим конфигурационным файлом. Дайте мне знать, если это имеет смысл. –

+0

эй человек очень благодарен за много идей! У меня еще один вопрос: вы пишете: import com.somedomain.backgrounds. *; но как вы помещаете свои изображения в этот пакет? Я имею в виду, что я использую либо флэш-библиотеку, либо конвертирую изображение в пользовательский подкласс BitmapData или (как раз перед тем, как немного я нашел) тег Embed, например [Embed (source = "image.png")] public Background1: Класс . Как вы достигаете, чтобы удовлетворить все ваши пользовательские графические классы в пакете? Как вы определяете интерфейс, если классы созданы только что я вам говорил раньше? Использовать интерфейс как маркер? Можешь ли ты показать мне? – Ponty

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