MakeFontImage()

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
Post Reply
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

MakeFontImage()

Post 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 
Last edited by Koodiapina on Sun Aug 24, 2008 1:32 pm, edited 2 times in total.
User avatar
Sami The Great
Advanced Member
Posts: 485
Joined: Tue Aug 28, 2007 4:15 pm
Contact:

Re: MakeFontImage()

Post 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.
Last edited by Sami The Great on Sun Jun 22, 2008 9:47 am, edited 5 times in total.
http://www.rockodilegames.com
CoolBasickin käyttäjä vuodesta 2004.
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: MakeFontImage()

Post by Koodiapina »

Mutta tuon MakeFontImage() funktion tarkoituksenahan juuri on, että merkkien leveys ja korkeus pysyvät vakioina samassa kuvassa.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: MakeFontImage()

Post 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...
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
Eräs cb koodaaja
Active Member
Posts: 126
Joined: Wed Aug 29, 2007 3:55 pm

Re: MakeFontImage()

Post by Eräs cb koodaaja »

Tai sitten vaan lataa jonku fontintekoohjelman ja tekee sillä. On vaa helpompaa kuin kikkailla tollasilla.
Tiimit ja tuotokset:
RE:Ydintuho
Drahtlose:Infernalisch, Pienet pelit
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: MakeFontImage()

Post 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.
Eräs cb koodaaja
Active Member
Posts: 126
Joined: Wed Aug 29, 2007 3:55 pm

Re: MakeFontImage()

Post 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.
Tiimit ja tuotokset:
RE:Ydintuho
Drahtlose:Infernalisch, Pienet pelit
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: MakeFontImage()

Post 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ää.
User avatar
Sami The Great
Advanced Member
Posts: 485
Joined: Tue Aug 28, 2007 4:15 pm
Contact:

Re: MakeFontImage()

Post 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ä
http://www.rockodilegames.com
CoolBasickin käyttäjä vuodesta 2004.
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: MakeFontImage()

Post 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.
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: MakeFontImage()

Post 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.
Pate5
Artist
Artist
Posts: 551
Joined: Tue Aug 28, 2007 4:53 pm
Location: Vantaa

Re: MakeFontImage()

Post 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?
CoolBasic henkilökuntaa
Graafikko
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: MakeFontImage()

Post by Koodiapina »

Pate5 wrote:Ja mistä lataat ilmaisen ja kunnollisen fontinteko-ohjelman?
http://www.google.com/search?q=font+mak ... =firefox-a
Pate5
Artist
Artist
Posts: 551
Joined: Tue Aug 28, 2007 4:53 pm
Location: Vantaa

Re: MakeFontImage()

Post 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.
CoolBasic henkilökuntaa
Graafikko
Post Reply