Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C++: SDL_ttf funktioita

mika132 [28.06.2010 01:05:53]

#

Ensimmäinen vinkkini. En tiedä onko hyödyllinen. Kai sitä voi joku käyttää opetellessaan optimoimaan muistia, jottei peli kuormitu.

Eli työstin peliprojektiini noin 2h lähes alusta loppuun oman engineni. Engine liittyy tekstien lataukseen sekä optimointiin.


Tekstien lataukseen käytetään ainoastaan yhtä funktiota. Piirtämiseen toista, eli yksinkertainen tämä on.


V.1
- Voit tulostaa saman funktion kautta tekstit ja muuttujat.
- Voit ladata saman funktion kaiutta tekstit ja muuttujat.


Jos joskus päivitän funktiota niin siihen tulee luultavasti.
- Fontin muuttaminen.
- Värin muuttaminen.
- Jotain muuta teksteihin liittyvää.

functions.h

#include <iostream>
#include <stdexcept>
#include <SDL.h>
#include <SDL_ttf.h>

namespace enginev1 {
    // Eli tehdään heti ruutuun liittyvä alustus.
    static SDL_Surface *ruutu;
//Tekstin kirjoitus funktio
    static void KirjoitaTekstia(SDL_Surface *tteksti, int x, int y);_Surface *lataa(const char *nimi, bool lapinakyva);
//Tehdään teksteille ihan oma alue kuten matopeli enginessä tehtiin kuville.

    namespace tekstien {
        static SDL_Surface *lataateksti(const char *text, bool muuttuja, int muuttujan_arvo); //Eli ensimmäinen on se teksti. Toinen on tarkistus, että sisältääkö kyseinen kohta muuttujaa ja kolmas on muuttujan arvo. Muuttujan arvoksi voi laittaa 0 tai vaikka 10000 jos kyseessä ei ole muuttuja teksti.

        static SDL_Surface *teksti, *teksti2; //Sitten vielä temput näille kuville.
    }

}


//Seuraavaksi mennäänkin sitten oikein funktioihin ja lakataan niiden esittelu.



void enginev1::alku() {
    // Alustetaan SDL tai heitetään virhe.
    if (SDL_Init(SDL_INIT_VIDEO) != 0) {
        throw std::runtime_error(SDL_GetError());
    }
    // Avataan ikkuna tai heitetään virhe.
    ruutu = SDL_SetVideoMode(800, 600, 32, SDL_DOUBLEBUF);
    if (!ruutu) {
        throw std::runtime_error(SDL_GetError());
    }
    // Asetetaan otsikko.
    SDL_WM_SetCaption("Engine", "Engine");

    tekstien::teksti = tekstien::lataateksti("tähän saa laittaa mitä vain kun on muuttuja arvo", true, 50); //Eli kuten näkyy. viimeiseen laitetaan se arvo mikä halutaan tulostaa.

    tekstien::teksti2 = tekstien::lataateksti("Rahaa:", false, 1); //Tässä taas toisin päin. Se on ihan sama mitä viimeisessä on kunhan se on numero, mutta sitä ei näy missään loppujen lopuksi.
}



//Sitten tämä tekstien lataus funktio.

static SDL_Surface *enginev1::tekstien::lataateksti(const char *text, bool muuttuja, int muuttujan_arvo) {
    TTF_Init();
    TTF_Font *font = NULL;
    SDL_Color textcolor = {255, 0, 0};
    font = TTF_OpenFont("courbd.ttf", 16);
//Tarkistetaan onko siis kyseessä muuttuja vai ei.
    if (muuttuja) {
//Jos on tehdään tarvittavat jutut ja unohdetaan kokonaan muuttujan text sisältö.
        char mjono[10];
        sprintf(mjono, "%i", muuttujan_arvo);
        SDL_Surface *tex = TTF_RenderText_Blended(font, mjono, textcolor);
        return tex;
    }
    else {
//Jos taas kyseessä ei ole muuttuja pistämme tekstin, mutta emme muuttujaa.
        SDL_Surface *tex = TTF_RenderText_Blended(font, text, textcolor);
        return tex;
    }
}




//Tässä tekstin kirjoitus.
static void enginev1::KirjoitaTekstia(SDL_Surface *tteksti, int x, int y) {
    SDL_Rect alue_tekstille;
    alue_tekstille.x = x;
    alue_tekstille.y = y;

    SDL_BlitSurface(tteksti, NULL, ruutu, &alue_tekstille);
}

main.cpp

#include "functions.h"
#include <iostream>


int main() {
    enginev1::alku();

//ja tekstiä voimme tulostaa sen jälkeen ongelmitta (esim ne mitkä "alku" funktiossa ladattiin):

        KirjoitaTekstia(tekstien::teksti, 65, 60);
        KirjoitaTekstia(tekstien::teksti2, 5, 60);
}

Graphic [30.06.2010 13:27:12]

#

You’re doing it wrong.

derp [30.06.2010 13:36:58]

#

sinä teet sen väärin

Teuro [31.08.2010 09:03:25]

#

No niin liimataan koodit tiedostoihin ja ajetaan. Laadukas vinkki kääntyy virheittä ja varoituksitta.
C:\Users\teuro\mika_ttf\functions.h|10|error: expected constructor, destructor, or type conversion before '*' token
Täh miten voi olla, että muuttujan tyyppi on virheellinen? Noh mikä onkaan muuttujan tyyppi? _Surface* Jaaha puuttuu SDL alusta. Korjataan virhe, jolloin rivi tulee muotoon.
SDL_Surface *lataa(const char *nimi, bool lapinakyva);

Käännetään uudestaan ja saadaan tällainen virhe.
C:\Users\teuro\mika_ttf\functions.h|26|error: `void enginev1::alku()' should have been declared inside `enginev1'
Eli tehdään enginev1 nimiavaruuteen esittely tuolle funktiolle.

C:\Users\teuro\mika_ttf\main.cpp|10|error: `tekstien' has not been declared

Seuraava virhe 'tekstien' ei ole esitelty nimiavaruus, koska se on engine nimiavaruuden sisällä. Muunnetaan rivit muotoon

KirjoitaTekstia(enginev1::tekstien::teksti, 65, 60);
KirjoitaTekstia(enginev1::tekstien::teksti2, 5, 60);

C:\Users\teuro\mika_ttf\main.cpp||In function `int SDL_main()':|
C:\Users\teuro\mika_ttf\main.cpp|10|error: `KirjoitaTekstia' was not declared in this scope

Tehdään sama korjaus funktiolle, eli lisätään enginev1:: alkuun molempiin funktioihin.

C:\Users\teuro\mika_ttf\main.cpp|12|warning: control reaches end of non-void function

Täältä puuttuu vain return EXIT_SUCCESS; Lisätään kyseinen rivi ja käännetään uudelleen. Vielä löytyy yksi syntaksivirhe.

C:\Users\teuro\Downloads\SDL-1.2.14\lib\libSDLmain.a(SDL_win32_main.o)||In function `console_main':|
\Users\hercules\trunk\SDL-1.2\.\src\main\win32\SDL_win32_main.c|315|undefined reference to `_SDL_main'|
||=== Build finished: 1 errors, 0 warnings ===|

Eli muutetaan main funktio vastaamaan vaatimuksia.

int main(int kpl, char** argumentit) {

Nyt kääntäminen onnistuu, mutta sulkeutuu samantien. Luultavasti virheita tekstin lataamisessa tai piirtämisessä. Kuitenkin heikohko vinkki kaiken kaikkiaan.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta