Eli aloitin oman kirjoituskentän toteuttamisen.. tapa on huono, mutta kaikesta oppii.. enkä keksi nyt miksi järjestelmä tekee koko virheen tästä? Eli kysyy lähetetäänkö virhe raportti.
CodeBlocks antaa tälläisen:
process terminated with status -1073741510 (0 minutes, 13 seconds)
ja konsoliin tallentuu windows errori 1D
ja koodi on tälläistä:
namespace ohjelma { //Otin tästä kaiken ylimääräisen pois. namespace fontit { static TTF_Font *LataaFontit(const char *nimi, int size); static TTF_Font *font; } namespace tekstien { static SDL_Surface *lataateksti(const char *text, bool muuttuja, int muuttujan_arvo, int r, int b, int g, int size, TTF_Font *fontt); static SDL_Surface *lataatekstimerkkijonona(const char *text, bool muuttuja, std::string rex, int r, int b, int g, int size, TTF_Font *fontt); static SDL_Surface *teksti, *teksti2, *teksti3, *teksti4, *teksti5, *teksti6, *teksti7, *teksti8, *teksti9, *teksti10, *teksti11; static SDL_Surface *teksti12, *teksti13, *teksti14, *teksti15, *teksti16, *teksti17, *teksti18; static SDL_Surface *teksti19, *teksti20, *teksti21, *teksti22, *teksti23, *teksti24, *teksti25, *teksti26, *teksti27, *teksti28; static SDL_Surface *teksti29, *teksti30, *teksti31, *teksti32, *teksti33, *teksti34; } } void ohjelma::LataaUudestaanTekstit(int Toimistontaso, int Tehtaantaso, int Varastontaso, std::string sana) { //Tässä ei tarvitse välittää kuin alimmasta SDL_FreeSurface(tekstien::teksti31); SDL_FreeSurface(tekstien::teksti32); SDL_FreeSurface(tekstien::teksti33); SDL_FreeSurface(tekstien::teksti34); tekstien::teksti31 = tekstien::lataateksti("nothing", true, Toimistontaso, 255, 0, 0, 16, fontit::font); tekstien::teksti32 = tekstien::lataateksti("nothing", true, Tehtaantaso, 255, 0, 0, 16, fontit::font); tekstien::teksti33 = tekstien::lataateksti("nothing", true, Varastontaso, 255, 0, 0, 16, fontit::font); tekstien::teksti34 = tekstien::lataatekstimerkkijonona(" ", true, sana, 255, 0, 0, 16, fontit::font); } static SDL_Surface *ohjelma::tekstien::lataateksti(const char *text, bool muuttuja, int muuttujan_arvo, int r, int b, int g, int size, TTF_Font *fontt) { SDL_Color textcolor = {r, b, g}; if (muuttuja) { char mjono[10]; sprintf(mjono, "%i", muuttujan_arvo); SDL_Surface *tex = TTF_RenderText_Blended(fontt, mjono, textcolor); return tex; } else { SDL_Surface *tex = TTF_RenderText_Blended(fontt, text, textcolor); return tex; } } // Lataa kuvan ja optimoi sen piirtoa varten. static SDL_Surface *ohjelma::tekstien::lataatekstimerkkijonona(const char *text, bool muuttuja, std::string rex, int r, int b, int g, int size, TTF_Font *fontt) { SDL_Color textcolor = {r, b, g}; if (muuttuja) { char mjono[10]; sprintf(mjono, "%s", rex); SDL_Surface *tex = TTF_RenderText_Blended(fontt, mjono, textcolor); return tex; } else { SDL_Surface *tex = TTF_RenderText_Blended(fontt, text, textcolor); return tex; } }
peli.cpp tiedosto jossa kysytään kirjoitus.hpp tiedostossa olevaa kirjainta näin:
//Tässä kirjoitus.hpp tiedoston tämän hetken koodi: #ifndef _KIRJOITIN_HPP #define _KIRJOITIN_HPP #include <iostream> #include <cmath> #include <cstdlib> #include <string> #include <ctime> #include <SDL/SDL.h> std::string GetDownKey(std::string sana) { std::string merkki; if (SDLK_a) { merkki="a"; } if (SDLK_b) { merkki="b"; } sana = sana + merkki; return sana; } #endif //ja tässä on peli.cpp tiedostossa oleva: if (p.room == 2) { ohjelma::LataaUudestaanTekstit(p.FirmanTaso, p.TehtaanTaso, 1, p.sam); //p.sam on se teksti. ohjelma::piirra_tekstit(2, p); p.sam = GetDownKey(p.sam); }
En osaa selittää helpommin ja toivon että joku ymmärtää.
varmaan tulee page fault jossain kohtaa tai joku vastaava jos kerran kaatuu koko ohjelma.
http://www.cplusplus.com/doc/tutorial/arrays/
https://www.ohjelmointiputka.net/oppaat/opas.
https://www.ohjelmointiputka.net/oppaat/opas.
nyt tiedän missä vika, mutta en että miksi
tekstien::teksti34 = tekstien::lataatekstimerkkijonona(" ", true, sana, 255, 0, 0, 16, fontit::font, p.montakokirjainta);
Tuossa kohta josta ladataan ja tässä latausfunktio:
static SDL_Surface *ohjelma::tekstien::lataatekstimerkkijonona(const char *text, bool muuttuja, std::string rex, int r, int b, int g, int size, TTF_Font *fontt, int montakokirjainta) { SDL_Color textcolor = {r, b, g}; if (muuttuja) { char mjono[montakokirjainta]; sprintf(mjono, "%s", text); SDL_Surface *tex = TTF_RenderText_Blended(fontt, mjono, textcolor); return tex; } else { SDL_Surface *tex = TTF_RenderText_Blended(fontt, text, textcolor); return tex; } }
Jos rivi
sprintf(mjono, "%s", text);
on muodossa:
sprintf(mjono, "%s", rex);
eli stringin arvo siihen ohjelma kaatuu.. Miksi? miten sen voisi toteuttaa eritavalla, että saan muuttujan arvon siihen?
Et voi syöttää sprintf-funktiolle string-oliota vaan ainoastaan C:n merkkijonoja (kuten tuo mjono tai text ovat). Stringistä sellaisen palauttaa jäsenfunktio c_str().
Oikeasti et tarvitse tuossa koko mjonoa, vaan voit antaa TTF-funktiolle suoraan tekstin rex.c_str().
muuten.. KIITOS! Mietin tässä parempaa ratkaisu tyyliä ja taisin hoksata, mutta toteutus hieman pielessä. :D
kirjaimet[] = ("a", "b", "c"); if (nappi[SDLK_kirjaimet[]) { merkki=kirjaimet[]; SDL_Delay(150); }
tajuan itsekkin ettei mitään logiikkaa, mutta miten tuohon saisi sen logiikan? Vai saako tuolla tavalla mitenkään?
Ylempään ei tarvitse enää vastata toteutin eri tavalla.
mutta tähän haluaisin vastauksen..
Miten kannattaa toteuttaa tieto haku? Jos esimerkiksi tallennan tiedostoon:
2 5 1 100 5 1 540 150 1 120 500 2
tuohon tyyliin osaan tallentaa. Metabolixin koodivinkin ansiosta jonka antoi pari topickkia sitten.
eli tuossa on x ja y akseli sekä maan ID.
Nyt kun ne haetaan tiedostosta niin miten ne voisi hakea niin, että ne saa tallennettua taulukkoon tyyliin ja sieltä ei saa tulla väärää hahmoa vaan juuri oikeat:
int a=0; for (int i = 0; i <= tiedoston.size(); i++) { //en ole ihan varma tuosta tiedosto.size() funktiosta. if (maa == oma_maa) { x[a] = //se haetun rivin x arvo y[a] = //se haetun rivin y arvo a++; //tämä siksi että ei taulukkoon tule turhaan arvoja } }
ja sitten tuolla ne piirretään, mutta sen uskon osaavani jo toteuttaa.. tuota en vain osaa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.