我非常喜欢拥有一个能够适应能力的游戏引擎,不仅仅是它能做什么,还有它如何处理新代码.最近,对于我的图形子系统,我编写了一个class覆盖的方法,其工作原理如下:
class LowLevelGraphicsInterface {
virtual bool setRenderTarget(const RenderTarget* renderTarget) = 0;
virtual bool setStreamSource(const VertexBuffer* vertexBuffer) = 0;
virtual bool setShader(const Shader* shader) = 0;
virtual bool draw(void) = 0;
//etc.
};
Run Code Online (Sandbox Code Playgroud)
我的想法是创建一个在大多数图形API中通用的函数列表.那么对于DirectX11,我只想创建一个新的孩子class:
class LGI_DX11 : public LowLevelGraphicsInterface {
virtual bool setRenderTarget(const RenderTarget* renderTarget);
virtual bool setStreamSource(const VertexBuffer* vertexBuffer);
virtual bool setShader(const Shader* shader);
virtual bool draw(void);
//etc.
};
Run Code Online (Sandbox Code Playgroud)
然后,这些功能中的每一个都将DX11直接连接.我确实意识到这里有一层间接.人们是否被这个事实所关闭?
这是一种广泛使用的方法吗?还有什么我可以/应该做的吗?可以选择使用预处理器,但这对我来说似乎很麻烦.有人还向我提到了模板.你们有什么感想?
我正在研究我的引擎的核心,我在Microsoft Visual c ++ express中遇到了严重的链接问题.
为了简化问题,导致问题的是这两个头文件,每个头文件都有一个具有不同标识符的命名空间.这两个文件实际上包含了彼此.编译时没有错误,但是在链接时,错误显示"X已在A.obj中定义".下面提供了一个示例:
HEADER 1
#ifndef HEADER1_H
#define HEADER1_H
#include "header2.h"
namespace Core{
int x, y, z;
}
#endif
Run Code Online (Sandbox Code Playgroud)
HEADER 2
#ifndef HEADER2_H
#define HEADER2_H
#include "header1.h"
namespace GUI{
int x, y, z;
}
#endif
Run Code Online (Sandbox Code Playgroud)
最终发生的是我得到一个错误,指出x,y和z变量已经在创建的第一个.obj文件中定义.我假设因为变量来自不同的命名空间,所以它们不会发生碰撞.我也有标题保护,因此头文件似乎不会被多次包含.
无论如何,任何形式的帮助或建议将不胜感激.我被困在这3天左右:P.另外,如果我没有提供足够的信息,请告诉我,这只是我目前的代码非常长.
干杯,乔伊