[英]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.