Bewegungen von Spielfigur

Status
Nicht offen für weitere Antworten.

GerryGabanas

Mitglied
Hallo Leute,

also ich programmiere momentan ein Online Game und habe dabei folgendes bisher gemacht:

1) den A* Algorithmus für "intelligente" Bewegungen
2) entsprechende Klassen Player, Monster...

Mein aktuelles Problem besteht in folgendem Punkt:
nachdem ein Doppelklick in der client.java festgestellt wurde, soll der Spieler gelöscht und mittels des A* Algorithmus zum neuen Punkt bewegt werden. Momentan wird der Spieler nur an die neue Stelle gezeichnet, d.h. nachher ist theoretisch die ganze Spielfläche voll, obwohl ich map.getCell(i,j).removePlayer(player); aufrufe, wonach in der map der Spieler gelöscht werden sollte.

Code:
	public void mouseClicked(MouseEvent event) 
	{	
		for (int i = 0; i < client.map.getSizeX(); i++) 		//	das Spielfeld wird um 45 Grad gedreht
				
			{												//	d.h. die einzelnen Kacheln werden etwas ueberlappend und versetzt gezeichnet   		
				for (int j = 0; j < client.map.getSizeY(); j++) 
				{
					if (event.getClickCount()==2)
					{

						Polygon p2 = client.polyMap.getPolygon(i, j);
						if (p2.contains(event.getX(), event.getY())) {
					
						System.out.println( "x = " + i + "y = " +j);
						Player player = (Player) map.Players.get(0);
						
						map.getCell(i,j).removePlayer(player);
						player.setX(i);
						player.setY(j);
						map.getCell(i,j).setPlayer(player);
						mainMap_repaint();
						
						}
					}
				}
			}
		}


Ferner will ich nachher den A* darauf anwenden, anliegend die aufrufende Methode davon, wo immer als Fehler das getX() bzw. getY() bei p.setX und p.setY angezeigt wird.

Code:
public class Movements {
	
	public void moveAstar(Monster m, Player ziel){
		AStarPathFinder astar = new AStarPathFinder(map, m.getX(), m.getY(), ziel.getX(), ziel.getY());
		astar.Calc();
		m.setPathFinder(astar);	//Lösungswege berechnen und den Path übergeben!
		if (astar.getPath() != null)
			{		// solange Vector mit Wegsteucken gefuellt ist
				map.getCell(m.getX(), m.getY()).removeMonster(m);	//Position aendern
				m.setX(astar.getPath().firstElement().getX());		//ACHTUNG: hier zeigt es mir einen Fehler an
				m.setY(astar.getPath().firstElement().getY());		// obwohl es vorher ging!!!!
				map.getCell(m.getX(),m.getY()).setMonster(m);
				astar.getPath().removeElement(astar.getPath().firstElement());  // entferne 1. Element
			}
	}
	
	public void movePlayer(Player p, int zielX, int zielY){
		AStarPathFinder astar = new AStarPathFinder(map, p.getX(), p.getY(), zielX, zielY);
		//Lösungswege berechnen und den Path übergeben!
		if (astar.getPath() != null)
			{			// solange Vector mit Wegsteucken gefuellt ist
				map.getCell(p.getX(), p.getY()).removePlayer(p);	//Position aendern
				p.setX(astar.getPath().firstElement().getX());		//ACHTUNG: gleiches PROBLEM wie beim 	
				p.setY(astar.getPath().firstElement().getY());		// moveAstar()!!!!!!
				map.getCell(p.getX(),p.getY()).setPlayer(p);
				astar.getPath().removeElement(astar.getPath().firstElement());  // entferne 1. Element
			}
	}

Wie gesagt, für Vorschläge bin ich immer dankbar, die Datenstrukturen wachsen weiter und wollen kein Ende nehmen und solche Probleme halten da immer nur auf.
 

GerryGabanas

Mitglied
Hat denn niemand einen Ansatz was ich falsch mache?
Wäre ja schon mal hilfreich wenn ich wüsste, weshalb die Spielfigur nicht gelöscht wird, obwohl ich die Methode remove vorher benutze!

Danke für Antworten
 

Evil-Devil

Top Contributor
Anderer Vorschlag, wieso löscht du überhaupt deine SPielfigur? Es macht viel mehr Sinn einfach ihre Position zu aktualisieren und sie an entsprechender Stelle neu zu zeichnen.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben