# NPC zufällig laufen lassen, aber wie?



## Polli85 (14. Dez 2007)

Hi an alle,

hab mein RPG-Projekt ein bischen ausgebaut, durch die Hilfe des 
Tutorials von Quaxli ---> Tutorial
habe ich nun kein Problem mehr mit dem Player Sprite.
Aber ich weiß nicht wie ich es hinbekommen soll mit der Sprite Klasse
einen RPG NPC zu machen, der zufällig auf der Map rumläuft. 
Außerdem wie ich das in die GamePanel klasse einbauen kann 
das es irgendwie flüssig aussieht und nicht so abgehackt  ?!?

Meine Sprite Klasse sieht der von Quaxlis Beispiel sehr ähnlich,
blos auf die Bedürfnisse eines RPG-Sprites angepasst


```
public abstract class Sprite extends Rectangle2D.Double implements Movable, Drawable{
	
	public final int spriteNr = 256; 
	long delay;
	long animation = 0;
	GamePanel parent;
	BufferedImage[] pics;
	private final int sWidth = 32;
	private final int sHeight= 32;
	public int currentPic = 0;
	public int playerMap = 0;
	protected double dx;
	protected double dy;
	public boolean mapChangeUp = false;
	public boolean mapChangeDown = false;
	public boolean mapChangeLeft = false;
	public boolean mapChangeRight = false;
	public boolean walking = false;
	
	
	public int dir = 0;
	


	public Sprite(BufferedImage[] img, double x, double y, long delay, GamePanel pan){
		
		pics = img;
		this.x = x;
		this.y = y;
		this.width = sWidth;
		this.height = sHeight;
		this.delay = delay;
		parent = pan;
		
	}
	
	
	public void doLogic(long delta) {
		
		animation += (delta/1000000);
		if(animation > delay){
			animation = 0;
			doAnimation();
		}
		
	}

	private void doAnimation() {
		if(walking){
			currentPic++;
			//UP
			if(dir == 0){
				if(currentPic >=3){
					currentPic = 0;
				}
			}
//			DOWN
			else if(dir == 1){
				if(currentPic >=6){
					currentPic = 3;
				}
			}
//			LEFT
			else if(dir == 2){
				if(currentPic >=9){
					currentPic = 6;
				}
			}
//			RIGHT
			else if(dir == 3){
				if(currentPic >=12){
					currentPic = 9;
				}
			}
			
			
//			else if(currentPic >= pics.length){
//				currentPic= 0;
//			}
			
		}
	}
	
	public boolean checkCollsion(Rectangle2D.Double block) {
		   
	    if(block.intersects(this)){
	      return true;
	    }
	   
	    return false;
	  }
	
	public void move(long delta) {
		
		if(dx != 0){
			x += dx * (delta/1e9);
		}
		if(dy != 0){
			y += dy * (delta/1e9);
		}
			
	}
	
	public	void isMapchange(){
		if(x > 612){
			mapChangeUp = false;
			mapChangeDown = false;
			mapChangeLeft = false;
			mapChangeRight = true;
		}else if( x < -4){
			mapChangeUp = false;
			mapChangeDown = false;
			mapChangeLeft = true;
			mapChangeRight = false;	
		}else if(y > 420){
			mapChangeUp = false;
			mapChangeDown = true;
			mapChangeLeft = false;
			mapChangeRight = false;
		}else if(y < -36){
			mapChangeUp = true;
			mapChangeDown = false;
			mapChangeLeft = false;
			mapChangeRight = false;
		}else{
			mapChangeUp = false;
			mapChangeDown = false;
			mapChangeLeft = false;
			mapChangeRight = false;
		}
		
	}
	
	public void drawObjects(Graphics g) {
		g.drawImage(pics[currentPic],(int)x,(int)y,null);
		
	}
	
	public double getDx() {
		return dx;
	}


	public void setDx(double dx) {
		this.dx = dx;
	}


	public double getDy() {
		return dy;
	}


	public void setDy(double dy) {
		this.dy = dy;
	}


	public synchronized int getCurrentPic() {
		return currentPic;
	}


	public synchronized void setCurrentPic(int currentPic) {
		this.currentPic = currentPic;
	}
	
}
```

Hoffe jemand kann helfen 

Gruß Polli


----------



## Evil-Devil (14. Dez 2007)

Ich würd für die NPCs Wegpunkte vorgeben in denen oder auf denen sie sich bewegen dürfen und den Rest dann per Zufall bestimmen.


----------



## manuche (20. Dez 2007)

Jo würde ich auch machen... mit Math.random() generierst du dir z.b. eine zahl für entfernung und eine richtung und überprüfst dann ob sie bestimmte punkte überschreiten... wenn ja halt ne abbruch bedingung!


----------

