Inhaltsverzeichnis

TFONT

Wie wir bisher rausgefunden haben, hat Allegro Funktionen um Text auszugeben, allerdings werdet ihr Feststellen müssen, dass es nicht 100% individuell ist. Wir wollen hier eine Klasse schreiben, die es ermöglicht 2-farbige Texte auszugeben.

Unsere eigene Font

So da die Infos über die Färbung ja irgendwo herkommen muss, lade ich euch die Font hoch, dann habt ihr weniger Stress. Das unten folgende Archiv enthält die Font in der Form, dass es für jeden Buchstaben ein Bitmap gibt.

Download Font

Die Klasse

Die Klasse muss jetzt was machen? Genau, Sie muss einen Text nehmen können, und dann die Bitmaps mit den Passenden Buchstaben zu einem Bitmap zusammen setzen. Keine große Aufgabe, dementsprechend klein ist die Definition: (TFont.h)

#ifndef __TFONT
#define __TFONT
 
#include <Allegro.hpp>
 
namespace allg{
 
    class TFONT : public TGRAPHIKOBJEKT{
        public:
            TFONT();
            ~TFONT();
 
            void TextZuweisen(const char*);
            std::string getText();
 
        private:
            std::string Text;
            std::vector<BITMAP*> Font;
    };
};
 
#endif

Da wir ja (oder ich zumindest, will euch ja nichts unterstellen ;-) ) höllisch faul sind, leiten wir die Klasse von TGRAPHIKOBJEKT ab, und ersparen uns so den Großteil der Arbeit.

Jetzt noch schnell die Implemetierung: (TFont.cpp)

#include "TFont.h"
 
#include <sstream>
#include <ctype.h>
 
using namespace allg;
 
//------------------------------------------------------------------------------
TFONT::TFONT(){
    Text.clear();
    Font.clear();
 
    std::stringstream Temp;
 
    for(int i = 0;i<36;i++){
        Temp.str("");
        Temp << ".\\Font\\Font" << i << ".bmp" ;
        Font.push_back(load_bitmap(Temp.str().c_str(), NULL));
    }
}
//------------------------------------------------------------------------------
TFONT::~TFONT(){
    delete Bild;
    Bild = NULL;
 
    for(int i = 35; i >= 0;i--){
        delete Font[i];
        Font.erase(Font.begin() + i);
    }
}
//------------------------------------------------------------------------------
void TFONT::TextZuweisen(const char* T){
    if(Bild){//steht noch ein Text im Bild so wird er gelöscht
        delete Bild;
        Bild = NULL;
    }
 
    Text = UppWord(T);
    //allegro_message(Text.c_str());
    Bild = create_bitmap(50*Text.length(), 50);
    clear_to_color(Bild, makecol(255,0,255));
 
    for(int i = 0;i<Text.length();i++){
        int k = Text[i] - 65 + 10;
        //allegro_message("k = %i", k);
        if(Text[i]>= '0' && Text[i] <= '9'){
            blit(Font[Text[i] - '0'], Bild, 0, 0, i*50,0, Font[Text[i]-'0']->w, Font[Text[i]-'0']->h);
        }else if(Text[i] >= 65 && Text[i] < 91){
            blit(Font[k], Bild, 0, 0, i*50,0, Font[k]->w, Font[k]->h);
            //A ist 65 in der ASCII Tabelle,
            //deshalb -65 + 10 weil Font10.bmp A entällt
        }
    }
}
//-----------------------------------------------------------------------------
std::string TFONT::getText(){
    return Text;
}

Der Konstruktor sucht in einem Unterordner Font nach nach den Bildern aus dem obrigen Archiv - achtet also darauf, dass ihr die Bilder an die Richtige Stelle entpackt - und lädt sie in den Ram.

In der Text zuweisen Funktion wird dann geschaut, ob das Zeichen eine Zahl, oder ein Buchstabe ist, und trägt entsprechend das Richtige Bitmap in das Bitmap Bild ein, was, wir erinnern uns, das ist, das dann am ende ausgegeben wird.

hier gehts zurück und hier gehts weiter