Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Карта игры (http://www.flasher.ru/forum/showthread.php?t=183974)

XimiKDeniS 07.09.2012 00:26

Карта игры
 
Добрый день. Много времени думаю над вопросом как сделать карту для игры (2d, вид сверху), чтобы было наиболее практично и наименее затратно. Проверка столкновения с объектами должна происходить именно по ней. Изначально делал вовсе без карты, потом заметил, что при большом колличестве объектов проверять в цикле все условия затрудеительно. Пробовал сделать карту из матрицы, но тут тоже проблема, думаю до больших размеров ее не получится увеличить (много будет есть двухмерный массив 1000x1000) Надеюсь кто-нибудь сможет предложить лучшие способы. Заранее спасибо.

artcraft 07.09.2012 01:07

Цитата:

при большом колличестве объектов проверять в цикле все условия затрудеительно
вот тут ваша проблема - не нужно проверять все условия для всех объектов в одном цикле - фильтруйте, отбрасывайте заведомо лишние проверки, по типу, по расстоянию, удаляйте то что не попадает в поле зрения.

если вас волнует проверка столкновений - попробуйте посмотреть исходники фрэймворков которые это умею делать, например flixel или box2d

очень слабо понятно что у вас за игра, поэтому невозможно дать вразумительный совет, но я попробую ткнуть пальцем в небо:

что если вместо массива использовать BitmapData и цветом кодировать разные состояния пикселй-клеток?

caseyryan 07.09.2012 07:53

Цитата:

Пробовал сделать карту из матрицы, но тут тоже проблема, думаю до больших размеров ее не получится увеличить
Получится. Можно сделать двумерный массив, в который вставлять целые числа, например 0 - не может ходить, 1 - может.
Как бы поделить игровое поле на квадратики, скажем 20х20, и для каждой клетки в редакторе карт задать значение (это можно сделать создав, например, инструмент рисования препятствий и т.п.).
В итоге должен получиться массив на подобие такого:

Код AS3:

[
[1,1,0,1,1,1,1,1,1,1,0],
[1,1,1,1,1,1,1,1,1,1,0],
[1,1,1,1,1,1,1,1,1,1,0],
[1,1,1,1,1,0,0,1,1,1,0]
]

с количеством вложенных массивов (рядов карты) равным высоте карты / 20, и размерностью каждого вложенного массива равной ширине карты / 20.
Далее при перемещении персонажа брать его положение по x делить на 20 и округлять до меньшего целого, таким образом получая индекс в каком-либо из вложенных массивов, а разделив положение по y на 20 и округлив, так же, до меньшего целого, индекс вложенного массива представляющего ряды.

т.е. потом просто создать функцию, которая будет на основе этих координат возвращать необходимое значение из нужного вложенного массива, 0 или 1. Вернет один - персонаж идет в это положение, 0 - останавливается.
Подобные сетки проходимости довольно часто применяются.
Надеюсь идея понятна

Цитата:

попробуйте посмотреть исходники фрэймворков которые это умею делать, например flixel или box2d
Не самая лучшая идея.
Сложновато это для новичка. А учитывая что бокс2д это еще и порт с С++, в котором не соблюдаются никакие конвенции АС3, задача еще неоднократно усложняется.
Да для такой игры, в общем-то, даже SAT использовать нет необходимости, не говоря уже про физику.

Цитата:

фильтруйте, отбрасывайте заведомо лишние проверки, по типу, по расстоянию
В бокс2д, кстати, перед полноценным просчетом столкновения, используется проверка расстояния, чтобы выявить вообще возможность столкновения. Так что по этому поводу бокс2д упомянут не зря. Но смысла ковырять его исходники нет, о проверке расстояний в нете и так информации полно

XimiKDeniS 07.09.2012 17:00

Возможно я неправильно начал. Сама игра клиент-серверная аркада(персонаж, монстры и т д проходится вместе), и сама карта должна быть соответсвенно на сервере. Матрица не подходит почему, потому что если есть объект, значит он должен быть в этой матрице подкаким-нибудь id например, чтобы узнать, что это за объект. А сама карта должна быть, как я уже говорил по 1000x1000 пикселей (хотя хотеось бы и больше). Сам раньше делал тот вариант, что предложили, правда с делением на 5, но опять же размер получается большой и меня это настараживает.

botbot 07.09.2012 18:11

Карта делится на области, напимер 100 на 100 пикселей. Каждый объект входит в 1 зону и проверяется на столкновение с объектами из соседних зон и своей собстенной. Т.е. всего проверяется 9 зон. Размер зоны определяется как максимально возможная длина объекта.
Если есть ещё и статика (просто карта проходимости, не объекты) - можно её отдельно положить и проверять каждый объект с ней. Формат карты проходимости при этом зависит уже от того, что за игра.

XimiKDeniS 07.09.2012 22:07

Неплохой вариант, спасибо. Если не будет еще что-нибудь более интересного буду использовать это))


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

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