Miten saa helpolla ja aloittelija-ystävällisellä tavalla määriteltyä, törmääkö esim. X Y:hyn. ja miksi tämä esimerkki ei älyä törmäystä:
x = 10
y = 200
do
x = x + .001
circle (x , 100),1,3
if x = y then print "TÖRMÄYS"
loop
sinun täytyy pyöristää x kokonaisluvuksi. En muista qb:stä enää kaikkia asioita mutta laita vaikka int(x).
eli siis if int(x)=y...? vai...?
Näinkin.
Onkos muita mahdollisia vaihtoehtoja...?
x = x + .001
Ei lisää x:ään aivan tarkalleen .001. Pyöristäminen auttaa, kuten tuossa äsken näytitkin.
Juu nyt rupes homma pelittään... Kun ei tuossa Qbasic käsikirjassa tollasia oikeen kerrota...
Liukulukuja (SINGLE, DOUBLE) ei voi vertailla tarkasti, vaan pitää tarkistaa, eroavatko luvut toisistaan tarpeeksi vähän. Syynä on lukujen tallennusmuodosta johtuvat pyöristysvirheet. Toinen vaihtoehto on käyttää kokonaislukuja (INTEGER, LONG), joita voi vertailla luotettavasti. Silloin tosin luvuissa ei voi olla desimaaliosuutta. Tämän rajoituksen voi tietyissä tapauksissa kiertää tallentamalla luvut esim. tuhatkertaisina, jolloin niihin tavallaan saa kolme desimaalia.
Jos kysymyksessä on kahden pisteen törmäys, tarkistukseen riittää tosiaan koordinaattien vertailu. Kahden suorakulmion törmäyksen voi myös melko helposti tarkistaa koordinaateista. Jos tällainen tarkistus täytyy tehdä, kannattaa hahmotella kaikki tapaukset kynällä ja paperilla ja miettiä, kuinka ne voi tunnistaa. Pelissä olevia kuvia voi myös usein kohdella tarkistuksissa suorakulmioina, jolloin välttyy monimutkaisemmilta törmäyslaskelmilta.
Ja jos voit ajatella objektin ympyräksi, törmäystarkistus on vielä helpompaa. Kaksi ympyrää leikkaa toisensa, jos niiden keskipisteiden välinen etäisyys on pienempi kuin säteiden summa, ja kahden pisteen etäisyys lasketaan kaavalla sqrt ( (x2-x1)^2 + (y2-y1)^2 )
Enhän minä aloittelija tuollaisia oikein tahdo ymmärtää...:P Mutta jospa se tästä hiljalleen rupeis etenemään.
voisitko Heikki antaa pienen koodiesimerkin...?
Public Type Pallo X As Single Y As Single Säde As Single End Type Dim A As Pallo Dim B As Pallo ' (A.X - B.X) = a Yksi kolmion sivu ' (A.Y - B.Y) = b Toinen kolmion sivu ' (A.Säde + B.Säde) = c ' Pythagoraan lause: a^2 + b^2 = c^2 ' Siis jos (a^2 + b^2 < c^2), niin on tapahtunut törmäys. ' Yhtäsuuruus tarkoittaisi, että ympyrät juuri hipovat toisiaan ' Jos (a^2 + b^2 > c^2), niin ne eivät osu toisiinsa. ' Tämän voisi tietenkin laskea apumuuttujilla vähän kauniimmin... If (((A.X - B.X) * (A.X - B.X)) + ((A.Y - B.Y) * (A.Y - B.Y))) < ((A.Säde + B.Säde) * (A.Säde + B.Säde)) Then ' Törmättiin End If
Aaaargh... Sit lukion jälkeen nuo ehkä ymmärtää lopultakin... xD
Itse asiassa tuo menee ihan yläastematikalla. On kaksi pistettä koordinaatistossa, muodostetaan näiden avulla suorakulmainen kolmio ja käytetään pythagoraan lausetta. Piirsin tästä pienen kuvan joka toivottavasti selventää asiaa hieman.
Metabolixin esimerkissä tuota kaavaa vaan muutetaan siten, että neliöjuurta ei oteta, vaan sen sijaan katsotaan onko etäisyyden neliö (eli siis se lauseke, mistä normaalisti otettaisiin neliöjuuri) pienempi kuin säteiden summan toinen potenssi.
Mutta entäs sama niiden pallojen kanssa...
No jos tuo etäisyys pallojen keskipisteiden välillä on pienempi kuin niiden yhteenlasketut säteet, tapahtuu törmäys.
Edit: Toinen kuva: http://koodaa.mine.nu/~vohveli/pallot.PNG
Koodinäyte?
Edit: Jossa on mukana myös itse pallo ja objekti mihin törmätään...
Sellaisenhan Metabolix jo antoi tuossa, mutta pistetään nyt vielä:
IF (x1-x2)^2 +(y1-y2)^2 < r1+r2 THEN Törmättiin
*AHAA-elämys* No nyt tais joku lähtee liikkeelle tuolla pääkopan sisässä...!
Edit: Miten hunajavohvelin esimerkissä määritetään muuttujat r1 ja r2?
Muuttujat r1 ja r2 tarkoittavat ympyröiden säteitä, mikä ilmenee myös kuvasta. Kaikki ympyrän kehällä olevat pisteet ovat yhtä etäällä sen keskipisteestä - säteen verran. Jos kahden ympyrän keskipisteet ovat niin lähellä toisiaan, että välissä ei ole tilaa molempien ympyröiden säteille, ympyrät osuvat toisiinsa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.