我正在尝试制作一些游戏引擎(我知道,应该做一个实际的游戏)。 可悲的是在项目结构上失败了。看起来像这样(我第五次尝试的足迹):
#include <iostream>
#include <vector>
#include <windows.h>
using namespace std;
class Player;
class Engine {
private:
CHAR_INFO *chiBuffer;
int width = 0;
int height = 0;
vector <Player> players;
public:
Engine(int x = 120, int y = 30) {
chiBuffer = new CHAR_INFO[x*y];
}
void addPlayer(Player player) {
players.push_back(player);
}
void render() {
for (int i = 0; i < players.size(); i++) {
Player *player = &players[i];
player->draw();
}
}
protected:
inline CHAR_INFO& getPixel(int x, int y) { return chiBuffer[x + width * y]; }
};
class Drawable : Engine {
protected:
inline CHAR_INFO& getPixel(int x, int y) { return Engine::getPixel(x, y); }
virtual void draw() = 0;
};
class Player : Drawable {
protected:
int x = 0;
int y = 0;
public:
void draw() {
getPixel(x, y).Char.UnicodeChar = L'*';
}
};
int main() {
Engine *eng = new Engine(120, 30);
Player p;
eng->addPlayer(p);
return 0;
}
我想使其易于扩展,因此在我脑海中诞生了一个创建主类(Engine)子类的想法Drawable wich将具有draw()方法,而Tickable wich将具有onTick()等..但是我很确定我做错了。你能告诉我更好的主意吗?或使其正常工作,因为这给了我太多错误,无法在此处编写(VS 2017)
答案 0 :(得分:0)
首先,为什么要使用它?
for (int i = 0; i < players.size(); i++) {
Player *player = &players[i];
player->draw();
}
与以下各项相同:for(...) { players[i].draw() ;}
。
不要在不需要的地方使用变量和指针(就像在您的main中一样,不要使用new关键字:这毫无意义。Engine e = Engine(120,30)
可以。)
向量上的for循环应使用Iterators:
for (auto it = begin (vector); it != end (vector); ++it) {
it->draw;
}
按照良好的做法,应将代码编写在不同的文件中。
Engine.h用于引擎声明,Engine.cpp用于实现。
播放器也一样。