面向游戏开发中碰撞检测的优秀面向对象类设计

nul*_*ull 18 oop collision-detection

我想学习如何在游戏开发中为两个对象之间的碰撞创建良好的面向对象(OO)设计实践.

假设我有一个SpaceShip类和一个Meteor类.当Meteor与SpaceShip发生碰撞时,SpaceShip将被摧毁.

问题是:我应该用哪种方法来检查流星和宇宙飞船之间是否存在碰撞以及碰撞解决方法(摧毁宇宙飞船)?是在SpaceShip类还是Meteor类?或者也许我应该放在另一个班级,即.GameArea或GameController类?

注意:为简单起见,假设Meteor和SpaceShip是图像资源的形式.我习惯使用Java语言,但其他语言也可以.

use*_*505 13

认为碰撞检测是不属于Spaceship或Meteor类的责任是更自然的.特别是当它在不同方向上具有多个碰撞可能性时变得复杂.如果将这个逻辑放在这两个类中,则需要引用其周围的许多其他对象,这些对象是不合适的.

你可以在一个单独的类上使用它,例如CollisionDetector,它跟踪游戏空间中所有对象的坐标并检测碰撞.在我看来,防止碰撞似乎也是一个单独的责任,应该属于不同的类别.你可以有一个单独的类CollisionResolver.根据要求,CollisionDetector可以与CollisionResolver交谈.

CollisionResolver可能需要能够与太空飞船交谈,目的是建议他们改变方向,或命令发射导弹朝向流星.

CollisionDetectorCollisionResolver可以位于GameSpace/*GameController*中.等等..

这将促进单一责任原则,因此每个组件只会执行一项重点任务.


App*_*ker 1

嗯,我通常创建一个GameObject具有碰撞方法的(有时是通用的)类或接口。例如:

template< typename T = int > class GameObject
{
public:
    bool collides(const GameObject& obj);
};

// usage
GameObject<int> my_obj, your_obj;
if(my_obj.collides(your_obj)) { ... };
Run Code Online (Sandbox Code Playgroud)

我有时(但很少)做的另一件事是创建一个单独的GamePhysics类:

template< typename T > class GamePhysics
{
public:
    /* you may make this static or the class a singleton */
    void detect_collision(const T& obj, const T& obj2);
};
Run Code Online (Sandbox Code Playgroud)