# Bewegungen von Spielfigur



## GerryGabanas (18. Jun 2007)

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.


```
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.


```
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 (19. Jun 2007)

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 (19. Jun 2007)

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.


----------

