首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将数据传递给OOP对象?

如何将数据传递给OOP对象?
EN

Software Engineering用户
提问于 2016-04-25 07:19:36
回答 1查看 569关注 0票数 3

我对这件事并不熟悉,所以请告诉我,如果我做错了,我的问题是否有更好的地方。

我正在制作一个基本系统的游戏,投弹,npcs和物品。这个游戏将有多个变体的每一种类型。为了这个例子的目的,将有一个子弹弹,一个火箭弹丸,和一个手枪发射子弹。

我对这样一个系统的唯一体验是在Terraria的源代码中,其中的条目都是在一个巨大的if-否则树中定义的。

代码语言:javascript
运行
复制
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个不同的代码区域--特别是如果你想添加任何额外的效果,比如释放光线,燃烧敌人等等。

我试着用更好的格式来做这件事。我想出了一个简单的系统,用嵌套的类。

代码语言:javascript
运行
复制
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
    { ... }
}

在这个系统中,创建一个项目,而不是使用类似的

代码语言:javascript
运行
复制
Projectile.CreateProjectile(int id, ...)
{
    Projectile projectile = new Projectile(id);
}
...
Projectile.CreateProjectile(ProjectileID.Bullet, ...);

我有过

代码语言:javascript
运行
复制
Projectile.CreateProjectile<T>(...) where T : Projectile, new()
{
    T projectile = new T(id);
}
...
Projectile.CreateProjectile<ProjectileData.Bullet>(...);

看起来和运作都很好。

但是,我遇到了一个问题:如果我想创建一个射弹的项目,我就不能引用它。例如,使用基于id的系统,我可以编写如下内容

代码语言:javascript
运行
复制
item.projectileType = ProjectileID.Bullet

但是不可能为这样的属性分配一个类。

我想这可以归结为两个问题:

  • 这是将数据传递给对象的“正确”方式,还是有更好的结构?
  • 是否有一种方法来引用类,并在运行时在泛型方法调用中使用该引用?
EN

回答 1

Software Engineering用户

回答已采纳

发布于 2016-04-25 09:20:27

使用工厂模式。工厂是创建对象的对象。

所以当你有一个武器发射射弹的时候,把一个ProjectileFactory传递给它,然后把弹丸的创建留给那个类。

然后,您可以使用不同的类来扩展ProjectileFactory,如BulletProjectileFactoryExplosiveProjectileFactoryGravityAffectedProjectileFactoryHomingProjectileFactory等,它们用不同的游戏机制创建子弹。

例如,当您想要创建一支发射子弹的枪,子弹以每勾8.0像素的速度飞行时,可以造成12点伤害并使用雪碧"bullet.png“,您可以这样写:

代码语言:javascript
运行
复制
 Weapon pistol = new Weapon( new BulletProjectileFactory( 8.0f, 12, "bullet.png") );

然后,武器类的fire()方法将执行以下操作

代码语言:javascript
运行
复制
 projectileFactory.createProjectile();
票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/316686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档