AS3 - 将位图包装到Sprite容器中的最佳或推荐方法是什么?

时间:2013-05-16 17:18:41

标签: actionscript-3 flex

我正在使用FlashDevelop IDE和Flex来学习AS3以进行编译。

我通过创建Bitmap类然后在代码中嵌入.png来添加图像,例如:

Enemy.as

package enemies 
{

import flash.display.Bitmap;
import flash.events.MouseEvent

[Embed(source="../../assets/gardengnome.png")]

public class Enemy extends Bitmap 
{
    public function Enemy() 
    {
        trace("enemy constructed");
    }
}

}

我了解到,为了能够处理MouseEvent,我需要将此Bitmap放入Sprite容器中。

现在,不知道这是我做的最好方式:

我创建了一个新变量来保存enemyContainer中的Main.as并将其添加到舞台中:

package 
{
 import enemies.Enemy;
 import enemies.EnemyContainer;
 import flash.display.Sprite;
 import Player.Player;

 public class Main extends Sprite 
 {
   public var enemyContainer:EnemyContainer = new EnemyContainer();

     public function Main():void 
 {
   addChild(enemyContainer);
 }
}
}

然后EnemyContainer类调用保存图形的Enemy Bitmap并将其作为子项添加到自身:

package enemies 
{

import flash.display.Sprite;
import flash.events.MouseEvent


public class EnemyContainer extends Sprite 
{
    private var enemy:Enemy = new Enemy();

    public function EnemyContainer() 
    {
        trace("enemyContainer constructed");

        addChild(enemy);

        addEventListener(MouseEvent.CLICK, handleClick);
    }

    private function handleClick(e:MouseEvent):void 
    {
        trace("Clicked Enemy");
    }

}

}

我还没有足够的经验来看待这样做的任何问题。我可以更改Enemy Bitmap课程中的图片而无需处理任何其他内容,Main.as可以处理EnemyContainer的定位。

然而,如果有一种推荐或更有效的方法来处理这个问题,我现在想在养成习惯之前先学习它。有更好的方法吗?

感谢您的任何建议!

3 个答案:

答案 0 :(得分:2)

在您的示例中,您似乎正在创建3个类来实现精灵内的位图:

  • Enemy扩展了Bitmap
  • EnemyContainer扩展Sprite
  • Main扩展Sprite

您的方法完全有效,并且您不会遇到任何问题。事实上,没有一种最好的方法可以做到这一点。什么是最好的取决于上下文。但是,如果您将Enemy作为EnemyContainer的一部分实现,您可能会发现它更容易管理,因此您只有两个类:

  • 主要
  • EnemyContainer

在EmemyContainer中,你为敌人的位图创建一个私有类,如下所示:

package enemies 
{

import flash.display.Sprite;
import flash.events.MouseEvent


public class EnemyContainer extends Sprite 
{

    [Embed(source="../../assets/gardengnome.png")]
    private EnemyBitmap:Class;

    public function EnemyContainer() 
    {
        trace("enemyContainer constructed");

        addChild(new EnemyBitmap()); // Creates a new instance of your bitmap class.

        addEventListener(MouseEvent.CLICK, handleClick);


    }

    private function handleClick(e:MouseEvent):void 
    {
        trace("Clicked Enemy");
    }

}

}

您可能还会发现使用Sprite的mouseChildrenbuttonMode属性很有帮助,但这取决于您希望鼠标交互的工作方式。

==回复评论==

将位图定位在注册中心:

var temp:Bitmap = new EnemyBitmap() as Bitmap;
temp.x = -temp.width/2;
temp.y = -temp.height/2;
addChild(temp);

答案 1 :(得分:0)

你在做什么是好的

如果你想要更少的类,你也可以在容器类中嵌入位图

public class Enemy extends Sprite
{
    [Embed(source="../../assets/gardengnome.png")]
    private var assetClass:Class;

    private var asset:Bitmap;

    public function Enemy()
    {
       //init the class
       //do this in a seperate method, because the constructor is executed by a just in time compiler. Means less code better performance.
       init();
    }

    private function init():void
    {
        asset = new assetClass();
        addChild(asset);
    }
}

答案 2 :(得分:-1)

高尚的努力,但尝试将其作为最佳实践:

public class Enemy extends Sprite 
{
    public function Enemy() 
    {
      var bmp = new EnemyBitmap();   // what is currently your Enemy class should be EnemyBitmap
      addChild(bmp);
    }
}

这种技术称为“实现”,其中将所需的类(Bitmap)加载到容器中,而不是扩展Bitmap类本身的容器(“继承”)。