Elikkä mulla on tällanen koodi:
do 'kääntyminen 'Suuntia on yhteensä 32(0-31) If GetAsyncKeyState(39) Then suunta = suunta + 1 'oikealle If GetAsyncKeyState(37) Then suunta = suunta - 1 'vasemmalle If suunta < 0 Then suunta = 31 'liitäntäkohdat If suunta > 31 Then suunta = 0 'liitäntäkohdat 'Eteenpäin If GetAsyncKeyState(38) Then 'x-asteikko vauhtix = vauhtix + Sin(11.25 * suunta * rad) / 3 'y-asteikko vauhtiy = vauhtiy - Cos(11.25 * suunta * rad) / 3 'Vauhtirajotukset If vauhtix > 8 Then vauhtix = 8 If vauhtix < -8 Then vauhtix = -8 If vauhtiy > 8 Then vauhtiy = 8 If vauhtiy < -8 Then vauhtiy = -8 End If 'scrollataan scrollx = scrollx + vauhtix scrolly = scrolly + vauhtiy DoEvents loop
Tässä on kuitenkin puutteita, kuten huomata saattaa. Tämä koodi kuljettaa objektia(tässä tapauksessa avaruusalusta) "fysiikan lakien" mukaan niin kauan, kunnes vauhtirajoitukset tulevat vastaan. Sen jälkeen suunta muuttuu "pikkuhiljaa" joksikin väli-ilman suunnaksi paitsi, jos ajaa suoraan jotakin pääilman suuntaa kohti. Miten siis tämän objectin saisi liikkumaan "fysiikan lakien" mukaan eli, että x koordinaatin suuruus ei kasvaisi/laskisi liikaa y koordinaatin suuruuteen/pienuuteen nähden kun otetaan huomioon suunta. Toivottavasti ymmärsitte :)
Kyllähän tuon kai pystyisi tekeen if-lause litanjalla, mutta en kaipaisi sellaista.
Edit: Kirjotusvirheitä...
Huomaan tuossa ajattelussasi yhden pikkuvirheen.
Sinulla näppäimenpainallus vaikuttaa vauhtiin, vaikka sen pitäisi vaikuttaa kiihtymiseen!
Kuulostaa typerältä, mutta näin se vaan on(Mielestäni ihmiskunnan suurimpia oivalluksia).
Acceleration->Velocity->Position eli kiihdytys vaikuttaa vauhtiin ja vauhti paikkaan.
Eli sinun pitäisi lisätä kaikki muut arvot ensin Accelerationiin, jonka jälkeen tämä lisätä "vauhtiin" ja vasta sitten paikkaan.
Kaikki fyysikaaliset "efektit", joita peliisi myöhemmin lisäät, vaikuttavat vain ja ainoastaan accelerationiin(muutamaa poikkeusta lukuunottamatta).
Sitten tuohon sinun ongelmaasi. Kun lisäät accelerationiin tuon Sin tai Cos(11.25*suunta*rad)/3 niin se vaikuttaa automaattisesti vauhtiin siten, että se käyttäytyy fysiikan lakien mukaan.
Vielä lisäksi. Miksi käytät vain 32 suuntaa, kun voisit käyttää 360:tä -> kääntyminen olisi sulavampaa.
Edit:
"Korjattu" koodi
do 'kääntyminen 'Suuntia on yhteensä 32(0-31) If GetAsyncKeyState(39) Then suunta = suunta + 1 'oikealle If GetAsyncKeyState(37) Then suunta = suunta - 1 'vasemmalle If suunta < 0 Then suunta = 31 'liitäntäkohdat If suunta > 31 Then suunta = 0 'liitäntäkohdat 'Eteenpäin If GetAsyncKeyState(38) Then 'x-asteikko accx = accx + Sin(11.25 * suunta * rad) / 3 'y-asteikko accy = accy - Cos(11.25 * suunta * rad) / 3 End If ' Jos haluat, ota tässä vaiheessa kitka mukaan ' accx -= 0.1 ' accy -= 0.1 vauhtix = vauhtix + accx vauhtiy = vauhtiy + accy 'Vauhtirajotukset If vauhtix > 8 Then vauhtix = 8 If vauhtix < -8 Then vauhtix = -8 If vauhtiy > 8 Then vauhtiy = 8 If vauhtiy < -8 Then vauhtiy = -8 'scrollataan scrollx = scrollx + vauhtix scrolly = scrolly + vauhtiy DoEvents loop
edit: Miksi muuten vähennät vauhtiy:stä sen kosini jutun?
En sitä ehtinyt miettiä.
Edit: Mielestäni tuo radiaani(2*pi tarkoittaa 360) vaikuttaa siihen, että se palaa pikkuhiljaa noihin väli-ilmansuuntiin. Piitä kun ei koskaan saa tarpeeksi tarkasti laskettua. ;)
Jos rajoitetaan x- tai y-suunnan nopeutta, täytyy rajoittaa molempia samassa suhteessa, muutoin suunta muuttuu.
Ilmeisesti en selittänyt asiaani tarpeeksi selvästi, sillä ainakaan peki ei valitettavasti tuntunut ymmärtävän sitä. Pekin koodia hieman fiksaamalla sai tosin yhtä toimivan ja voisiko sanoa "parempitapaisemman" koodin, mutta ongelma ei hävinnyt. Toinen vaihtoehto on, että en itse tajunnut :)
Setä sitävastoin tuntuu saaneen kiinni asian ytimestä, mutta tuon olin jo kylläkin ennestään jo hokannut. Se, että kuinka nuo rajat sitten laskettaisiin yksinkertaisesti, on minulle vielä arvoitus(ilmeisesti trigonometrialla, mutta en ole vielä hokannut, että miten, vaikka olen kovasti yrittänytkin).
Sitten vastauksia pekin kysymyksiin:
lainaus:
Vielä lisäksi. Miksi käytät vain 32 suuntaa, kun voisit käyttää 360:tä -> kääntyminen olisi sulavampaa.
Eipä ollut käynyt mielessä, mutta nyt homma on muutettu koodiin ja parempi niin.
lainaus:
Miksi muuten vähennät vauhtiy:stä sen kosini jutun?
Joko ymmärsin kysymyksen väärin tai sitten en, mutta vastaukseni on: että alus kulkisi oikeaan suuntaan :)
lainaus:
Mielestäni tuo radiaani(2*pi tarkoittaa 360) vaikuttaa siihen, että se palaa pikkuhiljaa noihin väli-ilmansuuntiin. Piitä kun ei koskaan saa tarpeeksi tarkasti laskettua. ;)
Tuo voi olla yksi syy pitemmänpäälle mentäessä, mutta tässä tapauksessa ongelmaksi muodostuu ensimmäisenä seuraavat koodirivit:
'Vauhtirajotukset If vauhtix > 8 Then vauhtix = 8 If vauhtix < -8 Then vauhtix = -8 If vauhtiy > 8 Then vauhtiy = 8 If vauhtiy < -8 Then vauhtiy = -8
Tuohon kun vääntäisi kauheet if-lause rajoitukset niin saisi mitä ilmeisimmin homman toimimaan, mutta haluaisin kiertää kaikki sellaiset turhat if-lause litanjat jollakin muulla keinolla(tässätapauksessa mitä ilmeisimmin jollain trigonometria jutulla jolla lasketaan nuo x:n ja y:n maksimijutut kullekkin kulmalle).
edit: tagien kanssa ongelmia...
Suuntiahan voi käyttää niin montaa kuin vain desimaaleja riittää. 1-360 on joissain tapauksissa aika suppea valikoima.
Joo... sain vihdoikin toimiin (lähes)fysiikan lakien mukaan, kun sovelsin pekin koodia ja otin kitkan mukaan (tosin omaperäsessä muodossa). Kiitos kaikille vastanneille!
Edit: (lähes)fysiikan lakien mukaan tarkoittaa tässä tapauksessa, että koodi ei matemaattisesti ole täydellinen mutta näyttää jotakuinkin aidolta.
Ehkä olet tuon jo ratkaissutkin, mutta laitan nyt kuitenkin erään yksinkertaisen ratkaisun:
if vauhtix > 8 then vauhtiy = vauhtiy * 8 / vauhtix vauhtix = 8 end if
jne.
voisko joku lähettää tänne EXEn tosta toi näyttää niin hianolta
voihan koodinkin laittaa...
ja mitä siinä formilla pitää olla
tuosta vauhdin rajoittamisesta vielä. noiden neljän If-lauseen sijaan kannattaisi ehkä kokeilla oheista koodia, joka rajaa nopeuden samaksi kaikkiin suuntiin yhdellä If-lauseella:
vauhti = Sqr(vauhtix^2 + vauhtiy^2) If vauhti > 8 Then vauhtix = vauhtix * 8 / vauhti vauhtiy = vauhtiy * 8 / vauhti End If
Aihe on jo aika vanha, joten et voi enää vastata siihen.