我对这件事并不熟悉,所以请告诉我,如果我做错了,我的问题是否有更好的地方。
我正在制作一个基本系统的游戏,投弹,npcs和物品。这个游戏将有多个变体的每一种类型。为了这个例子的目的,将有一个子弹弹,一个火箭弹丸,和一个手枪发射子弹。
我对这样一个系统的唯一体验是在Terraria的源代码中,其中的条目都是在一个巨大的if-否则树中定义的。
else if (this.type == 467)
{
this.name = "Fireball";
this.width = 40;
this.height = 40;
this.aiStyle = 1;
this.hostile = true;
this.damage = 10;
}
这种方法的问题是(除了它造成的可怕的混乱),添加新的项目需要修改4-5个不同的代码区域--特别是如果你想添加任何额外的效果,比如释放光线,燃烧敌人等等。
我试着用更好的格式来做这件事。我想出了一个简单的系统,用嵌套的类。
public class ProjectileData
{
public class Bullet : Projectile
{
public float speed;
public Bullet() : base()
{
this.type = ProjectileID.Bullet;
this.damage = 25;
this.origin = new Vector2(9.5f, 2.5f);
speed = 10;
}
public override void AI()
{
this.velocity += new Vector2((float)Math.Cos(rotation), (float)Math.Sin(rotation)) * speed;
}
public override void OnHit()
{
Game.CreateExplosion(this.position);
}
}
public class Rocket : Projectile
{ ... }
}
在这个系统中,创建一个项目,而不是使用类似的
Projectile.CreateProjectile(int id, ...)
{
Projectile projectile = new Projectile(id);
}
...
Projectile.CreateProjectile(ProjectileID.Bullet, ...);
我有过
Projectile.CreateProjectile<T>(...) where T : Projectile, new()
{
T projectile = new T(id);
}
...
Projectile.CreateProjectile<ProjectileData.Bullet>(...);
看起来和运作都很好。
但是,我遇到了一个问题:如果我想创建一个射弹的项目,我就不能引用它。例如,使用基于id的系统,我可以编写如下内容
item.projectileType = ProjectileID.Bullet
但是不可能为这样的属性分配一个类。
我想这可以归结为两个问题:
发布于 2016-04-25 09:20:27
使用工厂模式。工厂是创建对象的对象。
所以当你有一个武器发射射弹的时候,把一个ProjectileFactory
传递给它,然后把弹丸的创建留给那个类。
然后,您可以使用不同的类来扩展ProjectileFactory,如BulletProjectileFactory
、ExplosiveProjectileFactory
、GravityAffectedProjectileFactory
、HomingProjectileFactory
等,它们用不同的游戏机制创建子弹。
例如,当您想要创建一支发射子弹的枪,子弹以每勾8.0像素的速度飞行时,可以造成12点伤害并使用雪碧"bullet.png“,您可以这样写:
Weapon pistol = new Weapon( new BulletProjectileFactory( 8.0f, 12, "bullet.png") );
然后,武器类的fire()
方法将执行以下操作
projectileFactory.createProjectile();
https://softwareengineering.stackexchange.com/questions/316686
复制相似问题