首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的c++游戏架构

我的c++游戏架构
EN

Stack Overflow用户
提问于 2012-12-26 22:41:30
回答 2查看 2.4K关注 0票数 7

我是一个相当有经验的程序员,但我对c++的OOP体系结构和设计还比较陌生。我的大部分经验是使用C#和Java。最近,我努力在c++中编写一个简单的游戏引擎。我用SDL来绘制图形。在这篇文章中,我想讨论一下我的架构,并得到一些反馈。特别是,我遇到了一个设计问题,我想要一些帮助。所以,下面是:

  • 在我的主要功能中,我初始化了用于绘制到屏幕上的所有SDL内容,等等。
  • 然后实例化我打算使用的所有对象:地板、墙壁、播放器等。
  • 接下来,我启动主循环。该循环执行每个对象的运动、碰撞检测和碰撞处理功能,并重新绘制它们。
  • 主循环一直运行到应用程序退出为止,每次迭代都绘制一个框架。

我的问题是:我试图做一种界面风格的设计。它涉及一系列允许每个对象实现行为的抽象基类。例如,如果我想要一个对象是可移动的,那么它必须从包含一个名为move()的虚拟函数和一些位置坐标的可移动基类继承。如果我希望它是可碰撞的,对象将从冲突抽象类继承,该类包含虚拟函数checkCollision()handleCollision()以及hitbox成员变量。像播放器这样的对象继承了这两个基类以及其他几个基类。

只要我在主循环中手工完成所有工作,这就足够好了。我只能说:

代码语言:javascript
复制
player.move();
player.checkCollision();
player.handleCollision();
player.draw(). 

一切都很好。但我希望主循环中有一个向量或泛型对象数组,并执行如下操作:

代码语言:javascript
复制
for each object in vector
    if object is of type movable
        object.move();
    if object is of type collidable
        object.checkCollision();

我原以为我可以通过动态铸造来完成这个任务,但我真的没有任何办法。我尝试过将它们存储为空指针,但这并不是我所希望的那样。我一直在阅读这个游戏对象组件架构,我可能会尝试,但我真的很想挽救我已经写好的东西。我觉得这是一个很好的学习机会。如果有人有任何想法,我会很感激的。与其他简单的游戏引擎设计相比,我的架构如何?我的界面架构有意义吗?还是完全不稳定?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-26 23:12:52

如果您在C++中工作,可以尝试SFML,它比SDL要快,如果您知道OpenGL,也可以使用它。

对于你的问题:

代码语言:javascript
复制
class Entity {
     //constructor and other stuff
     void virtual exec() =0; ///<= pure virtual method
};

class Movable : Entity {
    void move(); //do somthing
    void exec() {move();};
};

class Collidable : Entity {
   void col(); //do your job
   void exec(){col();};
};

std::vector<Entity*> e_v;
///push some instance
for (Entity* e : e_v)
   e->exec();
票数 9
EN

Stack Overflow用户

发布于 2012-12-27 14:39:22

如何在基类中使用模板方法模式和非抽象的空虚拟函数?

代码语言:javascript
复制
class Entity
{
    void update()
    {
        move();
        checkCollision();
    }

    virtual void move() {}
    virtual void checkCollision() {}
};

class Movable : public virtual Entity
{
    virtual void move() {}   // Stuff
};

class Collidable : public virtual Entity
{
    virtual void checkCollision() {}   // Stuff
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14047165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档