- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有很多不同的课程。但是,它们都可以保证具有某些方法,例如render()和Activate()。
我的目标是能够将它们全部存储在一个大列表中。目前,我有一个名为Container的大类,并且我做了类似的事情来存储我拥有的许多对象。
class Container{
public:
BUTTON * buttons;
int buttons_len;
DRAW_AREA * draw_areas;
int draw_areas_len;
Container(){
// constructor
}
void render(){
for( int i = 0; i < buttons_len; i++ )
buttons[i].render();
for( int i = 0; i < draw_areas_len; i++ )
draw_areas[i].render();
}
};
// abstract class
class Base{
public:
virtual void render() = 0;
};
class Button : public Base{
public:
int y;
Button(){
y = 10;
}
void render(){
std::cout << "BUTTONS " << y << "\n";
}
};
class Draw_Area : public Base{
public:
int x;
Draw_Area(){
x = 5;
}
void render(){
std::cout << "DRAW AREA " << x << "\n";
}
void extra(){
std::cout << "extra draw_area\n" << x << "\n";
}
};
int main( int argc, char * * argv ){
Base * test_1 = new Button();
test_1->render();
Base * test_2 = new Draw_Area();
test_2->render();
Base * * test = new Base*[4];
test[0] = new Button();
test[1] = new Button();
test[2] = new Draw_Area();
test[3] = new Button();
test[0]->render();
test[1]->render();
test[2]->render();
test[3]->render();
return 0;
}
最佳答案
我有一个工作的游戏-使用现代OpenGL的着色器引擎。该项目具有集成在一起的许多组件。使用的一件事是一系列Manager Class
对象,它们本身都是Singleton对象:
我无法显示完整的类,但将显示包含所有派生的Singleton类型的Singleton基类的枚举:
class Singleton {
public:
// Number Of Items In Enum Type Must Match The Number
// Of Items And Order Of Items Stored In s_aSingletons
enum SingletonType {
TYPE_LOGGER = 0, // MUST BE FIRST!
TYPE_SETTINGS,
TYPE_ENGINE,
TYPE_ANIMATION_MANAGER,
TYPE_SHADER_MANAGER,
TYPE_ASSET_STORAGE,
TYPE_AUDIO_MANAGER,
TYPE_FONT_MANAGER,
TYPE_BATCH_MANAGER,
}; // Type;
// More code below
}; // Singleton
Audio
,
Fonts
,
Animations
,
Game Settings
,
The Main Game Engine
和
Logger
,尽管它们通过上面列出的某些对象使用。
AssetStorage
类将保存所有要呈现的对象的容器。
AssetStorage
还包含其他重要内容,例如加载的纹理,字体,音频文件,gui控件精灵,模型等。
AssetStorage
类的目的在于,它充当负责管理所有内容的数据库。这些对象的记忆。
BatchManager's
的责任,并且这基于优先级队列进行工作,在该优先级队列中,优先级队列由哪个
Batch
最完整或具有
highest priority
的优先级确定在
Z-Depth
上。当
BatchManager
准备好发送顶点数据(例如属性和制服,矩阵等)时,它会查看
ShaderManager
以查看对要准备好渲染的顶点应用什么着色器技术,然后设置属性和制服。
Asset Storage's
头文件的一小段摘录,以便您可以看到有关此类“存储”和“管理”游戏对象或“资产”的内存的容器和方法。
#ifndef ASSET_STORAGE_H
#define ASSET_STORAGE_H
#include "Singleton.h"
#include "CommonStructs.h"
namespace vmk {
class BaseMko;
class GuiElement;
enum GuiType;
struct Texture {
bool hasAlphaChannel;
bool generateMipMap;
bool wrapRepeat;
unsigned uWidth;
unsigned uHeight;
TextureInfo::FilterQuality filterQuality;
std::vector<unsigned char> vPixelData;
Texture( TextureInfo::FilterQuality filterQualityIn, bool generateMipMapIn, bool wrapRepeatIn ) :
hasAlphaChannel( false ),
generateMipMap( generateMipMapIn ),
wrapRepeat( wrapRepeatIn ),
uWidth( 0 ),
uHeight( 0 ),
filterQuality( filterQualityIn )
{}
}; // Texture
class AssetStorage sealed : public Singleton {
private:
typedef std::unordered_map<std::string, std::shared_ptr<BaseMko>> MapMkoAssets;
typedef std::unordered_map<std::string, TextureInfo> MapTextureInfos;
typedef std::unordered_map<std::string, std::shared_ptr<GuiElement>> MapGuiAssets;
MapMkoAssets m_mkoAssets;
MapTextureInfos m_textureInfos;
MapGuiAssets m_guiScreenAssets;
MapGuiAssets m_guiRenderableAssets;
std::vector<std::string> m_vGuiForRemoval;
public:
AssetStorage();
virtual ~AssetStorage();
static AssetStorage* const get();
// Mko Objects
BaseMko* getMko( const std::string& strId ) const;
void add( BaseMko* pMko );
bool removeMko( const std::string& strId, bool removeTexture = false );
void showLoadedMkoObjects() const;
// Texture Objects
TextureInfo getTextureInfo( const std::string& strFilename ) const;
TextureInfo add( const Texture& texture, const std::string& strFilename );
bool removeTextureInfo( const std::string& strFilename );
bool removeTextureInfo( unsigned uTextureId );
void showLoadedTextureInfo() const;
// Gui Objects
GuiElement* getGuiElement( const std::string& strId, GuiType type ) const;
void add( GuiElement* pGui, GuiType type );
bool removeGuiElement( const std::string& strId, bool removeTextures = false );
template<typename T>
bool removeGuiElement( T* pGui, bool removeTextures = false );
void markGuiForRemoval( const std::string& strId );
void cleanOrphanedGuiObjects();
void showLoadedGuiObjects() const;
private:
AssetStorage( const AssetStorage& c ); // Not Implemented
AssetStorage& operator=( const AssetStorage& c ); // Not Implemented
// Gui Objects
GuiElement* getGuiElement( const std::string& strId, const MapGuiAssets& guiMap ) const;
void add( GuiElement* pGui, MapGuiAssets& guiMap );
bool removeGuiElement( const std::string& strId, MapGuiAssets& guiMap, bool removeTextures );
}; // AssetStorage
} // namespace vmk
#endif // ASSET_STORAGE_H
BatchManager
和
ShaderManager
类的声明,但不能向您展示它们的实现。
#ifndef BATCH_MANAGER_H
#define BATCH_MANAGER_H
#include "Singleton.h"
#include "CommonStructs.h"
namespace vmk {
class Batch;
class BatchManager sealed : public Singleton {
private:
std::vector<std::shared_ptr<Batch>> m_vBatches;
unsigned m_uNumBatches;
unsigned m_uMaxNumVerticesPerBatch;
public:
BatchManager( unsigned uNumBatches, unsigned uNumVerticesPerBatch );
virtual ~BatchManager();
static BatchManager* const get();
void render( const std::vector<GuiVertex>& vVertices, const BatchConfig& config, const std::string& strId );
void emptyAll();
private:
BatchManager( const BatchManager& c ); // Not Implemented
BatchManager& operator=( const BatchManager& c ); // Not Implemented
void emptyBatch( bool emptyAll, Batch* pBatchToEmpty );
//void renderBatch( const std::vector<GuiVertex>& vVertices, const BatchConfig& confg );
}; // BatchManager
} // namespace vmk
#endif // BATCH_MANAGER_H
#ifndef SHADER_MANAGER_H
#define SHADER_MANAGER_H
#include "Singleton.h"
#include "ShaderProgramSettings.h"
namespace vmk {
class ShaderManager sealed : public Singleton {
private:
// Number Of Items In enum type Must Match The Number Of Items
// Stored In s_aShaders And In InfoProgram::aShaderIndex
enum ShaderType {
TYPE_VERTEX = 0,
TYPE_FRAGMENT,
}; // ShaderType
struct AttributeVariable{
unsigned uLocation;
AttributeType eType;
int iSize;
AttributeVariable( AttributeType eTypeIn, unsigned uLocationIn );
}; // AttributeVariable
struct UniformVariable{
unsigned uLocation;
UniformType eType;
UniformVariable( UniformType eTypeIn, unsigned uLocationIn );
}; // UniformVariable
typedef std::unordered_map<Attribute, AttributeVariable> MapAttributes;
typedef std::unordered_map<Uniform, UniformVariable> MapUniforms;
struct InfoProgram{
unsigned uId;
std::array<unsigned, 2> aShaderIndex;
MapAttributes mAttributes;
MapUniforms mUniforms;
InfoProgram();
}; // InfoProgram
struct InfoShader{
unsigned uId;
std::string strFilename;
InfoShader( int iOpenglSharedId, std::string strShaderFilename );
}; // InfoShader
typedef std::shared_ptr<InfoProgram> SharedInfoProgram;
typedef std::shared_ptr<InfoShader> SharedInfoShader;
typedef std::vector<SharedInfoProgram> VectorInfoPrograms;
typedef std::vector<SharedInfoShader> VectorInfoShaders;
VectorInfoPrograms m_vPrograms;
std::array<VectorInfoShaders, 2> m_avShaders;
Program m_eEnabledShaderProgram;
unsigned m_uActiveTextureNumber;
public:
ShaderManager();
virtual ~ShaderManager();
static ShaderManager* const get();
void create( ShaderProgramSettings& shaderProgramSettings );
void enable( Program eShaderProgram );
void enableAttribute( Attribute eShaderAttribute, unsigned strideBytes = 0, unsigned offsetBytes = 0, bool normalize = false ) const;
void disableAttribute( Attribute eShaderAttribute ) const;
void setAttribute( Attribute eShaderAttribute, const glm::vec4& v4Value ) const;
void setUniform( Uniform eShaderUniform, const glm::mat4& m4Matrix ) const;
void setUniform( Uniform eShaderUniform, const float fValue ) const;
void setUniform( Uniform eShaderUniform, unsigned uValue ) const;
void setUniform( Uniform eShaderUniform, bool bValue ) const;
void setTexture( unsigned uTextureNumber, Uniform eSamplerUniform, int iTextureId );
private:
ShaderManager( const ShaderManager& c ); // Not Implemented
ShaderManager& operator=( const ShaderManager& c ); // Not Implemented
unsigned initializeShader( ShaderType eType, const std::string& strShaderFilename );
void processAttributes( unsigned uInfoProgramId, Program eShaderProgram, std::vector<ShaderProgramSettings::AttributeInfo>& vAttributes, MapAttributes& mAttributes ) const;
void processUniforms( unsigned uInforProgramId, Program eShaderProgram, std::vector<ShaderProgramSettings::UniformInfo>& vUniforms, MapUniforms& mUniforms ) const;
template<typename T>
void setVertexAttribute( Attribute eShaderAttribute, const T* const pParam, bool bEnable, unsigned strideBytes, unsigned offsetBytes, bool normalize ) const;
void setVertexAttribute( AttributeVariable attrib, const void* const pVoid, bool bEnable, unsigned strideBytes, unsigned offsetBytes, bool normalize ) const;
void setVertexAttribute( AttributeVariable attrib, const float* p4Values, bool _x1_, unsigned _x2_, unsigned _x3_, bool _x4_ ) const;
}; // ShaderManager
#include "ShaderManager.inl"
} // namespace vmk
#endif // SHADER_MANAGER_H
AssetStorage
类中不同类型的容器,然后,当您查看
BatchManager
类时,可以看到用于渲染顶点的函数原型。由
render()
和
emptyBatch()
和
emptyAll()
完成。
Attributes & Properties
。
GameEngine
的责任是使用这些类集来了解何时最有效,最及时地通过
Batch Process
渲染所述顶点,然后应用适当的着色或着色技术。
关于c++ - 多种数据类型的C++列表。遗产?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45003008/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!