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); }
You’re doing it wrong.
sinä teet sen väärin
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.
||=== 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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.