|
dev.gamez.lv Latvian Game Developers Community
|
View previous topic :: View next topic |
Author |
Message |
Tankists
Joined: 18 Dec 2006 Posts: 81 Location: Baldone
|
Posted: Fri Sep 05, 2008 5:58 pm Post subject: [SDL] 2D animācija, freimreits |
|
Taisot savu pirmo 2D spēli ar C++, SDL sastopos ar nelielu problēmu. Galvenajam varonim kā jau saprotams ir animācija, lai izskatītos ka varonis skrietu, bet man šī animācija ir atkarīga no freimreita, t.i. ja freimreits ir pārāk liels, tad animācija rādās tik ātri, ka pat īsti nevar saprast, ka varonis kustās, bet ja freimreits ir mazs, tad spēle paliek nebaudāma. Meklējot ar Googli atradu kādu Mario Wars spēli, kas taisīta ar SDL un C++, kurai ir tieši tāds rezūltāts, kādu es vēlos panākt, t.i. freimrets pietiekami liels, lai viss kustētos plūstoši, un animācija kustētos savā tempā. Diemžēl links uz sourci bija saplīsis. :(
Freimreitu kontrolēju tā, kā iemācījos Lazy Foo tutoariālī. Nav ne mazākās nojausmas cik tas ir pareizi vai nepareizi, tāpēc vēlos no pieredzējušiem game dev`iem dzirdēt viedokli.
Lietas, kas man nav īsti skaidras:
Kā pareizi ir rīkoties ar freimreitu?
Kāds īsti ir optimālais freimreits, kas ir 2D spēlēs?
Paldies jau iepriekš. |
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Fri Sep 05, 2008 6:07 pm Post subject: |
|
var darīt šādi:
animācijas_laiks += delta_laiks * animācijas_ātrums;
if( animācijas_laiks >= animācijas_max_laiks )
{
animācijas_laiks = 0;
}
un atrodot īsto kadru:
kadrs = (int) animācijas_laiks;
kopumā - visām darbībām, kuras atkarīgas no laika, jāpieskaita delta_laiks jeb tas laiks, kurš parāda, cik ilgi tika apstrādāts iepriekšējais kadrs. (nesen tev jau par to stāstīja šeit citā topikā, ja pareizi atceros)
optimālo freimreitu neviens nepateiks
tas ir atkarīgs no datora un tā, ko vajag izdarīt spēlei, un tāpat vajag veikt testus ar optimizētu kodu (kaut gan nav pat zināms, cik daudz jāoptimizē), un tad būs tas optimālais freimreits, kura iegūšanai vajadzēja optimālo freimreitu
tā kā par to pagaidām neuztraucies, bet, ja spēle galīgi lēna kļūst ne no kā, tad gan jāuztraucas vai jāliek topiks šeit, jo tas nozīmē, ka vai nu pieļauta kļūda, vai (ja lietots OpenGL) karte neatbalsta kādu iespēju un viss sāk strādāt bez videokartes paātrinājuma (software modē) _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
Tankists
Joined: 18 Dec 2006 Posts: 81 Location: Baldone
|
Posted: Fri Sep 05, 2008 6:41 pm Post subject: |
|
Laikam neesmu tik pieredzējis, ka līdz galam neizpratu tavu ideju, bet izskaki vismaz savu viedokli par šādu ideju, kas skatoties tavu variantu ienāca prātā: pārslēgties uz nākošo animācijas freimu, tikai ik pa 10 freimiem, ņemot vērā, ka freimreits ir 60fps...? |
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Fri Sep 05, 2008 7:19 pm Post subject: |
|
tur tā problēma, ka kadru skaits sekundē varētu nebūt 60, pietam bieži
skatos, ka tajā Lazy Foo tutoriālī ir kadru skaita limitētājs, nevis game loops, kurš tam pielāgojas..
nu tādā gadījumā to "delta_laiks" var izņemt un tikai regulēt mainīgo "animācijas_ātrums", līdz animācija iet īstajā ātrumā..
hm...
Quote: |
...bet man šī animācija ir atkarīga no freimreita, t.i. ja freimreits ir pārāk liels, tad animācija rādās tik ātri, ka pat īsti nevar saprast, ka varonis kustās, bet ja freimreits ir mazs, tad spēle paliek nebaudāma.
Freimreitu kontrolēju tā, kā iemācījos Lazy Foo tutoariālī. Nav ne mazākās nojausmas cik tas ir pareizi vai nepareizi, tāpēc vēlos no pieredzējušiem game dev`iem dzirdēt viedokli. |
Šie abi nesaskan.
ja tu tiešām kadru skaitu tā kontrolē, tad tur nebūtu jābūt animācijai atkarīgai no FPS. _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
Tankists
Joined: 18 Dec 2006 Posts: 81 Location: Baldone
|
Posted: Fri Sep 05, 2008 7:49 pm Post subject: |
|
Tieši tā arī kontrolēju. Sanāk, ka katrā kadrā tiek pārbaudīts, vai ir pagajušas 1000 / FPS milisekundes, ja nav, tad SDL_Delay atlikušo laiku.
Animācija zīmējās man šitā:
Code: |
if (xVel < 0)
{
status = TURNED_LEFT;
frame++;
}
else if (xVel > 0)
{
status = TURNED_RIGHT;
frame++;
}
else
{
//ja nekustās
frame = 0;
}
if (frame >= 4)
{
frame = 0;
}
if (status == TURNED_LEFT)
{
imageHandler->applySurface(box.x, box.y, player, screen, &clipsLeft[frame]);
}
else if (status == TURNED_RIGHT)
{
imageHandler->applySurface(box.x, box.y, player, screen, &clipsRight[frame]);
} |
(ceru ka saprotami)
Par cik varonis tiek zīmēts katrā freimā, arī animācija regulējās katrā kadrā.
Labprāt iemācītos nevis kontrolēt FPS, bet to ko tu domāji, varbūt ir kāds links? |
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Fri Sep 05, 2008 8:14 pm Post subject: |
|
Tankists wrote: | Sanāk, ka katrā kadrā tiek pārbaudīts, vai ir pagajušas 1000 / FPS milisekundes, ja nav, tad SDL_Delay atlikušo laiku.
|
tāpēc jau animācijai vajadzētu iet neatkarīgi no kadru skaita sekundē
Tankists wrote: | Labprāt iemācītos nevis kontrolēt FPS, bet to ko tu domāji, varbūt ir kāds links? |
http://dewitters.koonsolo.com/gameloop.html
http://www.gaffer.org/game-physics/fix-your-timestep
iesaku lietot vismaz to game loopu, kurā izmanto laika akumulatoru, un tam iziet cauri pa mazām laika daļām
(3. no otrā linka)
ar otro problēmas rodas tieši pie ātro datoru īpašniekiem -
parādās diezgan daudz nesaprotamas kļūdas _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
Tankists
Joined: 18 Dec 2006 Posts: 81 Location: Baldone
|
Posted: Fri Sep 05, 2008 8:51 pm Post subject: |
|
Paldies, tiešām labs lasāmais par game loop tas pirmais.
Domājams ka problēmu nebūs ar animāciju un freimreitu. |
|
Back to top |
|
|
Storm
Joined: 11 Apr 2006 Posts: 742
|
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Sat Sep 06, 2008 12:47 pm Post subject: |
|
O, jā, "super" priekš tāda, kurš vēl mācās - optimizēts kods skaidra, viegli saprotama koda vietā
Un, omg, viņš nenormāli ( ) paātrina spēli, jā! _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Sat Sep 06, 2008 1:47 pm Post subject: |
|
šņak: tu jau nu esi īstais, kam pārmest tāda koda rakstīšanu. Paskaties vispirms uz sevi, pirms runāt par citiem: http://dev.gamez.lv/viewtopic.php?t=1513 (un tas nav vienīgais topiks). |
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Sat Sep 06, 2008 2:40 pm Post subject: |
|
stfu, es mācos. un nemācu nepareizi. _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Sat Sep 06, 2008 2:56 pm Post subject: |
|
snake5 wrote: | stfu, es mācos. un nemācu nepareizi. |
frame %= 4; ir nepareizi?
Tavs kods, snake, paarbauda, vai frame ir lielāks par 4 un, ja ir, tad frame = 0. A ko tavs kods izdarīs, ja būs pamazs framerate un frame uzleks uz 5? Tavā kodā, snake, frame = 0 (animāciju šajā vietā atpaliek), bet Storm kodā 1 (kā arī vajadzētu būt).
P.S. Iespējams, ka šāda situācija nekad nenotiks, bet tu, snake, runāji par nepareizu kodēšanu. Tad tieši tavs kods ir nepareizs. _________________ long time; /* know C */ |
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Sat Sep 06, 2008 3:31 pm Post subject: |
|
tur, jā, sorry, kļūdījos, bet to var vienkārši salabot
btw, es nerunāju par nepareizu kodu, bet par to, vai vajadzība optimizētu kodu likt skaidra koda vietā. _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Sat Sep 06, 2008 3:55 pm Post subject: |
|
Atkal nepareizi! Un ja frame = 10? Buus jaataisa while(frame >= 4) frame -= 4. Tev tieshaam tas liekas saprotamaak/skaidraak kaa frame %= 4? _________________ long time; /* know C */ |
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Sat Sep 06, 2008 4:08 pm Post subject: |
|
ok, nesteigšos, tā vnk nevaru normāli padomāt.
btw, tev tiešām liekas, ka viņš paņems tādu game loopu, kurā delta time būs nevis sadalīts un katra daļa padota update funkcijai, bet tā, ka visu delta time pados update funkcijai?
tā nu noteikti nebūs vienīgā problēma, kuru vajadzēs atrisināt tādā gadījumā.
Ja kodu lasot, to pat izņemtu no funkcijas var labi saprast, tad tas ir skaidrs. Varu derēt, ka kompilētājs pats ar to tiktu galā.
Tā nav skriptu valoda. Zinu, ka, piemēram, Game Maker'ā vajadzētu to "frame %= 4;" kaut vai dēļ tā, ka optimizēt kodu Game Maker'is neprot. _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|