/ / Problém s vynášaním objektov pri dotyku na obrazovku [LibGDX] - Java, Android, libgdx

Problém s vytváraním predmetov pri dotyku na obrazovku [LibGDX] - java, android, libgdx

V mojej hre prší meteorit zrôzne veľkosti. Snažil som sa to urobiť tak, že keď sa dotknete väčšieho meteoritu, bude odstránený (z poľa) a menší meteoritický objekt ho zaujme na rovnakom mieste, kde bol odstránený väčší.

Problém mám v tom, že ak sa dotknete väčšiehometeorit, bude odstránený a prejde všetkými ostatnými typmi meteoritov, kým sa dostane k najmenšiemu a úplne nezmizne ... všetko v rovnakom dotyku. Očividne to nechcem. Nie som si istý, ako vyriešiť tento problém.

Tu je kód, ktorý spracováva vstup:

private void handleInput() {
Iterator<FallingItem> iter = items.meteorites.iterator();
while (iter.hasNext()) {

FallingItem item = iter.next();

if (Gdx.input.justTouched()) {

gameCam.unproject(touchPoint.set(Gdx.input.getX(), Gdx.input.getY(), 0));

if (item.getClass() == SmallMeteorite.class && item.getBounds().contains(touchPoint.x, touchPoint.y)) {

meteoriteDestroyed.play(0.5f); //play sound
iter.remove(); //removes item from array when it"s no longer needed
item.dispose(); //dispose meteorite texture to clear up memory
score += 20; //add to score

} else if (item.getClass() == MediumMeteorite.class && item.getBounds().contains(touchPoint.x, touchPoint.y)) {

meteoriteDestroyed.play(0.5f);
iter.remove();
item.dispose();
score += 10;

items.meteorites.add(new SmallMeteorite(item.getBounds().getX(), item.getBounds().getY()));

} else if (item.getClass() == LargeMeteorite.class && item.getBounds().contains(touchPoint.x, touchPoint.y)) {

meteoriteDestroyed.play(0.5f);
iter.remove();
item.dispose();
score += 10;

items.meteorites.add(new MediumMeteorite(item.getBounds().getX(), item.getBounds().getY()));

}
}
}
}

odpovede:

0 pre odpoveď č. 1

Pridávate položky do poľa, aby sa stále iterovali. Namiesto toho ich musíte nejako označiť, aby sa dali po iterácii zmeniť. Existuje niekoľko spôsobov, ako to urobiť.

Jedným zo spôsobov by bolo viesť samostatný zoznam.Pred vykonaním tejto slučky to vyčistite a potom do samostatného zoznamu pridajte položky, ktoré je potrebné nahradiť menšími. Keď je slučka vykonaná v hlavnom zozname, môžete iterovať samostatný zoznam a pridať menšie verzie do hlavného zoznamu.

LibGDX má ale ešte ľahší spôsob.Namiesto ukladania meteoritov pomocou Zoznamu použite triedu SnapshotArray od LibGDX. Umožní vám iterovať kópiu zoznamu, takže zmeny v poli nebudú platiť, kým nedokončíte iteráciu:

FallingItem[] array = snapshotArray.begin();
for (int i=0; i<snapshotArray.size; i++){ //important to use snapshotArray.size, not array.length
FallingItem item = array[i];
//...
//if (something) {snapshotArray.removeIndex(i, true); snapshotArray.add(new Something());}
}
array.end();

Ale skôr ako to vôbec vyskúšate, zamyslite sa, čivlastne potrebujete samostatné triedy pre SmallMeteorite, MediumMeteorite atď. Určite existujú také veci ako nadmerné zapuzdrenie. Ak sa všetky tieto objekty správajú rovnako, ale majú jednoducho odlišné parametre, malo by ísť pravdepodobne o jednu triedu, ktorej parametre sú upravené tak, aby predstavovali rôzne veľkosti. Potom by ste namiesto ich odstránenia a nahradenia v poli stačili zmeniť iba ich parametre.

Dodatočná poznámka: je zbytočné kontrolovať justTouched a urobte unproject vo vnútri slučky namiesto mimo nej. Veľa nadbytočných opakovaní.