Page 1 of 1

MakeFontImage()

Posted: Sat Jun 21, 2008 8:22 pm
by Koodiapina
MakeFontImage() luo mistä tahansa CoolBasicin tukemasta fontista kuvan. Palauttaa tehdyn kuvan.

Code: Select all

    SCREEN 800,600
    SaveImage MakeFontImage(LoadFont("verdana",13,1)),"fonts/font.bmp"

    Function MakeFontImage(font)
        SetFont font
        fontimage = MakeImage(13*127,16*11)
        DrawToImage fontimage
            Color 0,0,0
            Box 0,0,ImageWidth(fontimage),ImageHeight(fontimage)
            For n=0 To 11
                Select n
                Case 0: Color 255,255,255 
                Case 1: Color 255,0,0
                Case 2: Color 0,255,0
                Case 3: Color 0,0,255
                Case 4: Color 255,255,0
                Case 5: Color 0,255,255
                Case 6: Color 100,100,100
                Case 7: Color 100,0,0
                Case 8: Color 0,100,0
                Case 9: Color 0,0,100
                Case 10: Color 100,100,0
                Case 11: Color 0,100,100
                EndSelect 
                For x = 0 To 127
                    Text x*13,-n*16,Chr(x)
                Next x
            Next n
        DrawToScreen 
        Return fontimage
    EndFunction 

Re: MakeFontImage()

Posted: Sat Jun 21, 2008 8:33 pm
by Sami The Great
Ja tässä lupaamani teksi luokka (koodi tosin on C++:ssaa mutta sen tarkoitus on ladata kyseisiä fonttikuvia):

Code: Select all

#define FONT_SIZE 18

class TextEngine
{
    public:
        void LoadFontImage(const char *fontFile);
        void InitTextImage();
        SDL_Rect GetCharRect(char ascii);
        void BuildText(std::string text);
        void DrawText(int x, int y, std::string text);
        
    private:
        SDL_Surface *emptySurface;
        SDL_Surface *imageText;
        SDL_Surface *imageFont;
};


void TextEngine::LoadFontImage(const char *fontFile)
{
    imageFont = SDL_LoadBMP(fontFile);
}

void TextEngine::InitTextImage()
{
    SDL_BlitSurface(emptySurface, NULL, imageText, NULL);
}

SDL_Rect TextEngine::GetCharRect(char ascii)
{
    SLD_Rect field;
    
    for(int i = -128; i < ascii; i = i + 1)
    {
        field.x = field.x + FONT_SIZE;
    }
    
    return field;
}

void TextEngine::BuildText(std::string text)
{
    char* TEXTARRAY = text.c_str()
    
    int sizeCount;
    int a;
    sizeCount = 0;
    
    while(1)
    {
        if(TEXT_ARRAY[sizeCount] == '\0') break;
        sizeCount = sizeCount + 1
    }
    
    for(int i = 0; i < sizeCount + 1; i = i + 1)
    {
        SLD_BlitSurface(imageFont, GetCharRect(TEXT_ARRAY[i]), imageText, SDL_Rect( FONT_SIZE *i, 0, FONT_SIZE, FONT_SIZE ));
    }
    
}


void TextEngine::DrawText(int x, int y, std::string text)
{
    SDL_Rect rect;
    rect.x = x;
    rect.y = y;
    
    InitTextImage();
    BuildText(text);
    SDL_BlitSurface(imageText, NULL, screen, &rect);
}

En ole testannut koodia, mutta sen pitäisi toimia. Kertokaahan minulle jos se ei toimi. Eli tekstiä pitäisi tulla näytölle kun ensin lataat fontti kuvan LoadFontImage funktiolla ja sen jälkeen Käytät DrawText funktiota piirtämään tekstin. Ja muista, että koodi ei toimi ilman SDL:ää. Tein myös GetCharRect funktion valmiiksi joten kuten. Huom. Se lataa kirjaimet yhdessä pötkössä eikä huomioi rivin vaihdoksia.

Re: MakeFontImage()

Posted: Sat Jun 21, 2008 8:53 pm
by Koodiapina
Mutta tuon MakeFontImage() funktion tarkoituksenahan juuri on, että merkkien leveys ja korkeus pysyvät vakioina samassa kuvassa.

Re: MakeFontImage()

Posted: Sat Jun 21, 2008 9:42 pm
by MaGetzUb
Tämähän on aika kätevä, jos tekee omaa fonttia peliin, ottaa vain tolla funktiolla sen kuvan - tallentaa sen saveimagella , ja muakkaa sitä haluamakseen... SItten vain tekee funktion, jolla tota fonttia voi käyttää pelissään...

Re: MakeFontImage()

Posted: Sat Jun 21, 2008 10:02 pm
by Eräs cb koodaaja
Tai sitten vaan lataa jonku fontintekoohjelman ja tekee sillä. On vaa helpompaa kuin kikkailla tollasilla.

Re: MakeFontImage()

Posted: Sat Jun 21, 2008 10:34 pm
by Koodiapina
Tämän tarkoitus ei ole luoda uusia fontteja, vaan saada entisiä käyttöön, esimerkiksi C++:ssaan. Kun tuohon lisää rivin joka tallentaa sen kuvan, niin tämä on suunnilleen yhtä nopea kuin Irrlichin font -tool.

Re: MakeFontImage()

Posted: Sat Jun 21, 2008 10:45 pm
by Eräs cb koodaaja
Tämän tarkoitus ei ole luoda uusia fontteja, vaan saada entisiä käyttöön, esimerkiksi C++:ssaan. Kun tuohon lisää rivin joka tallentaa sen kuvan, niin tämä on suunnilleen yhtä nopea kuin Irrlichin font -tool.
Niin minäkin ymmärsin ja vastasin tohon programmer of DSGn viestiin.(Olis varmaan pitäny laittaa lainaus). Paha sitä kyllä on lonkalta heittää miten koodi toimii. kun täällä "korvessa" ei ole CoolBasicia mukana.

Re: MakeFontImage()

Posted: Wed Jun 25, 2008 5:20 pm
by Koodiapina
Sami the great, toi koodi ei toimi, vaikka includettais SDL:n, stringit ja laittais nimiavaruudeks STD:n :( Tulee noin 10 virhettä, kun ton kääntää.

Re: MakeFontImage()

Posted: Wed Jun 25, 2008 5:40 pm
by Sami The Great
Grandi wrote:Sami the great, toi koodi ei toimi, vaikka includettais SDL:n, stringit ja laittais nimiavaruudeks STD:n :( Tulee noin 10 virhettä, kun ton kääntää.
Muistithan alustaa SDL:n ja luokka käyttää näyttö tasona oletuksellisesti SDL_Surface *screen:iä

Re: MakeFontImage()

Posted: Wed Jun 25, 2008 5:44 pm
by Koodiapina
Sami The Great wrote:
Grandi wrote:Sami the great, toi koodi ei toimi, vaikka includettais SDL:n, stringit ja laittais nimiavaruudeks STD:n :( Tulee noin 10 virhettä, kun ton kääntää.
Muistithan alustaa SDL:n ja luokka käyttää näyttö tasona oletuksellisesti SDL_Surface *screen:iä
Katos prkl. Eihän mulla ollu edes main funktiota 0__0''... Kokeilen uusiks.

EDIT: Eipä toimi kyl vieläkään :) Voisitko laittaa esimerkin?

EDIT: No teen tosta uuden version.

Re: MakeFontImage()

Posted: Sun Aug 24, 2008 1:25 pm
by Koodiapina
Tein nyt sen uuden version tuosta fonttien latauksesta jonka lupasin. Tämä on eri versio kuin se C++ esimerkkikoodeihin postaamani, mielestäni tämä on paljon kätevämpi. Suurin ero on se, että tämä versio ei käytä luokkia tekstin tulostamiseen. Lisäksi tällä saa värit toimimaan (esimerkissä 11) Koodi sisältää myös kuva luokan, se ei ole kovin tarpeellinen, mutta jätin siihen kun sitäkin voi tarvita jossain.

Värit olisi voinut toteuttaa värjäämällä fonttikuva aina halutulla värillä, mikä olisi ollut moninkertaisesti parempi ratkaisu, mutta joku muu saa tehdä sen :D Ja tämä versio ei lisäksi tue .PNG kuvia, koska mulla ei oo lisäkirjastoja.

Code: Select all

#include <SDL/SDL.h>
#include <string>

using namespace std;


// Surface for screen,
// this can be something else,
// but in that case you have to
// mod it also in drawtext()
SDL_Surface *screen;


/*
  IMAGE SECTION
*/

class Image
{
public:
    // Loads image
    void Load(char *target,int w=0,int h=0)
    {
        res = SDL_LoadBMP(target);
        width = w;
        height = h;
    }
    
    // Returns image as
    // an SDL_Surface
    SDL_Surface *GetResource()
    {
        return res;
    }
    
    // Draws image
    void Draw(int x,int y)
    {
        SDL_Rect locate;
        locate.x = x;
        locate.y = y;
        SDL_BlitSurface(res,NULL,screen,&locate);
    }
    
    // Draws image as animated
    void DrawAnimated(int x,int y,int f)
    {
        SDL_Rect locate;
        locate.x = x;
        locate.y = y;
        SDL_Rect size;
        size.x = width*f;
        size.y = 0;
        size.w = width;
        size.h = height;
        SDL_BlitSurface(res,&size,screen,&locate);             
    }
    
    // Deletes surface and
    // the loaded image
    void Free()
    {
        SDL_FreeSurface(res);
    }
private:
    SDL_Surface *res;
    int width,height;
};


/*
  TEXT SECTION
*/


int CharWidth;
int CharHeight;

Image FontImage;

// Inits all fonts
// w,h = char width and height
void InitFonts(int w=13,int h=16)
{
    CharWidth = w;
    CharHeight = h;
    FontImage.Load("font.bmp");
}


/*
  TEXT FUNCTION
*/

// Draws the text
// x,y = text coordinates
// text = string of the text
// whole = color of the text
void DrawText(int x,int y,const char *text,int whole=0)
{              
    int i = 0;
    while(1)
    {
        if(text[i]=='\0') break;
        SDL_Rect read;
        read.x = int(text[i])*CharWidth;
        read.y = whole*CharHeight;
        read.w = CharWidth;
        read.h = CharHeight;
        SDL_Rect drawing;
        drawing.x = x+(i*CharHeight);
        drawing.y = y;
        SDL_BlitSurface(FontImage.GetResource(),&read,screen,&drawing);
        i++;
    }
}


/*
  EXAMPLE
*/

int main(int argc,char *argv[])
{
    srand(time(NULL));
    screen = SDL_SetVideoMode(800, 600, 32, SDL_SWSURFACE|SDL_ANYFORMAT);
    
    InitFonts();
    
    // Main loop attrs
    SDL_Event tapahtuma;
    bool pois = 0; 
    
    while(!pois)
    {
        // Example of use
        for(int i=0;i<11;i++) DrawText(50,50+(i*15),"Output",i);

        SDL_PollEvent(&tapahtuma);
        if (tapahtuma.type == SDL_QUIT)  pois = true;
        if (tapahtuma.type == SDL_KEYDOWN) 
        {
             if ( tapahtuma.key.keysym.sym == SDLK_ESCAPE ) pois = true;             
        } 

        SDL_Flip(screen);
    }

    SDL_Quit();
    return 1;
}
Taas varoittelen huonosta englannista, purkasta, virheiden käsittelemättä jättämisestä jne.

Lisäksi päivitin tuota CB koodia tukemaan värejä, joka tosiaan on turha, jos halutaan käyttää sitä parempaa värjäystoimintoa.

Re: MakeFontImage()

Posted: Tue Aug 26, 2008 6:05 pm
by Pate5
Eräs cb koodaaja wrote:Tai sitten vaan lataa jonku fontintekoohjelman ja tekee sillä. On vaa helpompaa kuin kikkailla tollasilla.
Ja mistä lataat ilmaisen ja kunnollisen fontinteko-ohjelman?

Re: MakeFontImage()

Posted: Tue Aug 26, 2008 6:54 pm
by Koodiapina
Pate5 wrote:Ja mistä lataat ilmaisen ja kunnollisen fontinteko-ohjelman?
http://www.google.com/search?q=font+mak ... =firefox-a

Re: MakeFontImage()

Posted: Wed Aug 27, 2008 2:42 pm
by Pate5
Grandi wrote:
Pate5 wrote:Ja mistä lataat ilmaisen ja kunnollisen fontinteko-ohjelman?
http://www.google.com/search?q=font+mak ... =firefox-a
Joo, noita olin jo katsonut, mutta ei löytynyt yhtään kunnollista ja täysin ilmaista.