public boolean walk(Dir dir) {
		if (isWalking)
			return false;
		face(dir);
		setTextureRegion(sprites.getSprite(getFacing()));
		boolean c = false;
		switch (dir) {
		case North:
			c = map.collide(trueX(), trueY() + 1, getLayer());
			break;
		case South:
			c = map.collide(trueX(), trueY() - 1, getLayer());
			break;
		case East:
			c = map.collide(trueX() + 1, trueY(), getLayer());
			break;
		case West:
			c = map.collide(trueX() - 1, trueY(), getLayer());
			break;
		default:
			break;
		}
		if (c) {
			return false;
		}
		isWalking = true;
		setTextureRegion(sprites.getSprite(Dir.toWalk(getFacing())));
		if (following != null) {
			if (lastMove == null) {
				following.face(dir);
				following.isWalking = true;
				following.setTextureRegion(following.sprites.getSprite(Dir.toWalk(dir)));
			} else {
				following.face(lastMove);
				following.isWalking = true;
				following.setTextureRegion(following.sprites.getSprite(Dir.toWalk(lastMove)));
			}
				
			lastMove = dir;
		}
		synchronized (this) {
			try {
				this.wait();
			} catch (InterruptedException e) {}
		}
		return true;
	}