Miten saa toteutettua tälläisen: Kuvan pitäisi lähteä hiiren klikkauksen suuntaa suoraan tietystä pisteestä eli kaksi koordinaattia tiedetään.
Lue matematiikkaoppaasta kulmia ja vektoreita käsittelevät osat, niin tiedät, mitä laskea. Sitten tarvitset vain jonkin tavan muuttaa kuvan sijaintia; tämä riippuu täysin ohjelmasi rakenteesta.
/* Objekti ( x1, y1 ) siirtyy objektin ( x2, y2 ) suuntaan k on vakio, joka määrää siirrytyn matkan pituuden */ int s = Math.sqrt( Math.pow( x1 - x2, 2 ) + Math.pow( y1 - y2, 2 ) ); x1 += k * ( x1 - x2 ) / s; y1 += k * ( y1 - y2 ) / s;
Ehdottaisin Pete2:n koodiin kahta muutosta. Ensinnäkin, Math.sqrt palauttaa reaaliluvun, joten s-muuttuja voisi olla tyyppiä double. Jos Petellä on hyvä syy int-tyypin käyttöön, voi hän tietenkin kertoa.
Tämä ei ole välttämättä iso ero ohjelman toiminnan kannalta. Mielestäni ei kuitenkaan kannata pyöristää arvoja liian aikaisin, ellei ole varma ettei se haittaa.
Toinen kohta on tapaus, jossa s on nolla. Tämä seuraa siitä, kun x1==x2 ja y1==y2, eli klikkaus tapahtuu samassa paikassa kuin missä kuva on. Nollalla jakaminen on ongelmallista, joten suosittelisin seuraavaa muutosta.
if (s > minDistance) { x1 += k * ( x1 - x2 ) / s; y1 += k * ( y1 - y2 ) / s; }
Tässä siis liike tapahtuu vain jos s, eli etäisyys kuvasta klikattuun kohtaan, on yli jonkin halutun minimin. MinDistance-vakiolla voi vaikuttaa siihen, kuinka kaukana klikkauskohdan pitää olla kuvan nykyisestä paikasta, jotta liikettä tapahtuisi. On nimittäin aika hassua, että kuvaa zuumaa yhtäkkiä jonkin matkaa johonkin yllättävään suuntaan, kun sen päälle klikkaa hiirellä.
Kokeilemalla eri arvoja tälle vakiolle saa ohjelmaan sopivan arvon löydettyä aika nopeasti. Voi olla, että riittää testata s>0:kin. Kokeilemalla se selviää, kun itse tietää miten ohjelmansa suunnilleen haluaa toimivan.
Tulipa pitkä selitys lyhyen korjausehdotuksen perusteeksi. Älkää nyt pahastuko. Ei ole aikaa kirjoittaa lyhyttä.
Muutokset ovat tietenkin aiheellisia, mutta en tarkoittanutkaan pätkää suoraan kopioitavaksi, vaan pelkästään matemaattiseksi malliksi, mitä nyt hieman javan syntaksia viestin sijainnin takia sisälsikin.
Et kuitenkaan huomauttanut huolimattomuusvirheestäni.
x1 += k * ( x2 - x1 ) / s; y1 += k * ( y2 - y1 ) / s;
Kiitos avusta. Ohjelmani toimii nytten niin kuin pitää, mutta joiduin vaihtaa
x1 += k * ( x2 - x1 ) / s;
y1 += k * ( y2 - y1 ) / s;
tälläiseksi:
x1 -= k * ( x2 - x1 ) / s;
y1 -= k * ( y2 - y1 ) / s;
Seuraavat toimivat:
x1 += k * ( x2 - x1 ) / s; y1 += k * ( y2 - y1 ) / s; x1 -= k * ( x1 - x2 ) / s; y1 -= k * ( y1 - y2 ) / s;
Seuraavat eivät:
x1 += k * ( x1 - x2 ) / s; y1 += k * ( y1 - y2 ) / s; x1 -= k * ( x2 - x1 ) / s; y1 -= k * ( y2 - y1 ) / s;
Aihe on jo aika vanha, joten et voi enää vastata siihen.