如何在继承的类中使用抽象方法?

时间:2017-06-06 14:08:41

标签: c# inheritance types xna monogame

我目前正在开展一个周五和周五的学校项目。我有很多事要做。 任务是使用Monogame制作带有XNA框架的视频游戏。我目前正在处理碰撞。

gameobjects的结构看起来有点像这样: enter image description here

对于碰撞,我有一个简单的碰撞类

     class Collision{

public GameObject Other;

public GameObject Obj1;

public Collision(GameObject obj1, GameObject other)
{
    Other = other;
    Obj1 = obj1;
}}

碰撞在GameObject类的静态方法中处理:

public static void UpdateCollisions()
{
    //Empty the list
    AllCollisions.Clear();

    for (int a = 0; a < AllGameObjectsWithCollision.Count; a++)
    {
        GameObject obja = AllGameObjectsWithCollision[a];
        for (int b = 0; b < AllGameObjectsWithCollision.Count; b++)
        {
            GameObject objb = AllGameObjectsWithCollision[b];

            if (obja.Mask != null & objb.Mask!= null && obja != objb)
            {
                if (obja.Mask.CollisionRectangle.Intersects(objb.Mask.CollisionRectangle))
                    AllCollisions.Add(new Collision(obja, objb));
            }
        }
    }

}

到目前为止它正在发挥作用,游戏正在寻找所有碰撞。但是现在我需要让我的对象知道它们会发生碰撞,并告诉他们该怎么做。 为此,我将实体类抽象为能够声明一个名为&#34; OnCollision(碰撞碰撞)的抽象方法&#34;

&#13;
&#13;
abstract class Entity : GameObject
{
    public float Health;
    public float MaxHealth;
    public bool Alive;
    public float OriginalDmg;
    public float Dmg;

    public abstract void OnCollision(Collision collision);
}
&#13;
&#13;
&#13;

然后我重写了继承Entity类

的类中的方法

实施例。弹

&#13;
&#13;
class Projectile : Entity
{
    Entity Owner;
    ProjectileType pType;

    public Projectile(Texture2D image, float maxSpeed, Entity owner, float dmg, ProjectileType type)
    {
        Image = image;
        MaxSpeed = maxSpeed;
        AccelerationSpeed = MaxSpeed;
        Owner = owner;
        Dmg = dmg;
        pType = type;
    }

    public override void OnCollision(Collision collision)
    {
        #region If this projectile friendly
        if (pType == ProjectileType.Friendly)
        {
            //If colliding with an enemy
            if (collision.Other.GetType() == typeof(Enemy))
            {
                var enemy = (Enemy)collision.Other;
                enemy.Health -= Dmg;
                Destroy(this);
            }
        }
        #endregion

        #region If this projectile is hostile
        if (pType == ProjectileType.Hostile)
        {

        }
        #endregion
    }
}
&#13;
&#13;
&#13;

然后我试图从GameObject类中的Update调用OnCollision方法。 这就是我尝试通知我的对象是否有碰撞以及他们与之碰撞的方式:

&#13;
&#13;
        if (GetType().IsAssignableFrom(typeof(Entity)))
        {
            Entity entity = (Entity)this;

            if (GetType() == typeof(Player))
                entity = (Player)this;
            if (GetType() == typeof(Enemy))
                entity = (Enemy)this;
            if (GetType() == typeof(Projectile))
                entity = (Projectile)this;

            var entityCol = FindCollision(entity);

            if (entityCol != null)
                entity.OnCollision(entityCol);
        }
&#13;
&#13;
&#13;

我刚接触抽象课程&amp;压倒一切,所以我可能会把整个想法弄错。 但似乎OnCollision方法还没有达到,因为我已经尝试过Debug.WriteLine的东西,但输出窗口中没有显示任何东西。

感谢阅读&amp;或许试图帮助我:))

Mediafire link下载项目以防您想要查看所有代码。

2 个答案:

答案 0 :(得分:2)

您应该阅读interfaces。接口提供了派生类必须实现的契约(一堆方法和属性)。抽象类比接口更具体,因为它们还可以为派生类提供基本实现。您只能从一个抽象类派生,而您可以从多个接口派生。从帖子中的代码看起来你正在使用像接口这样的抽象类。

您正在使用反射进行类型检查。测试类型兼容性有is关键字。例如:

if(entity is Player)
{
    var player = (Player)entity;

    // player specific code
}

最后;从我可以从你的帖子中收集到的内容看起来你并没有正确使用继承。您似乎正确地使用继承来构建类型层次结构,然后将所有逻辑放在基类中。

继承是为了让你将专用逻辑放在适当的类中。

public interface IGameObject
{
    void OnCollision(IGameObject target);
}

public class Player : IGameObject
{
    public void OnCollision(IGameObject target)
    {
         Console.WriteLine("Player collision");
    }
}

public class Projectile : IGameObject
{
    public void OnCollision(IGameObject target)
    {
         Console.WriteLine("Projectile collision");
    }
}

当我们引用IGameObject并调用OnCollision时,将自动调用相应的OnCollision函数。例如:

IGameObject player = new Player();
IGameObject projectile = new Projectile();

player.OnCollision(projectile);
projectile.OnCollision(player);

输出:

Player collision
Projectile collision

答案 1 :(得分:1)

呃,如果陈述错了......

使用

if (GetType().IsSubclassOf(typeof(Entity)))

修好了。

愚蠢的错误,我的坏。