我目前正在开展一个周五和周五的学校项目。我有很多事要做。 任务是使用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));
}
}
}
}
到目前为止它正在发挥作用,游戏正在寻找所有碰撞。但是现在我需要让我的对象知道它们会发生碰撞,并告诉他们该怎么做。 为此,我将实体类抽象为能够声明一个名为&#34; OnCollision(碰撞碰撞)的抽象方法&#34;
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;
然后我重写了继承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
}
}
&#13;
然后我试图从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);
}
&#13;
我刚接触抽象课程&amp;压倒一切,所以我可能会把整个想法弄错。 但似乎OnCollision方法还没有达到,因为我已经尝试过Debug.WriteLine的东西,但输出窗口中没有显示任何东西。
感谢阅读&amp;或许试图帮助我:))
Mediafire link下载项目以防您想要查看所有代码。
答案 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)))
修好了。
愚蠢的错误,我的坏。