簡體   English   中英

如何在繼承的類中使用抽象方法?

[英]How to use abstract methods in inherited classes?

由於星期五,我目前正在做一個學校項目,還有很多工作要做。 任務是使用Monogame使用XNA框架制作視頻游戲。 我目前正在處理碰撞。

游戲對象的結構如下所示: 在此處輸入圖片說明

對於碰撞,我有一個簡單的碰撞課程

     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));
            }
        }
    }

}

到目前為止,游戲正在尋找所有應有的碰撞。 但是,現在我需要讓我的對象知道它們正在碰撞,並告訴他們該怎么做。 為此,我使實體類成為抽象類,以便能夠聲明一個名為“ OnCollision(Collisionflict)”的抽象方法。

 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); } 

然后我在繼承Entity類的類中重寫方法

防爆。 彈丸

 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 } } 

然后,我嘗試從GameObject類中的Update調用OnCollision方法。 這是我嘗試通知對象是否碰撞以及與誰碰撞的方法:

  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); } 

我是抽象類和重寫的新手,所以我可能把整個想法弄錯了。 但是似乎在我嘗試Debug.WriteLine時未達到OnCollision方法,但是在輸出窗口中沒有任何顯示。

感謝您的閱讀,並嘗試幫助我:)

如果您想查看所有代碼,請使用Mediafire鏈接下載項目。

您應該閱讀接口 接口提供了派生類必須實現的協定(一堆方法和屬性)。 抽象類比接口更具體,因為它們還可以提供派生類的基本實現。 您只能從一個抽象類派生,而您可以從多個接口派生。 從帖子中的代碼看來,您正在使用抽象類(如接口)。

您正在使用反射進行類型檢查。 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

嗯,如果聲明錯了...

使用

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

修復。

愚蠢的錯誤,我不好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM