4

我正在使用FlashDevelopIDE 学习 AS3 并Flex进行编译。

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

敌人

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.

但是,如果有推荐的或更有效的方法来处理此问题,我想在养成习惯之前立即学习它。有一个更好的方法吗?

感谢您的任何建议!

4

3 回答 3

2

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

  • 敌人扩展位图
  • EnemyContainer 扩展 Sprite
  • 主要扩展 Sprite

你的方法是完全有效的,你不会有问题的。事实上,没有一种最好的方法来做到这一点。什么是最好的取决于上下文。但是,如果您将 Enemy 实现为 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 的mouseChildrenandbuttonMode属性很有帮助,但这取决于您希望鼠标交互如何工作。

==回复评论==

将位图定位在注册中心:

var temp:Bitmap = new EnemyBitmap() as Bitmap;
temp.x = -temp.width/2;
temp.y = -temp.height/2;
addChild(temp);
于 2013-05-16T18:22:05.937 回答
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);
    }
}
于 2013-05-16T18:23:03.187 回答
-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 类本身的容器(“继承”)。

于 2013-05-16T17:46:40.463 回答