Selventääkseni ehkä hieman paremmin harhaanjohtavaa otsikkoa (kun en parempaa kuvausta tälle nyt keksinyt), kyseessä ei ole siis normaali tekstin näyttäminen, ja hyytyminen on vain hetken aikaista. Ja homma menee siis näin:
Kuten tuossa aika pitkän aikaa sitten kysyin apua kirjain kerrallaan näytettävän tekstin näyttämiseen, niin olen huomannut että kaikki muu ikäänkuin jäätyy siksi aikaa kun kirjaimet tulevat esiin, ja tämän jälkeen kun teksti näytetään kokonaisena, myös kaikki muu jatkaa toimintaansa normaalisti. Ennen tätä en huomannut ongelmana, mutta vasta nyt se on alkanut häiritä.
Syyksi olen huomannu SDL_Flip() funktion, jonka kutsun aina, kun piirrän yhden kirjaimen. Tässä hieman koodia kyseisestä kohdasta:
//selataan kokoelmaa "letters" for(letter = letters.begin(); letter != letters.end(); ++letter) { SDL_Flip(screen); //place on int-muuttuja, jonka avulla laitetaan kirjain oikealle kohdalla x-akselilla, seuraavassa piirretään pinta letter->image pintaan screen koordinaatteihin (place, 35) Draw(letter->image, screen, place, 35); //muutetaan seuraavan kirjaimen paikkaa place += 8; //läpikäytävän kirjaimen indeksiä tarkistetaan n_ltrs++; //ltrs on viimeisen kirjaimen indeksi, jos ollaan sen kohdalla... if(n_ltrs == ltrs) { //...niin boolean-muuttuja showed asetetaan todeksi, ja tätä prosessia ei enää jatketa tällä tapaa showed = true; } //tarkistetaan onko kanavalla 8 ääntä... if(!IsPlaying(8)) { //...ja jos ei ole niin tehdään piippaus-ääni Play("mixer/beep.wav", 8); } //odotetaan hetki ennen uuden kirjaimen käsittelyä SDL_Delay(20); }
Tekstin piirtäminen on oikeastaan eritelty tuon "showed" muuttujan mukaan, jos se on tosi niin kaikkea tuota, kuten SDL_Flip ja äänen toistoa ei käydä läpi vaan keskitytään ainoastaan piirtoon, jolloin teksti näkyy kerralla, jos taas epätosi niin tehdään asiat kuten yllä näkyy, jolloin kaikki näkyy kirjain kerrallaan, tosin kaiken muun pysähtyessä samalla.
Koska kun "showed" muuttuja on tosi, niin SDL_Flip() funktiota ei esimerkiksi ole, josta päättelisin että ongelman ydin on siinä. Tokihan voisin pysäyttää kaiken muun liikenteen ihan tavallisen näyttämisenkin ajaksi, mutta se hankaloittaisi muutamia asioita aika ilkeästi. Kysymyksenä onkin että miten tuon muuttaisi tai onko se edes mahdollista?
No laita tuo kirjainten piirto eri säikeeseen tms?
Ongelmasi on, että kirjainsilmukassa et tee niitä muita asioita. Tietenkin siis muu jatkuu vasta, kun tuo for-silmukka loppuu. Grezin ehdottama säieratkaisu ei toimi, koska luultavasti haluat piirtää muuallakin. Oikea ratkaisu on lisätä itse pelisilmukan loppuun koodi, joka piirtää joka kerta tekstin alusta siihen asti, mihin tekstin pitää näkyä. Esimerkiksi näin:
Uint32 tekstin_aloitusaika; // SDL_GetTicks() kun tekstin ilmestyminen alkaa const int ms_per_kirjain = 30; // ilmestymisnopeus (ts. -hitaus) bool piirto = true; while (pelataan) { // Tähän väliin tulee normaali pelin kulku. // Jos tekstiä pitää piirtää, piirretään se aina alusta asti. if (piirto) { // Lasketaan, mikä on tällä hetkellä viimeinen näkyvä merkki. int pituus = 1 + (SDL_GetTicks() - tekstin_aloitusaika) / ms_per_kirjain; // Lopetetaan tekstin piirto, jos se on ollut esillä yli kaksinkertaisen ajan. if (pituus > 2 * (int) letters.size()) { piirto = false; } // Piirretään teksti tietenkin enintään loppuun asti. if (pituus > (int) letters.size()) { pituus = letters.size(); } for (int i = 0; i < pituus; ++i) { // letter = letters.begin() + i; // Piirrä kirjain, EI SDL_Flip-funktiota, EI SDL_Delay-funktiota. } } // Ja lopussa tarvitaan SDL_Flip, tämä on siis normaaliin pelisilmukkaan kuuluva SDL_Flip-kutsu. SDL_Flip(ruutu); }
Kiitän, nyt ei hyytymistä ole. Ainoastaan jotkut muut tekstin näyttmiseen liittyvät asiat menivät hieman hassusti, mutta nekin on kohta saatu entiselleen.
Aihe on jo aika vanha, joten et voi enää vastata siihen.