[ Aleksandar Ilić @ 12.06.2009. 23:45 ] @
Pišem sličnu igricu kao HelicopterGame u Javi i muči me horizontalno pomeranje objekta (helikoptera). Objekat treba da ide naviše kada se drži taster miša, a da pada kad se pusti, baš kao u datom primeru. Prvo sam krenuo najjednostavnije što sam mogao tako što se yKoordinata povećava ili samanjuje zavisno da li je mousePressed ili mouseReleased. Međutim ovakav način nije dobar, jer se javlja naglo padanje i penjanje objekta.

I onda sam se setio da preko sinusa ili cosinusa nalazim yKoordinatu, jer ove funkcije po prirodi nemaju nagle padove i uspone. I sad ne znam kako ovo da realizujem. Kada napišem metod da yKoordinata ne zavisi od miša, vertikalno kretanje objekta izgleda baš kako treba. Ali kada ubacim MouseListener stvar se zakomplikuje i treba mi pomoć.


Svaki savet je dobrodošao. Hvala.
[ jablan @ 13.06.2009. 07:04 ] @
Sila se uči negde u višim razredima osnovne škole...

http://en.wikipedia.org/wiki/Force
http://en.wikipedia.org/wiki/Acceleration

http://www.jdonohue.com/java/JDLunarLander/JDLunarLander.html

[Ovu poruku je menjao jablan dana 13.06.2009. u 08:46 GMT+1]
[ Aleksandar Ilić @ 13.06.2009. 21:24 ] @
Hvala na linkovima, međutim ne znam kako ovo da implementiram.
Imam klasu Fish koja trenutno ima polja boolean mousePressed i int yPos. Kada se klikne miš, mousePressed postane true, a kad se pusti - false. I imam metodu move() koja će se pozivati iz threada i ona bi trebala da updejtuje yPoziciju. Iscrtavanje se vrši u drugom metodu.

Ova move() metoda mi je problem. Jel može neko usmerenje?


Hvala.
[ jablan @ 13.06.2009. 21:36 ] @
Može. Kad ne držiš taster, na objekat deluje njegova težina nadole pod uticajem gravitacije, a kad ga držiš, pored te sile uključuje se i sila motora nagore, koja mora da bude veća od težine objekta, da bi objekat mogao da se diže. Ako zanemariš masu objekta (pretpostaviš da se ne menja tokom vremena), računaš samo sa ubrzanjima (ubrzanjem nadole g dok ne držiš taster i ubrazanjem nagore a dok ga držiš). Formula za ubrzanje je a = v/t = s/(t^2), pa računaš, u svakom trenutku, znajući koje su bile vrednosti u prethodnom trenutku.
[ DjoleReject @ 14.06.2009. 00:24 ] @
Citat:
Aleksandar Ilić
Ova move() metoda mi je problem. Jel može neko usmerenje?


Ako ti je prekomplikovano ovo sa silom, a ti lepo povecavaj Y kad je mis stisnut, ali ne za ceo broj, nego napravi neki float i kad je mis stisnut povecavaj ga za 0.1 (ili 0.01, 0.001... ako je ovo i dalje prebrzo), pa tako dobijen float dodaj na vec postojeci Y.
[ Aleksandar Ilić @ 14.06.2009. 00:48 ] @
Rešio sam problem na sledeći način.
Code:
public void move() {
        if (mousePressed) {     
            ubrzanje += 0.025;
        }
        else {
            ubrzanje -= 0.025;
        }
        
        if ((int)ubrzanje > (int)gravitacionoUbrzanje) {
            yPos--;
        }
        else if ((int)ubrzanje < (int)gravitacionoUbrzanje) {
            yPos++;
        }
    }
gravitacionoUbrzanje je double konstanta na 9.5. Promenljiva ubrzanje je takođe dobule koja se povećava i smanjuje za 0.025. Na mousePressed i mouseReleased ubrzanje dobije vrednost gravitacionogUbrzanja. U drugom if-u kastovao sam obe vrednosti u int i tako se odseku decimale. GravitacionoUbrzanje postane 9, a ubrzanje krene od 9,5 da se povećuje ili smanjuje, i sve dok ne postane 10 ili padne ispod 9, yKoordinata se ne menja i na taj način objekat nešto malo ostane u istoj poziciji prilikom promene smera kretanja.

Koliko je ovo pametno ne znam. Ako neko ima komentar, rado bih ga čuo.
[ jablan @ 14.06.2009. 06:47 ] @
Na dobrom putu si ali još nije to to. Ono što moraš da pamtiš u novom atributu nije ubrzanje, već (vertikalna) brzina, i ona se menja ovako kao što se tebi menja ubrzanje dole, ako je pritisnut taster u sledećoj iteraciji poveća se za neki broj X, a ako se ne drži, smanji za Y. Negativna brzina znači da pada, pozitivna da se diže. U svakoj iteraciji prvo proračunaš brzinu na taj način, pa onda na osnovu nje i vertikalnu poziciju (npr. uzmeš da je vremenska jedinica 1, i onda jednostavno dodaš vertikalnu brzinu na trenutnu poziciju).

Naravno, sve bi bilo lakše kad bi zaista pročitao Viki članke o sili, ubrzanju i brzini ili barem uzeo svoj srednjoškolski udžbenik iz fizike i obnovio gradivo.
[ Mihajlo Cvetanović @ 14.06.2009. 09:35 ] @
U akcionim igrama sprajtovi ne treba da imaju pravu inerciju, niti zakoni fizike treba da se primenjuju. Može malo ubrzanja zbog efekta, ali zamisli Space Invaders u kom bi ti trebala sekunda da skreneš brod pod punom brzinom.
[ jablan @ 14.06.2009. 11:31 ] @
Kako u kojim igrama. Neke igre se, naprotiv, baziraju na inerciji. Na primer, čuvene "[url=http://en.wikipedia.org/wiki/Lunar_Lander_(arcade_game)]lunar lander[/url]", "marble madness" i "oxyd".

Hehe, evo jedne online:

http://www.1001webgames.com/game/marblet/index.php

[Ovu poruku je menjao jablan dana 14.06.2009. u 18:07 GMT+1]