我正在使用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
的定位。
然而,如果有一种推荐或更有效的方法来处理这个问题,我现在想在养成习惯之前先学习它。有更好的方法吗?
感谢您的任何建议!
答案 0 :(得分:2)
在您的示例中,您似乎正在创建3个类来实现精灵内的位图:
您的方法完全有效,并且您不会遇到任何问题。事实上,没有一种最好的方法可以做到这一点。什么是最好的取决于上下文。但是,如果您将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的mouseChildren
和buttonMode
属性很有帮助,但这取决于您希望鼠标交互的工作方式。
==回复评论==
将位图定位在注册中心:
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类本身的容器(“继承”)。