Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: RPG liikkuminen(java)

jonez [08.04.2006 23:23:05]

#

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.

Sami [10.04.2006 02:08:20]

#

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.

Lebe80 [10.04.2006 10:52:28]

#

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?

jonez [10.04.2006 16:35:35]

#

Joo sain toimimaan miten halusin, muokkailen vähän niin, että se ajetaan vain kun on tarve. Kiitos avusta :)

Vastaus

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

Tietoa sivustosta