绘制游戏组件的重构代码
Refactoring code for drawing game components
如何折射以下内容,将绘图函数从h文件移动到GraphicsManager类中?
//drawingFunctions.h
void drawTexturedQuad( Texture texture, Vector2 pos, Vector2 dim) {
// bind texture...
glBegin(...); // draw
//...
glEnd(...);
}
//class file
#include "drawingFunctions.h"
class Player {
void drawPlayer(){ drawTexturedQuad( texture, pos, dim) }
};
class Enemy {
void drawEnemy(){ drawTexturedQuad( texture, pos, dim) }
};
class Item {
void drawItem(){ drawTexturedQuad( texture, pos, dim) }
};
// and so on for the other components
//gameloop file
// instantiate components objects
while (true) {
// input, logic
Player.drawPlayer();
Enemy.drawEnemy();
Item.drawItem();
// and so on
}
(代码显然被简化了,我只是问一下这里的图纸)
我应该…吗
- 将指向GraphicsManager的指针传递到游戏循环中drawPlayer、drawEnemy等的每次调用
- 让玩家、敌人等有一个指向GraphicsManager的指针作为数据成员
- 让Player、Enemy等扩展一个drawableGameComponent类,该类具有指向GraphicsManager的指针作为数据成员
- 还有别的吗
这听起来像是一个完美的继承用例:
class Drawable
{
public:
void draw()
{
// gl stuff
}
protected:
Texture _texture;
Vector2 _pos;
Vector2 _dim;
};
class Player : Drawable
{
public:
// should modify _texture _pos and _dim somewhere.
};
// same thing for the other objects.
我会将一个渲染器传递给模型,并要求它自己绘制。
class Player
{
public:
void draw(Renderer& renderer);
};
class Enemy
{
public:
void draw(Renderer& renderer);
};
请注意,您不必将函数命名为drawPlayer
或drawEnemy
,因为根据类类型,您已经知道它是Player
或Enemy
。这种统一的调用约定非常适合提取到通用接口中:
class Model
{
public:
virtual void draw(Renderer& renderer) = 0;
virtual ~Model() {}
};
然后,您可以让每个模型从Model
继承,并且每个模型实现draw
。
正如我在@J.N.的回答的评论中提到的,你也可以让Renderer是一个抽象类。例如,我参与了一个使用OpenGL、GDI+的项目,还需要创建原理图的打印输出。
class Renderer
{
public:
virtual render(const Triangle& triangle, const Texture& texture) = 0;
virtual ~Renderer() {}
};
我会选择第一种可能性:在调用中将指针传递给GraphicsManager。尽管这看起来有点过头了,但使用GraphicsManager的知识会保持在更高的级别,以后可以更容易地修改。
话虽如此,我仍然会从Drawable接口继承,并将需要绘制的项放在容器中,这样您就可以通过虚拟drawItem()函数对其进行迭代以显示项。像这样(C++03,未测试):
std::vector<Drawable*> Items;
Items.push_back(&player);
Items.push_back(&enemy);
...
for (std::vector<Drawable*>::iterator it = Items.begin(); it != Items.end(): ++it)
{
(*it)->drawItem(&graphMgr);
}
相关文章:
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 重构类:无法将派生类中成员函数的公共代码移回基类
- 重构此代码以进行优化
- 在C++中重构代码
- 将样本代码重构为类,并没有提高过载功能的实例
- 如何将此代码重构为多线程版本
- 使用OTool进行了重构代码的二进制比较
- 如何重构这个类模板以最小化锅炉板代码
- 函数参数已更改:如何重构代码,尽可能少
- 解开高德纳的结:如何重构意大利面条代码?
- 重构多线程方案的单线程 GUI 代码
- 重构代码以使用 Boost 共享指针
- 使用函数对象重构 C++ 代码
- 绘制游戏组件的重构代码
- 代码重构尝试使用多态性和std::map
- 如何重构C++代码以支持动态数组大小
- 有没有一种方法可以将C++11代码重构为C++代码,这些代码可以由能力较弱的编译器编译
- 重构常规c++代码模式
- 用c++中已有的类重构代码
- 不使用goto来重构代码