我已经在我的hero.as3类中创建了一个名为IHero的接口。 英雄类是写的,所以它可以在movieclip类中继承来处理运动等等。但不知怎的,我无法弄清楚如何用一个好的实践来编码。
也许我的方向错了。
我想要一个movieclip子类,例如,它将是一个英雄。
我是否应该使用以下方法在英雄级别中实施IHero,或者这是否过度杀伤? - 我想我正在寻找一个界面应该是什么以及什么不应该的答案。这是界面。
package com.interfaces
{
public interface IHero
{
//movement
function MoveLeft():void;
function MoveRight():void;
function MoveUp():void;
function MoveDown():void;
//in battle
function DoDamage(isCasting:Boolean):void;
function DoHeal():void;
function Flee():void;
function TakeDamage():void;
function IsAlive():Boolean;
function CheckDeath():void;
function Die():void;
}
}
答案 0 :(得分:0)
通常,您需要一个扩展movieclip的常规类定义,然后将您的英雄动画片段设置为在actionscript选项的导出中使用该类。您的游戏很可能根本不需要界面。
答案 1 :(得分:0)
我认为你正在 正确的轨道上,无论正确的一个 错误的是否总是主观的。但如果你确实想走这条路,我建议你阅读Mick West的this article。它已经有几年了,但它仍然非常适用。
我认为你真的有两个不同的接口,但可能更多
public interface IMoveable {
function moveLeft(obj:DisplayObject):void;
function moveRight(obj:DisplayObject):void;
function moveUp(obj:DisplayObject):void;
function moveDown(obj:DisplayObject):void;
function Flee(obj:DisplayObject);
}
public interface IFightable {
function doDamage(withWeapon:IEquipableWeapon);
function takeDamage(fromWeapon:IEquipableWeapon);
function get isAlive():Boolean;
function checkDeath():void;
function Die():void;
function doHeal();
function get health():Number;
}
然后...
public class SimpleMover implements IMoveable {
// The movement implementation
// for example:
public funciton moveLeft(obj:DisplayObject) {
obj.x = obj.x -= 10;
}
}
public class SimpleFighter implements IFightable {
// The fighting implementation
private var _health:Number = 100;
function doDamage(withWeapon:IEquipableWeapon) {
_health -= withWeapon.damage;
}
}
然后将这些内容注入MovieClip
的子类Hero
。
public class Hero extends MovieClip {
private var _mover:IMoveable;
private var _fighter:IFightable;
public function Hero(mover:IMoveable, fighter:IFightable) {
_mover = move;
_fighter = fighter;
}
}
在这里,您使用Hero
类作为Component Manager和Render组件,这与West在文章中讨论的内容略有不同,但我离题了。但是这个想法是你的经理(Hero
)或多或少变成了一个协调者,代理回调所有组件适用的回调;调用_mover
和fighter
上的方法来完成您的实际工作。
使用这样的方法有一些优点,还有一些缺点。首先,它的设置更复杂;它需要你真正喜欢组件以及代码的每个逻辑组块将要做什么。但另一方面,它将您的实现彼此分离,使其更易于测试和可重用。您也可以随时更换组件(编译时或运行时),这可以在创建新实体时提供一些灵活性。
但无论如何,它只是暗示你似乎在调情的略有不同的范例。也许你会从中获得一些好处。但如果你还没有,那绝对可以阅读这篇文章。
还要研究(比如检查API)Unity Engine,它具有类似的聚合与继承模型,其中接口是抽象的关键。
答案 2 :(得分:0)
只是澄清一下 - 接口是实现的,而不是继承的。因此,您创建的实现IHero的类的类型无关紧要。因此,要创建一种实现Ihero的库类,请扩展一个显示对象,如Sprite或MovieClip,然后使用implements关键字指示该类实现Ihero。
添加Ihero方法,您现在拥有一个实现iHero的显示对象类。它可能看起来像这样(注意没有提供构造函数)
package
{
import flash.display.Sprite;
import com.interfaces.IHero;
/**
* ...
* @author Zachary Foley
*/
public class MyDisplayObkect extends Sprite implements IHero
{
public function MoveLeft():void
{
// Add Implementation here;
}
public function MoveRight():void
{
// Add Implementation here;
}
public function MoveUp():void
{
// Add Implementation here;
}
public function MoveDown():void
{
// Add Implementation here;
}
//in battle
public function DoDamage(isCasting:Boolean):void
{
// Add Implementation here;
}
public function DoHeal():void
{
// Add Implementation here;
}
public function Flee():void
{
// Add Implementation here;
}
public function TakeDamage():void
{
// Add Implementation here;
}
public function IsAlive():Boolean
{
// Add Implementation here;
}
public function CheckDeath():void
{
// Add Implementation here;
}
public function Die():void
{
// Add Implementation here;
}
}
}