Проблема дизайна - создание шрифта Global (C ++, Marmalade) -- c++ поле с участием design-patterns поле с участием fonts поле с участием marmalade пол Связанный проблема

Design Issue - Making a Font Global (C++, Marmalade)


0
vote

проблема

русский

У меня есть проект Marmalade C ++, где встроенный в шрифте не масштабируется на экран. Чтобы справиться с этим вопросом, я делаю пользовательский шрифт, который в основном является PNG и файл .xml, содержащий вектор (0,0) вектора каждого символа, и размер каждого символа. Затем я создаю экземпляр PNG и рисования областей его в цикле для записи на экран.

Проблема у меня есть объем этого класса. Я хочу, чтобы это было использовано на протяжении всего проекта. Таким образом, статический DebugLogger будет использовать этот шрифт, любой пользовательский интерфейс или GameObjects, все, что нужно персонажи, будет использовать этот шрифт. Почти, как он предварительно встроен в систему.

Вестник в этом проекте является статический класс со статическими функциями. Пользовательский класс шрифта у меня в настоящее время имеется Singleton, как и мое понимание, он должен быть экземплярным объектом для программы для его нарисования изображений. Так что я не сделал это статичным. Есть ли четкий отрезок ответа на этот тип проблемы? Вопрос - это статический класс не создаст ссылку на синглтону, и мне сказали, что Singleton следует избегать с точки зрения дизайна!

Спасибо заранее, ребятам!

Вот код для справки:

<Сильные> CustomFONTClass

 <код> #ifndef _CHARACTER_SET_H_ #define _CHARACTER_SET_H_  #include "Iw2D.h" #include "Singleton.h" #include "BaseImage.h" #include <map> #include <string>  typedef CIwArray<std::string> STR_ARR;  class CharacterSet : public Singleton<CharacterSet> { public:     CharacterSet();      void Write(std::string, CIwFVec2, float);     void Write(std::string, float, float, float);     void Write(char, CIwFVec2, float);     void Write(char, float, float, float);      bool IsInitialised() const { return mIsInitialised; }      // Space between characters is equivalent to 1 character width. This float multiplies that number. Default is .55f     void SetFontSpacing(float);  protected:     BaseImage* mspCharacters;     bool Initialise();  private:     std::map<const char, CIwFVec2> mFontMap;     static const std::string TEXTURE_PATH;     static const std::string TEXTURE_NAME;     static const CIwFVec2 mFontSize;         float mFontSpacing;         STR_ARR maTextureLocations;         bool mIsInitialised; };       #define CHARACTERSET Singleton<CharacterSet>::GetInstance()      #endif   

<Сильные> CPP

 <код> #include "Iw2D.h" #include "Singleton.h" #include "BaseImage.h" #include "CharacterSet.h" #include "IwLogger.h" #include <map> #include <sstream> #include <string>  const std::string CharacterSet::TEXTURE_PATH = "textures/"; const std::string CharacterSet::TEXTURE_NAME = "font_main.png"; const CIwFVec2 CharacterSet::mFontSize = CIwFVec2(50, 63);   CharacterSet::CharacterSet() : Singleton<CharacterSet>() {     mFontSpacing = 0.55f;     mIsInitialised = Initialise(); };  void CharacterSet::SetFontSpacing(float spacing) {     if (spacing != NULL)     {         mFontSpacing = spacing;     } };  void CharacterSet::Write(std::string text, CIwFVec2 position = CIwFVec2(50,50), float fontSize = 25.0f) {     if (!text.empty())     {         mspCharacters->SetSize(CIwFVec2(fontSize, fontSize));          float newPosition = 0;         for (char& c : text)         {             mspCharacters->SetPosition(CIwFVec2((position.x + newPosition), position.y));              if (mFontMap.find(c) == mFontMap.end())             {                 std::stringstream ss;                 std::string mCharRef;                 ss << c;                 ss >> mCharRef;                  std::string error = "CharacterSet::mFontMap[" + mCharRef + "] - Does not exist!";                 IW_LOG_ERROR(error);             }             else             {                 mspCharacters->Render(mFontMap[c], mFontSize);             }              newPosition += (fontSize * mFontSpacing);         }     }     else     {         IW_LOG_ERROR("CharacterSet::Write - std::string text is empty!");     }  };  bool CharacterSet::Initialise() {     maTextureLocations.push_back(std::string(TEXTURE_PATH + TEXTURE_NAME));     mspCharacters = new BaseImage(maTextureLocations[0].c_str());      if (mspCharacters == NULL)     {         IW_LOG_ERROR("CharacterSet::mspCharacters - Failed to create BaseImage!");         return false;     }      //Numerical symbols     mFontMap['1'] = CIwFVec2(0, 0);     mFontMap['2'] = CIwFVec2(50, 0);     mFontMap['3'] = CIwFVec2(100, 0);     mFontMap['4'] = CIwFVec2(150, 0);     mFontMap['5'] = CIwFVec2(200, 0); // ect... lots of these   

<Сильный> IwLogger

 <код> #ifndef _IW_LOGGER_H_ #define _IW_LOGGER_H_  #include "IwDebug.h" #include <string>  class IwLogger {     public:         IwLogger();          enum LogLevel         {             INFO,             WARN,             ERROR         };          static void Log(LogLevel level, std::string msg);         static void Log(LogLevel level, std::string callingFunc, std::string msg);          static void LogFailedResource(std::string callingFunc, std::string resourcePath);          static void LogError(std::string msg) { Log(ERROR, msg); }         static void LogWarn(std::string msg) { Log(WARN, msg); }         static void LogInfo(std::string msg) { Log(INFO, msg); }          static void LogError(std::string callingFunc, std::string msg) { Log(ERROR, callingFunc, msg); }         static void LogWarn(std::string callingFunc, std::string msg) { Log(WARN, callingFunc, msg); }         static void LogInfo(std::string callingFunc, std::string msg) { Log(INFO, callingFunc, msg); } };  #define IW_LOG_ERROR(msg) IwLogger::LogError(__FUNCTION__, msg) #define IW_LOG_WARN(msg) IwLogger::LogWarn(__FUNCTION__, msg) #define IW_LOG_INFO(msg) IwLogger::LogInfo(__FUNCTION__, msg)  #define IW_LOG_FAILED_RES(resPath) IwLogger::LogFailedResource(__FUNCTION__, resPath)  #endif   

<Сильные> CPP

 <код> #include "CharacterSet.h" #include "IwLogger.h"  void IwLogger::Log(IwLogger::LogLevel level, std::string msg) {     switch (level)     {         case INFO:             IwTrace(INFO, (msg.c_str()));             break;         case WARN:             IwTrace(WARN, (msg.c_str()));             break;         case ERROR:             IwTrace(ERROR, (msg.c_str()));             break;         default:             IwTrace(ERROR, ("IwLogger::Log() - Uncatered for case! Nothing to log!"));             break;     } }  void IwLogger::Log(IwLogger::LogLevel level, std::string callingFunc, std::string msg) {     std::string finalMsg = callingFunc + "() - " + msg;     switch (level)     {         case INFO:             IwTrace(INFO, (finalMsg.c_str()));             break;         case WARN:             IwTrace(WARN, (finalMsg.c_str()));             break;         case ERROR:             IwTrace(ERROR, (finalMsg.c_str()));             break;         default:             IwTrace(ERROR, ("IwLogger::Log() - Uncatered for case! Nothing to log!"));             break;     } }  void IwLogger::LogFailedResource(std::string callingFunc, std::string resourcePath) {     std::string msg = "Failed to load resource: " + resourcePath;     LogError(callingFunc, msg); }   

Сообщения об ошибках:

 <код> 1>c:users...sourceframeworkcustomfont.h(12): error C2504: 'Singleton' : base class undefined (..sourceframeworkBaseObject.cpp)   1>c:users...sourceframeworkcustomfont.h(12): error C2143: syntax error : missing ',' before '<' (..sourceframeworkBaseObject.cpp)   1>c:users igel...sourceframeworkcustomfont.h(12): error C2504: 'Singleton' : base class undefined (..sourceframeworkCustomFont.cpp)     
Английский оригинал

I have a Marmalade C++ project where the built in font doesn't scale to screen size. To deal with this issue I'm making a custom font, which is basically a png and a .xml file, containing the (0,0) vector of each character, and each character's size. I'm then creating an instance of the png, and drawing regions of it in a for loop to write on the screen.

The issue I'm having is the scope of this class. I want it to be used throughout the entire project. So the static DebugLogger would use this font, any UI's, or GameObjects, anything which need characters, would use this font. Almost like it's pre-built into the system.

The Logger in this project is a static class, with static functions. The custom font class I currently have is a Singleton, as is my understanding, it must be an instantiated object for the program to draw images of it. So I did not make it static. Is there a clear cut answer to this type of problem? The issue is the static class won't create a reference to a singleton, and I've been told the singleton is to be avoided from a design perspective anyway!

Thanks in advance guys!

Here's the code for reference:

CustomFontClass

#ifndef _CHARACTER_SET_H_ #define _CHARACTER_SET_H_  #include "Iw2D.h" #include "Singleton.h" #include "BaseImage.h" #include <map> #include <string>  typedef CIwArray<std::string> STR_ARR;  class CharacterSet : public Singleton<CharacterSet> { public:     CharacterSet();      void Write(std::string, CIwFVec2, float);     void Write(std::string, float, float, float);     void Write(char, CIwFVec2, float);     void Write(char, float, float, float);      bool IsInitialised() const { return mIsInitialised; }      // Space between characters is equivalent to 1 character width. This float multiplies that number. Default is .55f     void SetFontSpacing(float);  protected:     BaseImage* mspCharacters;     bool Initialise();  private:     std::map<const char, CIwFVec2> mFontMap;     static const std::string TEXTURE_PATH;     static const std::string TEXTURE_NAME;     static const CIwFVec2 mFontSize;         float mFontSpacing;         STR_ARR maTextureLocations;         bool mIsInitialised; };       #define CHARACTERSET Singleton<CharacterSet>::GetInstance()      #endif 

cpp

#include "Iw2D.h" #include "Singleton.h" #include "BaseImage.h" #include "CharacterSet.h" #include "IwLogger.h" #include <map> #include <sstream> #include <string>  const std::string CharacterSet::TEXTURE_PATH = "textures/"; const std::string CharacterSet::TEXTURE_NAME = "font_main.png"; const CIwFVec2 CharacterSet::mFontSize = CIwFVec2(50, 63);   CharacterSet::CharacterSet() : Singleton<CharacterSet>() {     mFontSpacing = 0.55f;     mIsInitialised = Initialise(); };  void CharacterSet::SetFontSpacing(float spacing) {     if (spacing != NULL)     {         mFontSpacing = spacing;     } };  void CharacterSet::Write(std::string text, CIwFVec2 position = CIwFVec2(50,50), float fontSize = 25.0f) {     if (!text.empty())     {         mspCharacters->SetSize(CIwFVec2(fontSize, fontSize));          float newPosition = 0;         for (char& c : text)         {             mspCharacters->SetPosition(CIwFVec2((position.x + newPosition), position.y));              if (mFontMap.find(c) == mFontMap.end())             {                 std::stringstream ss;                 std::string mCharRef;                 ss << c;                 ss >> mCharRef;                  std::string error = "CharacterSet::mFontMap[" + mCharRef + "] - Does not exist!";                 IW_LOG_ERROR(error);             }             else             {                 mspCharacters->Render(mFontMap[c], mFontSize);             }              newPosition += (fontSize * mFontSpacing);         }     }     else     {         IW_LOG_ERROR("CharacterSet::Write - std::string text is empty!");     }  };  bool CharacterSet::Initialise() {     maTextureLocations.push_back(std::string(TEXTURE_PATH + TEXTURE_NAME));     mspCharacters = new BaseImage(maTextureLocations[0].c_str());      if (mspCharacters == NULL)     {         IW_LOG_ERROR("CharacterSet::mspCharacters - Failed to create BaseImage!");         return false;     }      //Numerical symbols     mFontMap['1'] = CIwFVec2(0, 0);     mFontMap['2'] = CIwFVec2(50, 0);     mFontMap['3'] = CIwFVec2(100, 0);     mFontMap['4'] = CIwFVec2(150, 0);     mFontMap['5'] = CIwFVec2(200, 0); // ect... lots of these 

IwLogger

#ifndef _IW_LOGGER_H_ #define _IW_LOGGER_H_  #include "IwDebug.h" #include <string>  class IwLogger {     public:         IwLogger();          enum LogLevel         {             INFO,             WARN,             ERROR         };          static void Log(LogLevel level, std::string msg);         static void Log(LogLevel level, std::string callingFunc, std::string msg);          static void LogFailedResource(std::string callingFunc, std::string resourcePath);          static void LogError(std::string msg) { Log(ERROR, msg); }         static void LogWarn(std::string msg) { Log(WARN, msg); }         static void LogInfo(std::string msg) { Log(INFO, msg); }          static void LogError(std::string callingFunc, std::string msg) { Log(ERROR, callingFunc, msg); }         static void LogWarn(std::string callingFunc, std::string msg) { Log(WARN, callingFunc, msg); }         static void LogInfo(std::string callingFunc, std::string msg) { Log(INFO, callingFunc, msg); } };  #define IW_LOG_ERROR(msg) IwLogger::LogError(__FUNCTION__, msg) #define IW_LOG_WARN(msg) IwLogger::LogWarn(__FUNCTION__, msg) #define IW_LOG_INFO(msg) IwLogger::LogInfo(__FUNCTION__, msg)  #define IW_LOG_FAILED_RES(resPath) IwLogger::LogFailedResource(__FUNCTION__, resPath)  #endif 

cpp

#include "CharacterSet.h" #include "IwLogger.h"  void IwLogger::Log(IwLogger::LogLevel level, std::string msg) {     switch (level)     {         case INFO:             IwTrace(INFO, (msg.c_str()));             break;         case WARN:             IwTrace(WARN, (msg.c_str()));             break;         case ERROR:             IwTrace(ERROR, (msg.c_str()));             break;         default:             IwTrace(ERROR, ("IwLogger::Log() - Uncatered for case! Nothing to log!"));             break;     } }  void IwLogger::Log(IwLogger::LogLevel level, std::string callingFunc, std::string msg) {     std::string finalMsg = callingFunc + "() - " + msg;     switch (level)     {         case INFO:             IwTrace(INFO, (finalMsg.c_str()));             break;         case WARN:             IwTrace(WARN, (finalMsg.c_str()));             break;         case ERROR:             IwTrace(ERROR, (finalMsg.c_str()));             break;         default:             IwTrace(ERROR, ("IwLogger::Log() - Uncatered for case! Nothing to log!"));             break;     } }  void IwLogger::LogFailedResource(std::string callingFunc, std::string resourcePath) {     std::string msg = "Failed to load resource: " + resourcePath;     LogError(callingFunc, msg); } 

The error messages:

1>c:users...sourceframeworkcustomfont.h(12): error C2504: 'Singleton' : base class undefined (..sourceframeworkBaseObject.cpp)   1>c:users...sourceframeworkcustomfont.h(12): error C2143: syntax error : missing ',' before '<' (..sourceframeworkBaseObject.cpp)   1>c:users igel...sourceframeworkcustomfont.h(12): error C2504: 'Singleton' : base class undefined (..sourceframeworkCustomFont.cpp)   
</div
           
         
         

Список ответов

Связанный проблема

1  STD :: CIN непосредственно к функции  ( Stdcin directly to a function ) 
Недавно я наткнулся на следующую часть кода. Я не знаю, имеет ли это какой-либо смысл, я просто пытаюсь его понять: <код> object Gender extends Enumeration ...

0  Как получить несколько наборов результатов с Poco :: Data?  ( How to fetch multiple result sets with pocodata ) 
Я прочитал Poco :: Руководство пользователя данных и упоминается, что Библиотека имеет поддержку нескольких наборов результатов. Существует пример для этой ...

1  Использование Typedefs соответствующим образом, чтобы избежать «загрязнения Typedef»  ( Using typedefs appropriately to avoid typedef contamination ) 
Я разрабатываю определенные функции для более широкого включения в охватывающем проекте и «особенности», над которыми я работаю, являются некоторые классы, со...

7  GLREADPIXELS () Устанавливает ошибку GL_inValid_Operation  ( Glreadpixels sets gl invalid operation error ) 
Я пытаюсь реализовать цвет выбора с FBO. У меня есть многосмысленные FBO (FBO [0]), которые я использую для визуализации сцены, и у меня нет многоспущенных FB...

2  Замена DLL со статической библиотекой  ( Replacing a dll with the static library ) 
Ударная точка: У меня есть код C ++, который ссылается на стороннюю статическую библиотеку, которая ссылается на WS2_32.Lib. <Сильная> Цель: Я изучаю спо...

2  Новый DataType, который может иметь количество до 100 цифр  ( New datatype which can have numbers upto 100 digits ) 
Примечание. Это был вопрос интервью и может не иметь фактического случая использования в настоящее время Вопрос должен был разработать класс, который может ...

23  Почему я не могу открыть видео AVI в OpenCV?  ( Why cant i open avi video in opencv ) 
Я только что написал простой пример чтения видео с OpenCv2.3.1, но кажется, что я не могу открыть видео AVI в любом случае: ( <Код> VideoCapture capture("gui...

-1  Мусор с указателями в классе, C ++  ( Garbage with pointers in a class c ) 
Я использую Borland Builder C ++. У меня есть утечка памяти, и я знаю, что это должно быть из-за этого класса, который я создал, но я не уверен, как это испра...

1  Установка значения строки и строки  ( Setting value of string to string ) 
У меня есть строка и AMP; Параметр, и я хочу назначить его строковым параметром. Как это можно сделать. ...

1  Opencv Изображение Цветовое пространство Преобразование с использованием CVTColor  ( Opencv image color space transformation using cvtcolor ) 
Я использую ниже OpenCV API для преобразования цветового пространства: <код> cvtColor(<input mat>, <output mat>, COLOR_RGB2RGBA); Однако выходное изобра...

2  ODBC и NLS_LANG  ( Odbc and nls lang ) 
Допустим, я создал две разные исполняемые файлы программы, например, в C ++. По какой-то причине две программы внутреннее представление текста отличаются др...

1  C ++ - утечка памяти, вызванная использованием размещения New Over * этот указатель?  ( C memory leak caused by using placement new over this pointer ) 
Как известно, размещение New просто строит объект без выделения любой памяти. Также все члены в классе <Код> 5.5.10 являются объектами вместо указателей, хот...

4  Преобразовать фильм в Openni * .oni видео  ( Convert movie to openni oni video ) 
the библиотека Kinect Openni использует пользовательский формат видеофайла для хранения видеороликов, которые содержат информацию RGB + D. Эти видео имеют р...

6  Теоретически, находит_енди параллельно?  ( In theory is find end parallelizable ) 
В настоящее время я работаю над open -Под предложению Для достижения параллельной функциональности проекту я работаю, но я столкнулся с дорожным блоком с f...

0  Проблемы с повышением :: ptr_vector и Boost :: любой  ( Problems with boostptr vector and boostany ) 
Хорошо, так что я сомневался, я хочу знать, если это возможно: Я использую базу данных, с общими данными (строки, ints, bools и т. Д.). Всякий раз, когда об...