Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: SDL_framerate ja Dev-C++

Sivun loppuun

erakko- [29.08.2008 09:52:58]

#

Huomasin äsken, että kääntämäni exe-tiedosto sulkeutuu virheeseen "Sovelluksen alustaminen epäonnistui". Kun kommentoin kaikki framerate funktiot, ohjelma toimi, mutta liian nopeasti. Muuten ohjelma kääntyi virheettä.

Eli mikä on vialla?

vehkis91 [29.08.2008 12:00:19]

#

Jos et lähetä tänne sitä koodia, mikä kusee, niin miten me muka tiedetään missä virhe on?

Tzaeru [29.08.2008 12:50:19]

#

vehkis91 kirjoitti:

Jos et lähetä tänne sitä koodia, mikä kusee, niin miten me muka tiedetään missä virhe on?

http://andwiki.dy.fi/Kristallipallo

Newb [29.08.2008 12:52:13]

#

Tzaeru kirjoitti:

vehkis91 kirjoitti:

Jos et lähetä tänne sitä koodia, mikä kusee, niin miten me muka tiedetään missä virhe on?

http://andwiki.dy.fi/Kristallipallo

http://andwiki.dy.fi/Kristallipallo:

Virhe!
Palvelimeen ei saatu yhteyttä

Yritit päästä osoitteeseen http://andwiki.dy.fi/Kristallipallo, joka on tällä hetkellä saavuttamattomissa. Varmista, että www-osoite on kirjoitettu pisteineen oikein ja kokeile sitten sivun päivittämistä.
Varmista, että Internet-yhteys on aktiivinen ja katso, toimivatko muut samaa yhteyttä käyttävät ohjelmat oikein.

erakko- [29.08.2008 13:29:58]

#

Ei siinä koodissa ole mitään vikaa. Kysynkin että onko Windowssissa jotain erilaista kun ei frameraten kanssa toimi.

Blaze [29.08.2008 13:49:49]

#

http://andwiki.dy.fi/Kristallipallo:

Yritit päästä osoitteeseen http://andwiki.dy.fi/Kristallipallo, joka on tällä hetkellä saavuttamattomissa.

Aina tuo kans on alhaalla :(
/me slaps Phantom around a bit with a two-kilo whitefish

http://web.archive.org/web/20070917031618/http://andwiki.dy.fi/Kristallipallo

Tzaeru [29.08.2008 15:12:45]

#

erakko- kirjoitti:

Ei siinä koodissa ole mitään vikaa. Kysynkin että onko Windowssissa jotain erilaista kun ei frameraten kanssa toimi.

Olet siis kokeillut, että toimii muilla käyttöjärjestelmillä? Näyttäisit vain sen koodin.

erakko- [29.08.2008 15:38:17]

#

Tässä on koodi:
http://servut.us/erakko/pong.txt

Eli minulla tämä on toiminut Linuxilla täydellisesti, ja varmasti toimisi nytkin jollei SDL herjaisi "no available video devicea". Windowsin kanssa meni taas hirmu säätämiseksi että mokoman sai käännettyä, ja koodiakin piti vielä muokkailla. Siis Windowsilla toimii ainoastaan jos kommentoi framerate funktiot. Mutta silloin pelaaminen on mahdotonta. Kääntyminen onnistuu tosin ilman virheitä.

Gaxx [29.08.2008 15:58:34]

#

"Eräs tietolähde" väittää, että kyseessä on 64 bittinen windows vista. pitääköhän tämä paikkansa?

Voithan tehdä itse tuon frameratesysteemin. Ei se mikään maatamullistava systeemi ole.

void framerate(int rate) {
   static Uint32 startTime = SDL_GetTicks();

   // Odotellaan, kunnes aikaa on kulunut riittävästi
   while(startTime > SDL_GetTicks()) {}

   startTime += 1000 / rate;
}

// ...

// Pelilooppi
while(peliPyorii) {
   // Tässä tehdään pelin jutut

   // Jarrutetaan FPS 60:een
   framerate(60);
}

Koodi on testaamaton, joten suhtaudu pienellä varauksella :)

erakko- [29.08.2008 16:04:54]

#

Gaxx kirjoitti:

"Eräs tietolähde" väittää, että kyseessä on 64 bittinen windows vista. pitääköhän tämä paikkansa?

Ei, siinä koneessa on XP.

Koitan tuota sitten kun pääsen taas sille koneelle. Jotenkin muistan että olisin kokeillut tuota ennen mutta tarvitsi jonkun toisen kirjaston jota taas en saanut toimimaan... Tuo GetTicks...

Ja nyt sain myös SDL:n taas toimimaan ja vahvistan vielä että Linuxilla toimii erinomaisesti.

Gaxx [29.08.2008 16:14:03]

#

No vika saattaa olla myös siinä, että SDL:n asennuksessa on jotain vikaa. Itselläni oli viimepäivinä ongelmia SDL_GetModState():n kanssa. Vika korjaantu sillä, kun päivitin SDL.dll:n :)

Parempi ratkaisu tuohon ohjelman nopeuden hillintään on toteuttaa kappaleiden liike ihan klassisen fysiikan kaavan mukaisesti: x += v*t missä x on kappaleen paikka, v kappaleen nopeus ja t yhteen peliloopin kierrokseen kulunut aika.

os [29.08.2008 16:26:15]

#

Ei näin

Gaxx kirjoitti:

while(startTime > SDL_GetTicks()) {}

vaan näin

while(startTime > SDL_GetTicks()) { SDL_Delay(1); }

Eräs frameraten rajoituksen keskeisistä ideoista on se, ettei kone käytä kaikkea prosessoritehoaan jonkin tyhjän loopin pyörittämiseen. Frameraten rajoituksen voi toteuttaa myös näin:

Uint32 limit_frame_rate(Uint32 fps)
{
    Uint32 cur_ticks, optimal, last_frame_time;
    static Uint32 last_ticks = SDL_GetTicks();

    /* Lasketaan edellisellä framella kulunut aika */
    last_frame_time = cur_ticks - last_ticks;

    /* Tavoiteframeratella kuluva aika */
    optimal = 1000/fps;

    /* Nukutaan ylijääneen ajan verran */
    if(last_frame_time < optimal) SDL_Delay(optimal-last_frame_time);
    else SDL_Delay(1); /* tästä voi olla hyötyä */

    /* SDL_Delayn aiheuttama viive ei ole mitenkään taattu,
       lasketaan kulunut aika uudestaan */
    cur_ticks = SDL_GetTicks();
    last_frame_time = cur_ticks-last_ticks;
    last_ticks = cur_ticks;

    /* Palautetaan framella kulunut aika */
    return last_frame_time;
}

Paluuarvoa voi käyttää pelimekaniikan laskemiseen Gaxxin esittämällä tavalla.

erakko- [01.09.2008 13:17:33]

#

Kiitos Gaxx, toimi mainiosti.


Sivun alkuun

Vastaus

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

Tietoa sivustosta