Неограниченные размеры карты для игры в AS3 - PullRequest
1 голос
/ 21 апреля 2011

Недавно я планировал, как запустить игру со средой / картой, которая может иметь неограниченные размеры (неограниченное количество - это бесполезные условия, поскольку очевидно, что объем данных может храниться в памяти и т. Д.).Я достиг этого, используя «сетку», которая содержит данные уровня, хранящиеся в виде строки, которые можно преобразовать в 2D-массив, который будет представлять объекты и их свойства.

Вот пример двух объектов, хранящихся в виде строки:

"game.doodads.Tree#200#10#terrain$game.mobiles.Player#400#400#mobiles"

"Сетка" - это трехмерный массив, содержимое которого будет представлять координату x / y ячейки сетки.Ячейки сетки будут, скажем, 600x600.

Пример этого массива "grid" будет следующим:

var grid:Array = [[["leveldata: 0,0"],["leveldata 0,1"]],
                  [["leveldata: 1,0"],["leveldata 1,1"]]];

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

function loadCells(xp:int, yp:int):void

. Она также будет обрабатывать выгрузку ранее загруженных ячеек, которые больше не находятся достаточно близко, чтобы требовать.В процессе выгрузки данные в сетке [x] [y] будут перезаписаны новыми данными, которые создаются путем циклического перемещения по объектам в этой ячейке и добавления каждого нового набора данных к данным ячейки сетки.

Все работает нормально, когда вы двигаетесь в направлении, ячейки выгружаются / сохраняются и загружаются новые ячейки.Проблема в следующем:

Скажем, это большой город, кишащий зомби.Если вы пройдете три квадрата сетки в любом направлении и вернетесь, все будет так, как вы его оставили.Я изо всех сил пытаюсь найти способ, по крайней мере, симулировать все объекты, которые все еще движутся и делают свое дело.Это выглядит глупо, когда вы, например, бросаете гранату, уходите, возвращаетесь, и граната все еще не взорвалась.

Я рассмотрел сохранение метки времени для каждого объекта, когда выгрузил уровень и когда он инициализированесть цикл, который запускает свою «пошаговую» функцию несколько раз.Проблема здесь, очевидно, в том, что когда вы вернетесь через 5 минут, 20 зомби попытаются сделать шаг 248932489 раз, и игра вылетит.

Идеи?

Ответы [ 3 ]

2 голосов
/ 21 апреля 2011

Я не знаю AS3, но позвольте мне дать вам несколько советов.

Кажется, вы хотите создать цельный мир, поскольку вы загружаете / выгружаете cells по мере движения игрока. Это хорошая идея. Здесь вы должны решить, какие данные ячейка должна загружать / выгружать (или, что еще важнее, какие данные ячейка должна хранить или обрабатывать) .

Например, граната не должна быть выгружена из клетки, так как она должна быть обновлена ​​даже после того, как игрок покидает ячейку. Ячейке НЕ рекомендуется управлять всеми игровыми объектами только потому, что они находятся в этой ячейке. Вместо этого объект игрока может обрабатывать гранату как владелец . Или может существовать один EntityManager , который обрабатывает все игровые объекты, такие как гранаты или зомби.

С этой идеей вы можете обновлять свои 20 зомби, даже когда они находятся в незагруженной зоне (их местоположение больше не имеет значения), вместо того, чтобы вызывать update () 248932489 tiems сразу. Тем не менее, вам действительно нужно постоянно обновлять зомби? Возможно, выгрузка всех из них и порождение новых зомби с количеством последних активных зомби в клетке сработает. Это зависит от вашего игрового дизайна, но, как правило, вам не нужно обновлять объекты, которые не видны или находятся достаточно далеко от игрока. Надеюсь, поможет. Удачи! : D

1 голос
/ 01 сентября 2011

Я вижу два метода, как вы могли бы решить эту проблему.

во-первых: у вас есть механизм, поддерживающий загрузку всех активных ячеек, активный означает, что есть события, инициируемые объектами, включающие объекты, принадлежащие ячейке, ИЛИ player-принадлежащие объекты (если вы сделали такое различие, что есть).Каждый раз, когда такая ячейка исключается из обычного поведения при разгрузке, ей присваивается номер, и если в результате нехватки памяти будут выгружены ячейки с наименьшим номером.Понятно, что это может быть самый сложный метод с точки зрения кода, но, тем не менее, он может быть единственным, действительно выполняющим то, что вы хотите.

секунда: используйте очень маленькие ячейки и дайте двигателю сохранять загруженный узкий путь.В этом случае ячейки мигрируют в 100x100 вместо 600x600, и 36 из них выполняют работу, которую будет выполнять одна большая ячейка (риск: больше загромождать код), после чего каждая клетка, которую ваш игрок фактически пересекает (не все, которые были загружены для создания естественной видимости -range) хранится в памяти, включая каждую ячейку, в которой хранятся принадлежащие игроку объекты в течение ограниченного периода времени (т. е. 5 минут).

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

1 голос
/ 21 апреля 2011

Интересная проблема.Конечно, игра не может точно симулировать неограниченную среду.Если вы покинули какую-то зону на несколько минут, вам не нужно точно моделировать каждый шаг зомби (или каких-либо действующих лиц).Каждая игра имеет свои упрощения.Возможно приблизительное моделирование поможет вам.Например, если выживший долгое время находился в сильно зараженной зоне, ваш симулятор мог бы решить, что он превратился в зомби, не вычисляя каждый шаг процесса.Или, если в какой-то части города свирепствовала орда, эта часть должна быть случайно повреждена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...