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?
Jos et lähetä tänne sitä koodia, mikä kusee, niin miten me muka tiedetään missä virhe on?
vehkis91 kirjoitti:
Jos et lähetä tänne sitä koodia, mikä kusee, niin miten me muka tiedetään missä virhe on?
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:
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.
Ei siinä koodissa ole mitään vikaa. Kysynkin että onko Windowssissa jotain erilaista kun ei frameraten kanssa toimi.
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:/
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.
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ä.
"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 :)
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.
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.
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.
Kiitos Gaxx, toimi mainiosti.
Aihe on jo aika vanha, joten et voi enää vastata siihen.