Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: SDL: Hyytyminen tekstin näyttämisen aikana

erakko- [06.07.2009 00:07:09]

#

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?

Grez [06.07.2009 00:35:43]

#

No laita tuo kirjainten piirto eri säikeeseen tms?

Metabolix [06.07.2009 08:45:28]

#

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);
}

erakko- [06.07.2009 13:00:29]

#

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.

Vastaus

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

Tietoa sivustosta