Eli mulla on
public void run() { if(playerMove == 1 && moving == false){ moving = true; int count = 1; while (count < 40) { try { sleep(20); } catch (InterruptedException e) { } count++; if(direction == 1){//up y--; }else if(direction == 2){//down y++; }else if(direction == 3){//left x--; }else if(direction == 4){//right x++; } } if(direction == 1){//up playertile_y--; }else if(direction == 2){//down playertile_y++; }else if(direction == 3){//left playertile_x--; }else if(direction == 4){//right playertile_x++; } moving = false; run(); } try { sleep(100); } catch (InterruptedException e) { } run(); }
Eli aina kun painaa nuolinäppäintä se liikuttaa pelaajaa tiettyyn suuntaan 40 pikseliä(jotain javamittaa en oo varma onko pikseliä), mutta jos painaa eri suuntaan ennekuin se on ehtinyt liikkua sen 40 niin se menee pois paikoiltaan, eli siltä 5*5 40*40 tilepohjan päältä.
Miten ton sais niin, että sitä ei voi kesken liikuttaa? Yritin tolla moving booleanilla jo muttei se auttanut.
Oletettavasti vika ei ole varsinaisesti tuossa pätkässä, vaan näppäimistönkäsittelijässäsi. Veikkaisin nimittäin vahvasti, että asetat kulkusuunnan aina siellä näppäimistönkäsittelijässäsi, jolloin suunta siis saattaa muuttua kesken ukkelin liikuttelun. Jos haluat tuolla tekniikalla estää oudon käyttäytymisen, niin kokeile laittaa tuo if (moving == false) sinne näppäimistönkäsittelijään, äläkä tuohon missä varsinainen liikuttelu tapahtuu.
Toinen pikkuseikka mikä saattaa olla syytä korjata tuosta jo tässä vaiheessa, on tuo run()-kutsu jokaisen liikutuskerran jälkeen (muuten tämä saattaa aiheuttaa jossain vaiheessa pinon täyttymisen/ylivuodon ja kaataa ohjelman). Mahdollinen tapa korjata tuo on esimerkiksi while(true)-silmukka.
Musta tuntuu, ettei funktion kutsuminen itsensä sisältä taida ollakaan ihan pikku-juttu tässä tapauksessa.
Eli nyt kutsut run-funktiota _aina_ ja joka kerta, mikä varmaankin kuormittaa kokoajan enemmän (funktiota ei ajeta koskaan loppuun). Funktioiden ajaminen ei ole aivan sama asia kuin basicin goto-käsky. Eli jokainen funktio jää "päälle" niin pitkäksi aikaa, ennenkuin se on ajettu kokonaan läpi, älä siis aja sisäkkäin loputtomasti samaa funktiota.
Tee jokin main-looppi, jossa ajat tuota run-funktioita.
// ei näin function run(){ run(); } // tee mieluummin näin function main(){ run(); } function run(){ do_my_kinky_stuff(); }
edit:
vai puuttuukos koodiesimerkistäsi viimeinen kaarisulku?
Joo sain toimimaan miten halusin, muokkailen vähän niin, että se ajetaan vain kun on tarve. Kiitos avusta :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.