gpt4 book ai didi

c# - 在 C#/XNA 中使用通用函数进行碰撞检测

转载 作者:太空宇宙 更新时间:2023-11-03 20:28:12 25 4
gpt4 key购买 nike

我正在用 C#/XNA 制作一个物理引擎,我有三个基本对象...

球体立方体飞机

都是从

派生的

游戏对象

我将我所有的对象存储在一个游戏对象列表中,我想遍历这个列表并能够调用一个 CheckCollision 函数,该函数将为每对对象转到正确的函数

例如

go 是一个球体,

go2 是一个球体

if(CheckCollision(go, go2))
{
//do stuff
}

bool CheckCollision(Sphere one, Sphere two)
{
//Check Sphere to Sphere
}

bool CheckCollision(Sphere sphere, Plane plane)
{
//Check Sphere to Plane
}

我希望它能直接转到正确的函数,而不必使用 if 检查。

谢谢。

最佳答案

你可以使用虚拟调度:

abstract class GameObject
{
abstract bool CheckCollision (GameObject other);
abstract bool CheckCollision (Sphere other);
abstract bool CheckCollision (Cube other);
abstract bool CheckCollision (Plane other);
}

class Sphere : GameObject
{
override bool CheckCollision (GameObject other) { return other.CheckCollision(this); }
override bool CheckCollision (Sphere other) { /* ... implementation ... */ }
override bool CheckCollision (Cube other) { /* ... implementation ... */ }
override bool CheckCollision (Plane other) { /* ... implementation ... */ }
}

class Cube : GameObject
{
override bool CheckCollision (GameObject other) { return other.CheckCollision(this); }
override bool CheckCollision (Sphere other) { /* ... implementation ... */ }
override bool CheckCollision (Cube other) { /* ... implementation ... */ }
override bool CheckCollision (Plane other) { /* ... implementation ... */ }
}

class Plane : GameObject
{
override bool CheckCollision (GameObject other) { return other.CheckCollision(this); }
override bool CheckCollision (Sphere other) { /* ... implementation ... */ }
override bool CheckCollision (Cube other) { /* ... implementation ... */ }
override bool CheckCollision (Plane other) { /* ... implementation ... */ }
}

编辑

想想当你拥有这个时会发生什么:

GameObject go1 = new Sphere();
GameObject go2 = new Cube();
bool collision = go1.CheckCollision(go2);
  • 调用球体上的抽象 GameObject.CheckCollision(GameObject) 方法。
  • 虚拟调度意味着我们去 Sphere.CheckCollision(GameObject)
  • Sphere.CheckCollision(GameObject) 调用立方体上的抽象 GameObject.CheckCollision(Sphere) 方法。
  • Virtual dispatch 意味着我们去 Cube.CheckCollision(Sphere)!

因此,不需要类型检查 if 语句。

编辑 2

请参阅 Eric Lippert 在 https://stackoverflow.com/a/2367981/385844 上的回答;第一个选项——访问者模式——本质上就是上面概述的方法。 Eric 在 https://stackoverflow.com/a/9069976/385844 的其他回答也讨论了这个问题。

关于c# - 在 C#/XNA 中使用通用函数进行碰撞检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9164612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com