Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Objectin liikkuminen painovoimattomassa tilassa

Sivun loppuun

Gaxx [12.04.2004 11:11:22]

#

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ä...

peki [12.04.2004 11:27:33]

#

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. ;)

setä [12.04.2004 11:44:15]

#

Jos rajoitetaan x- tai y-suunnan nopeutta, täytyy rajoittaa molempia samassa suhteessa, muutoin suunta muuttuu.

Gaxx [12.04.2004 12:49:57]

#

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...

hunajavohveli [12.04.2004 13:55:24]

#

Suuntiahan voi käyttää niin montaa kuin vain desimaaleja riittää. 1-360 on joissain tapauksissa aika suppea valikoima.

Gaxx [12.04.2004 15:11:21]

#

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.

setä [12.04.2004 17:53:04]

#

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.

zigilii [12.04.2004 21:14:42]

#

voisko joku lähettää tänne EXEn tosta toi näyttää niin hianolta
voihan koodinkin laittaa...
ja mitä siinä formilla pitää olla

setä [13.04.2004 08:40:29]

#

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

Sivun alkuun

Vastaus

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

Tietoa sivustosta