Eli kun SDL_gfx:llä tehdään kääntyminen. Eli esim käännytään 45 astetta (osaan tehdä) niin mennään siihen suuntaan eikä vain yksittäisiin neljään suuntaan.
Eli jos painetaan W nappulaa se menee siihen suuntaan mihin katse näyttää? En tarvitse muuta kuin sen koodin miten kuva saadaan liikkumaan katse suuntaan.
x += cos(suunta) * nopeus; y += sin(suunta) * nopeus;
Edit. Ja suunta tietty radiaaneina. (rad = kulma * pi / 180)
Ja y-suunta on tosiaan erilainen, kuin normaalissa koordinaatistossa. Eli nopeus vaikka negatiivisena, jolloin liike menee oikein.
hmm... Eli nyt koodini heittää windows ID 5 erroria (eli "Käyttö estetty").
Kun käynnistän pelin se aukeaa päästyäni huoneeseen kolme se yhtäkkiä vain kaatuu ja heittää tuon errorin ja kysyy "Break" tai "Continue" Continuesta tulee sama uudestaan ja Break katkaisee pelin. Eli missä tuossa koodissa menee nyt pieleen? Alusutkset on tehty erillisessä tiedostossa, jota en tähän nyt laittanut.
if (huone==3) { temp = rotozoomSurface(autona_oma, rad2deg(suunta), 1, 1); SDL_FreeSurface(autona_oma); PiirraKuva(rata_1, naytto, 0, 0); PiirraKuva(temp, naytto, oma_x, oma_y); SDL_Flip(naytto); nappi = SDL_GetKeyState(NULL); if (nappi[SDLK_UP]) { oma_x += cos((double) suunta) * nopeus; oma_y += sin((double) suunta) * nopeus; } if (nappi[SDLK_LEFT]) { suunta+=1; } if (nappi[SDLK_RIGHT]) { suunta-=1; } }
Tuleeko kaatuminen heti huoneeseen 3 siirtymisen jälkeen? Onko temp varmasti SDL_Surface* tyyppinen? Voiko autona_oma pinnan varmasti vapauttaa tuossa? Toimiiko Piirrakuva funktio varmasti oikein? Onnistuuko alustukset varmasti?
Tietokone suorittaa koodiasi uskomattoman nopeasti, joten sinun oisi hyvä odotella hetken aikaa vaikkapa SDL_Delay(150) funktion avulla 150 on siis millisekuntien määrä, joka odotellaan.
EDIT: jaha mika132 poistikin viestinsä, mutta vastaus liittyy liian nopeaan pyörimiseen.
Autoni kulkusuunnalla ei ole mitään tolkkua kun sain tuon toimimaan.
Auto saattaa ajaa suoraan sitten hieman hipaisen vasemmalle niin auto menee jo kylki edellä luoteeseen painan oikealle niin se menee jo täyttä vaihtia etelään. Suomeksi se ei mene ihan nyt sinne mihin keula osoittaa vaan välillä menosuuntaan on keulasta kulma tai kylki tai takapää.
if (huone==3) { temp = rotozoomSurface(autona_oma, suunta, 1, 1); PiirraKuva(rata_1, naytto, 0, 0); PiirraKuva(temp, naytto, oma_x, oma_y); SDL_Flip(naytto); nappi = SDL_GetKeyState(NULL); if (nappi[SDLK_UP]) { oma_x += cos((double) suunta) * nopeus; oma_y -= sin((double) suunta) * nopeus; } if (nappi[SDLK_LEFT]) { suunta+=1; } if (nappi[SDLK_RIGHT]) { suunta-=1; } }
Huomaa, että sin ja cos funktiot haluavat suunnan radiaaneina ja rotoZoomSurface asteina. En tuosta nopeasti katsottuna löytänyt tuon muunnosfunktion käyttöä mistään. Huomaa lisäksi, että asteet menevät välille 0 - 359 ja radiaanit välille 0 - 6.28 (noin)
Juu laitoin tuon, mutta ongelmaksi tulee se mikä minulla oli aikaisemmin kun minulla oli tuo koodi. (Tai sitten teen väärin). Mutta siis autollani on nyt vain seitsemän kulmaa. Eli se menee "nykimällä" (Kaakkoon, Lounaaseen, Länteen, Luode, Luoteen ja pohjoisen väliin, Pohjoiseen.)
double rad2deg(double rad){ return ((rad * 180) / 3.1415927); } if (huone==3) { temp = rotozoomSurface(autona_oma, rad2deg(suunta), 1, 1); PiirraKuva(rata_1, naytto, 0, 0); PiirraKuva(temp, naytto, oma_x, oma_y); SDL_Flip(naytto); nappi = SDL_GetKeyState(NULL); if (nappi[SDLK_UP]) { oma_x += cos((float) suunta) * nopeus; oma_y -= sin((float) suunta) * nopeus; } if (nappi[SDLK_LEFT]) { suunta+=1; SDL_Delay(150); } if (nappi[SDLK_RIGHT]) { suunta-=1; SDL_Delay(150); } }
No ei taida ihan olla oikea paikka tuolle SDL_Delaylle... Ota ne siis pois.
Laitahan tuo suunta += 1 muotoon suunta += 0.01 (niin ja suunta liukuluvuksi) vaikka näin aluksi ja kokeilet mitä tapahtuu. Oikeastihan tuo sitten tehdään niin että tuo kulman lisäys samoin kuin paikan lisäys riippuu siitä, kuinka nopeasti peli pyörii kyseisellä koneella, jotta sitten peli pyörii "reaaliajassa" kaikilla koneilla.
mika132 kirjoitti:
Juu laitoin tuon,
Tuon?
mika132 kirjoitti:
mutta ongelmaksi tulee se mikä minulla oli aikaisemmin kun minulla oli tuo koodi. (Tai sitten teen väärin).
Oli mikä koodi missä?
Ei näytä selityksestä tulevan mitään joten:
temp = rotozoomSurface(autona_oma, rad2deg(suunta), 1, 1); PiirraKuva(rata_1, naytto, 0, 0); PiirraKuva(temp, naytto, oma_x - temp->w / 2, oma_y - temp->h / 2); SDL_FreeSurface(temp); SDL_Flip(naytto);
Käytä mieluummin floattia noiden paikkojen ilmottamiseen. Ja suosittelisin oikeasti opettelemaan usean tiedoston käyttö oikeaoppisesti, tuollanen includettaminen on pahasta.
Kiitos! Kiitos paljon! =)
Vielä ihan pieni kysymys miten pystyin tarkistamaan, että jos jokin tietty nappula nousee niin tehdään jotain?
if (nappi[SDL_KEYUP]) { nopeus-=0.01; oma_x += cos((float) suunta) * nopeus; oma_y -= sin((float) suunta) * nopeus; }
tuo ei ainakaan pudota nopeutta pikku hiljaa vaan nopeus pysää kuin seinään. Syykin luultavasti on se, että ei se tiedä mikä nappula nousee ylös, joten miten sainkaan sen tietyn napin tarkastettua. Se on ihan kielen päällä, mutta ei muisti millään mieleen. :)
Ei sitä noin voi tehdä. En viitsi perustella sen kummemmin, kun tuskin siitä mitään ymmärtäisit..
Jotenkin tähän tyyliin ehkä:
if (nappi[SDLK_UP]) { nopeus += KIIHTYVYYS; if (nopeus > MAKSIMI_NOPEUS) { nopeus = MAKSIMI_NOPEUS; } } else { nopeus -= HIDASTUVUUS; if (nopeus < 0.0) { nopeus = 0.0; } } oma_x += cos(suunta) * nopeus; oma_y -= sin(suunta) * nopeus; piirra_ruma_bussi(oma_x, oma_y);
Sitten jos tuosta hyvän haluaisi, niin laittaisi sitten kertoimiksi vielä kuluneen ajan niin kuin edellä jo mainitsin, mutta senhän voit itse varmasti sitten tehdä...
Noniin nyt olen onnistunut luomaan Proto kisaenginen ja olen siihen tyytyväinen ja opein pari asiaakin, mutta ongelmana on, että SDL ns. Kameran liikuttaminen on vaikeaa joten nyt pyydän suoraa kommentoitua OpenGL kameran liikutus koodia mikä seuraa SDL ladattua kuvaa. Olisin enemmän kuin kiitollinen.
Et sinä nyt rupea mitään OpenGL:ää tähän sotkemaan.
Kameran liikuttaminen tarkoittaa siis käytännössä sitä, että piirrettäviä asioita siirretään näytöllä vastakkaiseen suuntaan (esim. taustakuvaa ja muita ei kameran mukana liikkuvia). Se objekti, mitä kamera seuraa (sinun tapauksessasi ruma bussi), pysyy keskellä ruutua ja siis tausta sitten piirretään bussin koordinaattien vastaiseen kohtaan.
Eli:
PiirraKuva(tausta, taustan_paikka_x(varmaan 0) - bussin_paikka_x, tausta_y(=0) - bussi_y); PiirraKuva(bussi, ruudunleveys / 2, ruudunkorkeus / 2);
Kun aloin liittämään botti engineä peliin niin kohtasin ongelman. Olen luultavasti vain liian väsynyt ja katsonut koodia niin paljon, että en huomaa jotain pientä virhettä, mutta ongelma on:
AI pelaaja (temp-2) ei ole missään pelikentällä.
HUOM! Vain osa koodista
#include "data/start.lu" //alustukset #include "data/functions.lu" // funktioita #include "data/tekoaly.lu" //tekoäly minkä sisältö alempana if (huone==4) { temp = rotozoomSurface(autona_oma, rad2deg(suunta), 1, 1); temp_1 = rotozoomSurface(mittari_itse, rad2deg(suunta_nopeus), 1, 1); temp_2 = rotozoomSurface(autona, rad2deg(vas_1_suunta), 1, 1); PiirraKuva(rata_1, naytto, 450-oma_x, -780-oma_y); PiirraKuva(mittari, naytto, 0, 0); PiirraKuva(temp, naytto, 1024 / 2 - temp->w / 2, 768 / 2 - temp->h / 2); PiirraKuva(temp_1, naytto, 69 - temp_1->w / 2, 52 - temp_1->h / 2); PiirraKuva(temp_2, naytto, vas_x_1 / 2 - temp_2->w / 2, vas_y_1 / 2 - temp_2->h / 2); SDL_FreeSurface(temp); SDL_FreeSurface(temp_1); SDL_FreeSurface(temp_2); SDL_Flip(naytto); nappi = SDL_GetKeyState(NULL); if (nappi[SDLK_LEFT]) { if (nopeus >= 6) { suunta+=0.02; } if (nopeus >= 3.01 && nopeus <= 5.99) { suunta+=0.05; } else if (nopeus <= 3) { suunta+=0.1; } } if (nappi[SDLK_RIGHT]) { if (nopeus >= 6) { suunta-=0.02; } if (nopeus >= 3.01 && nopeus <= 5.99) { suunta-=0.05; } else if (nopeus <= 3) { suunta-=0.1; } } if (nappi[SDLK_DOWN]) { nopeus -= JARRUJENTEHO; if (nopeus < 0.0) { nopeus = 0.0; } } if (nappi[SDLK_UP]) { nopeus += KIIHTYVYYS; if (nopeus > MAKSIMI_NOPEUS) { nopeus = MAKSIMI_NOPEUS; } } else { nopeus -= HIDASTUVUUS; if (nopeus < 0.0) { nopeus = 0.0; } } oma_x += cos((float) suunta) * nopeus; oma_y -= sin((float) suunta) * nopeus; Tekoaly(); vas_x_1 += cos((float) vas_1_suunta) * vas_1_nopeus; vas_y_1 -= sin((float) vas_1_suunta) * vas_1_nopeus; suunta_nopeus=-nopeus/7; }
tekoaly.lu:
void Tekoaly(void) { vas_1_nopeus += 0.1; if (vas_x_1 >= 1800 && vas_x_1 <= 2255 && vas_y_1 >= 1712 && vas_y_1 <= 1960) { if (vas_1_nopeus >= 3) { vas_1_nopeus-=0.8; } else if (vas_1_nopeus <= 2.99) { } } else if (vas_x_1 >= 2345 && vas_x_1 <= 2750 && vas_y_1 >= 1712 && vas_y_1 <= 1960) { } }
Aihe on jo aika vanha, joten et voi enää vastata siihen.