Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 19.04.2015, 16:02
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 1  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
По умолчанию Поиск пути без Нод

Ищу алгоритм для поиска пути в обход физических тел Nape (хотя в принципе не важно, можно просто любых прямоугольных тел), без использования нод как в А*. Кто-нибудь встречал готовые решения? Ну или просто знает в какую сторону копать. Производительность в этом случае очень важна, так как игра мобильная
Миниатюры
Нажмите на изображение для увеличения
Название: path_finding.jpg
Просмотров: 55
Размер:	119.1 Кб
ID:	31524  

Старый 19.04.2015, 21:06
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 2  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Сделал. Решение придумал такое:
При первом запуске, после расстановки всех тел нейпа, происходит пробежка по всей карте через установленные промежутки (60 пикселей оказалось вполне достаточно), и в каждой из этих точек делается проверка
Код AS3:
private function calculateWalkableSurface():Array {
 
	var tilesX:	int 	= stage.stageWidth / _tileSize;
	var tilesY:	int 	= stage.stageHeight / _tileSize;
	var tiles:	Array 	= [];
 
	for (var i:int = 0; i < tilesY; i++) {
		var posY:int = (i * _tileSize) + _tileSize * .5;
		tiles[i] = [];
		for (var j:int = 0; j < tilesX; j++) {
			var posX:int = (j * _tileSize) + _tileSize * .5;
			var tileValue:int = getTileValue(posX, posY);
			tiles[i][j] = tileValue;
		}
	}
	return tiles;
}
 
/// возвращает 1 если плитка непроходима, и 0 если препятствия нет
private function getTileValue(x:int, y:int):int {
	var bodies:BodyList = _space.bodiesUnderPoint(new Vec2(x, y));
	var value:int = 0;
	if (bodies.length) {
		// динамические и кинематические тела не считаются препятствием
		if (bodies.at(0).type == BodyType.STATIC) {
			value = 1;
		}
	}
	return value;
}
В итоге формируется двумерный массив с числами 0 или 1, который и скармливается алгоритму A* Star. Сам алгоритм взял вот этот
Путь конечно не идеальный, можно и более плавным сделать, какими-нибудь кривыми безье или просто рулёжкой. Но для моей цели вполне подойдет и такой.

Щелкаем в любом месте мышью, чтобы переставить игрока (треугольник). Или щелчок + пробел, чтобы переставить врага (круг)
DifferentTests.swf   (328.5 Кб)
Вложения
Тип файла: swf DifferentTests.swf (328.5 Кб, 59 просмотров)

Старый 19.04.2015, 21:38
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 3  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Цитата:
без использования нод как в А*
Цитата:
и скармливается алгоритму A* Star
Хитро) Главное, что всё получилось в итоге.

Старый 19.04.2015, 22:14
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 4  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Как я понял, других вариантов не много. Рейкаст, который более ресурсоемкий, либо деление карты на секторы, как в анрил https://udn.epicgames.com/Three/Navi...Reference.html
Остановился на самом простом

Создать новую тему Ответ Часовой пояс GMT +4, время: 04:13.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 04:13.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.