A* поиск пути в Slick2D: как заставить врага двигаться?
Я пытаюсь создать 2D Tower Defense. Я создаю его на Java и использую библиотеку Slick2D. Я использую A* Pathfinder для врагов. Pathfinder работает отлично и может правильно печатать в консоли. Но у меня возникли проблемы с реализацией путевых указателей x и y по координатам врагов x и y. Я хочу, чтобы вражеские изображения двигались в соответствии с x и y, которые находит следопыт. Для следопыта; он использует 2D-массив 10х10.
AStarPathFinder pathfinder = new AStarPathFinder(map, MAX_PATH_LENGTH, false);
Path path = pathfinder.findPath(null, (int)startPosX, (int)startPosY, endPosX, endPosY);
int length = path.getLength();
public enemy() throws SlickException {
}
@Override
public void init(GameContainer gc, StateBasedGame sbg) throws SlickException {
map = new LoadMap();
System.out.println(length);
}
@Override
public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException, InterruptedException {
if (curr_x != endPosX && curr_y != endPosY) {
for (i = 0; i < length; i++) {
Thread.sleep(1000);
curr_x = path.getX(i);
curr_y = path.getY(i);
System.out.println("Move From: " + (int) prev_x + "," + (int) prev_y + ".");
System.out.println("Move To: " + (int) curr_x + "," + (int) curr_y + ".");
if (curr_x - prev_x > 0) { //RIGHT
System.out.println("RIGHT");
startPosX = startPosX + delta*speed/300;
} else if (curr_x - prev_x < 0) { //LEFT
System.out.println("LEFT");
startPosX = startPosX - delta*speed/300;
} else if (curr_y - prev_y > 0) { //DOWN
System.out.println("DOWN");
startPosY = startPosY + delta*speed/300;
} else if (curr_y - prev_y < 0) { //UP
System.out.println("UP");
startPosY = startPosY - delta*speed/300;
}
prev_x = curr_x;
prev_y = curr_y;
System.out.println("------------------");
if (curr_x == endPosX && curr_y == endPosY) {
System.out.println("Done!");
}
}
}
}
@Override
public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException {
e1.draw(startPosX*w,startPosY*w,w,w);
g.drawString("posX "+startPosX,100,100);
g.drawString("posY "+startPosY,100,120);
}
Если кто-нибудь сможет подтолкнуть меня в правильном направлении, я буду так счастлив. Спасибо.
1 ответ
Давайте посмотрим на это, исходя из предположения, что ваш враг уже нашел его "Путь". Допустим, это List (ArrayList, если предпочтительнее), который содержит все координаты тайла (т.е. правильный "путь") или тайлы. Теперь для каждого "шага обновления" или галочки в игре вы хотите использовать A*, чтобы найти путь для врага и обновить его, основываясь на текущем положении сетки врага или тайле. У врага будет "целевой" тайл, который будет первым тайлом в массиве текущего рассчитанного пути. Вы бы просто взяли x и y этой плитки, а в функции обновления для врага вы бы обновили ее x и y по отношению к последней плитке.
Например, если мой враг находился в точке (0, 0) и хочет добраться до (5, 5), я бы использовал алгоритм A*, чтобы получить список тайлов для кратчайшего маршрута. При каждом обновлении я заставлял своего врага переходить к "цели" или следующему тайлу в этом списке путей из A*, пока мы не достигнем последнего тайла. Промыть и повторить.