回答:感谢@AndyProwl 向我指出了一些问题,我发现问题出在我的 ScreenImage.Update() 函数中。我在为该函数编写实现时来回失败(因为 ScreenImage 不需要更新,它只需要绘制)并且当我删除实现时不知何故不小心将更新函数留在了我的界面上......
让这成为对您的孩子的警告。~你知道的越多~
原始问题:
我正在制作一个游戏,并且我有一个Screen
对象可以跟踪给定屏幕上的项目(即图像、文本、菜单选项等)。Screen
我的目标是以抽象对象的形式传递这些项目,而抽象ScreenElements
对象又可以定义为更具体的对象,例如 aScreenImage
或ScreenText
等。
我试图让向量(基本上将其视为 ScreenElements 的堆栈)通过使其成为指向基对象的指针向量来与不同的继承类一起玩得很好,但这意味着我必须声明继承的对象来自ScreenElements
函数外部,因此当声明超出范围时指针不会变为无效。所以我在我的 Screen 对象中创建了一个函数,允许我“AddElement”,我认为相同的指针方法可以工作......它显然没有。
这是我的源代码,只是为了澄清问题。这是 Screen.h。
#ifndef SCREEN_H
#define SCREEN_H
#include <vector>
#include "ScreenElement.h"
class Screen
{
protected:
bool enabled;
std::vector<ScreenElement*> screen_elements;
public:
//Gameloop Functions
void Init();
void Update(int ticks); //Enabled will likely determine if this is called
void Draw(); //And this perhaps on a visible bool
void Destroy();
//Concept functions
//void TransitionIn(data);
//void TransitionOut(data);
void AddElement(ScreenElement *Element); //function in question
//Allow external use of enabled feature
void ToggleEnable(bool Enabled) { enabled = Enabled; }
bool IsEnabled() { return enabled; }
};
#endif // SCREEN_H
还有我的 Screen.cpp 文件
#include "Screen.h"
void Screen::Init()
{
enabled = true;
}
void Screen::Update(int ticks)
{
for(int i = 0; i < screen_elements.size(); i++)
screen_elements[i]->Update(ticks);
}
void Screen::Draw()
{
for(int i = 0; i < screen_elements.size(); i++)
screen_elements[i]->Draw();
}
void Screen::Destroy()
{
screen_elements.clear();
}
void Screen::AddElement(ScreenElement *Element)
{
screen_elements.push_back(Element);
}
我需要我的 AddElement 来处理任何继承形式的 ScreenElement,例如 ScreenImage,并将其存储到向量中。
编辑:我想我也应该从我的 ScreenElement 类中提供一些源代码。当我尝试添加一个虚拟析构函数时,除了第一个似乎与继承类的构造函数有关的错误(在函数 ScreenImage::ScreenImage() 中未定义对'vtable for ScreenImage'的引用)之外,它只会导致另一个错误。所以这是我的 ScreenElement.h
#ifndef SCREENELEMENT_H
#define SCREENELEMENT_H
#include "Globals.h"
class ScreenElement
{
protected:
s_Position screen_position;
bool enabled;
public:
virtual void Update(int ticks) {}
virtual void Draw() {}
virtual void Destroy() {}
void ToggleEnable(bool Enabled) { enabled = Enabled; }
bool IsEnabled() { return enabled; }
};
#endif // SCREENELEMENT_H
这又被用来创建 ScreenImage.h
#ifndef SCREENIMAGE_H
#define SCREENIMAGE_H
#include "Globals.h"
#include "ScreenElement.h"
#include "SpriteSheet.h"
class ScreenImage: public ScreenElement
{
private:
SpriteSheet *sprite_sheet;
int sprite_sheet_frame;
public:
void Init(SpriteSheet *Sprite_Sheet, float X, float Y, int SpriteSheetFrame = 0);
void Update(int ticks);
void Draw();
void Destroy();
};
#endif // SCREENIMAGE_H
并且在 ScreenImage.cpp 中有自己的基本功能实现。