PDA

Просмотр полной версии : делаю стратегию - пара вопросов


Takato
04.08.2005, 15:16
Начал сегодня делать стратегию на флэше (тип - риал-тайм, ну вроде РедАлерта или СтарКрафта). Потихоньку продвигаюсь - но и проблемы, которые с ходу мне не решить, уже появились

Основной принцип такой - при нажатии на кнопку (например) появляется "юнит" (например soldat) из определенной точки (дверь казармы). Ну то есть обычный

duplicateMovieClip ("soldat", ima1, deep)
setProperty (ima, _x, ...);
...

и т д. ima с каждым юнитом увеличивается на единицу, глубина тоже - ну вобщем, все как обычно. А в самом клипе (soldat) уже написан собственно код, определяющий поведение юнита - если попадает в границы рамочки - значит он "обводится" (становится активным), если обведен и нажата кнопка мыши в каом-то месте на поле - значит он отправляется туда - и т. д. и т. п. Всё это уже работает - а теперь собственно проблемы


1) Так как глубина клипов задается при их копировании - солдаты перекрывают друг друга и здания как вздумается - то есть задний юнит вполне может загораживать переднего и т. д. Как можно сделать динамическое обновление "глубины" - то есть, если клип спускается "вниз" ("приближается") - то выходит на передний план - и наоборот?

2) В принципе, даже более важное - так как решив этот вопрос можно будет будет пойти на хитрости и забить на 1-ый -
как сделать "препятствия" - то есть, чтобы юниты не могли проходить друг-сквозь-друга и сквозь здания? Если бы это были статические препятствия небольшого кол-ва - например скалы - запрогить их было бы не сложно - но тут ведь может быть любое кол-во юнитов, которые постоянно движутся и должны соответственно влиять друг на друга

Король
04.08.2005, 15:24
надо делать карту-сетку и в ней прописывать - где свободная клетка, где пустая. на основе карты генерить граф путей и по нему волновым алгоритмом искать дорогу для юнита.

iNils
04.08.2005, 15:36
По первому вопросу.
Игра в изометрии? Тогда делай глубину по координатам, а не последовательности появления на карте.
глубина = _y * максимальное значение поля по x + _x

Takato
04.08.2005, 15:46
надо делать карту-сетку и в ней прописывать - где свободная клетка, где пустая. на основе карты генерить граф путей и по нему волновым алгоритмом искать дорогу для юнита.

Можно поподробнее? Хотя бы про сетку (юнитов пока и "тупыми" можно сделать). Это что-то вроде двухмерного массива например?

По первому вопросу.
Игра в изометрии? Тогда делай глубину по координатам, а не последовательности появления на карте.
глубина = _y * максимальное значение поля по x + _x

Да, "упрощенная" изометрия (то есть без разворота на 45 градусов). Тут причем такая проблема возникает, что если юниты стоят на одной "высоте" - то есть, на одном удалении от камеры - один из них изчезнет - т к глубина получится одинаковой

iNils
04.08.2005, 15:53
но координаты то у них разные?

Takato
04.08.2005, 16:04
но координаты то у них разные?

У меня всё-таки не полноценная изометрия - то есть, фактически, от х глубина не зависит - только от у. Поэтому просто так х-координату к у добавлять нельзя - а то получится вдруг х5+у15=х15+у5 - у двух клипов с разными координатами все равно получится одинкаовая глубина. Думаю, сделать что-то вроде - у*100+х - то есть, у, как более значимая в вычислении глубины переменная имеет основной вес, а х - просто как мелкое дополнение, как раз чтобы глубины не совпадали

Король
04.08.2005, 16:15
Можно поподробнее? Хотя бы про сетку (юнитов пока и "тупыми" можно сделать). Это что-то вроде двухмерного массива например?




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

iNils
04.08.2005, 16:21
У меня всё-таки не полноценная изометрия - то есть, фактически, от х глубина не зависит - только от у. Поэтому просто так х-координату к у добавлять нельзя - а то получится вдруг х5+у15=х15+у5 - у двух клипов с разными координатами все равно получится одинкаовая глубина. Думаю, сделать что-то вроде - у*100+х - то есть, у, как более значимая в вычислении глубины переменная имеет основной вес, а х - просто как мелкое дополнение, как раз чтобы глубины не совпадали
Я тебе об этом и писал. Посмотри внимательно.

Takato
04.08.2005, 19:35
Хм, что-то странное происходит при вставке в код мувиклипа следущего кода -

glu=y //глубина равна координате у мувика (для упрощения пока без х)
this.swapDepths(glu) //данный мувик отправляется на соответствующую шлубину

начинаются чудеса - после первого мувиклипа все последующие пропадают и начинает безбожно тормозить флэш. Попробовал различные вариации - либо примерно такой же, либо нет эффекта. Кто может сказать, в чем дело?

Ромастый
04.08.2005, 20:50
Написал давным-давно для схожих целей простенький прототипчик - регулирует глубину залегания клипов в зависимости от их координаты Y:
MovieClip.prototype.sortDepths = function() {
var movies = [];
for (var i in this) {
if (typeof (this[i]) == "movieclip") {
movies.push(this[i]);
}
}
//
var Sorter = function (a, b) {
if (a._y>b._y) {
return 1;
}
if (b._y>a._y) {
return -1;
}
else {
return 0;
}
};
movies.sort(Sorter);
for (var i = 0; i<=movies.length-1; i++) {
movies[i].swapDepths(i);
}
};

Может чем поможет...

iNils
04.08.2005, 20:56
так все правильно, надо смотреть что еще кроме этого делается.

Takato
05.08.2005, 02:35
Может чем поможет...

Вроде бы не совсем то - но может быть пригодится...

так все правильно, надо смотреть что еще кроме этого делается.

Нашел, в чем дело, правда легче от этого стало ненамного

при следуещем коде в мувиклипе -

glu=y*100+x
this.swapDepths(glu)

всё работает практически идеально, но...
С какого-то перепугу за пределами видимого поля флэшки (поэтому только щас и обнаружил) начинает создаваться КУЧА таких же юнитов. Один за другим, без остановки. То есть я нажимаю "создать одного" - а получается 10, 20, 30... Ес-но, что комп начинает тормозить.

Вот теперь думаю, в чем прикол

Takato
05.08.2005, 04:01
уф, вроде бы разобрался - заменил дупликатклип на атачмуви

теперь первая проблема решена (если только потом опять че-нить не вылезет) - спасибо всем, кто помогал :) Теперь осталась тока вторая - и еще десяток, который несомненно возникнет попозже :D

ЗЫ Кто-нибудь может дать ссылку на флэш-стратегии в инете? Хочется посмотреть, на что равняться - да и вобще, как другие их делают

DeadMorozz
05.08.2005, 14:25
интересно... я сейчас как раз сижу расписываю концепт оналайновой взвеси "бойцовского клуба" и "паркана". риалтайма мало, пошажка.
но все равно очень интересно.

Dima K
14.08.2005, 18:10
а как можно расчитать, что клетка занята?
а если юнитов много, то ведь всё будет загружено до предела.

iNils
14.08.2005, 19:46
а как можно расчитать, что клетка занята?
а если юнитов много, то ведь всё будет загружено до предела.
В массиве хранить состояние клетки

Dima K
15.08.2005, 00:51
если информацию о состоянии клетки хранить в массиве, то как потом узнать, занята ли клетка. нужно ведь как-то её ещё найти в массиве и удалить элементы о теперь уже незанятых клетках.

old_dark_elf
15.08.2005, 01:06
как вариант делаешь матрицу NxM из интежеров, с разными значениями, допустим:
0-путо
11-наш золдатен
12-не наш убер золдатен
21-дерево
22-стена
и т.д.

а потом проверяя - если матр[x;y]<>0 - занято, елс - не занято

когда-то таким макаром сделал пошаговую стратежку без ИИ :) на дельфях...

Dima K
15.08.2005, 01:36
только я делаю стратегию не пошаговую. как я буду искать в массиве, занята ли клетка или нет, если информация о нужной клетки находится в конце массива и на поле пара десятков юнитов, то как быть?

old_dark_elf
15.08.2005, 02:10
хммм...
а если проверка на наличие препятсятвия будет выполняться когда юнит идет?
т.е. ему нужно пойти на правую(типа 5 на нумпаде - юнит, 6 -право) клетку он смотрит есть ли там припятствиеии если есть вычисляет новый маршрут, кстати поиск нужного пути всеравно нужно будет производить каждый раз заного, что бы учитывать вновь появившиеся препятствия - какой нибудь солдат переместился...

есть идея - сделать вообще без матрицы (правда как выполнить поиск пути в этом случае во флеше я не знаю :() сделать клас "золдатен" с хиттестом на припятствия, т.е. стенки и другие золдатены, и если хитТест - то отодвинуть золдатена назад, короче что-то типа: http://www.silin.fatal.ru/ предпоследний пример (я имею ввиду не отскок, а неналожение, то что они не пересекаются друг с другом)...

Takato
15.08.2005, 02:13
есть идея - сделать вообще без матрицы (правда как выполнить поиск пути в этом случае во флеше я не знаю :() сделать клас "золдатен" с хиттестом на припятствия, т.е. стенки и другие золдатены, и если хитТест - то отодвинуть золдатена назад

Не лучший вариант, имхо. К тому же, не к любой графике подходящий

old_dark_elf
15.08.2005, 02:30
это да :) все будет круглое, или овальное (только с не большой разницей между сторонами) :) , зато матрицы нафик не нужны - а сними траблы - что бы найти путь нужна не одна итеррация цикла, а пока он будет искаться, какой-нить другой солдат может уже переместиться... хотя я точно не знаю, как будет вести себя флеш...

Dima K
15.08.2005, 02:34
у кого какие уже есть решения(примеры).

Stone
15.08.2005, 15:53
наверное надо разносить неподвижные препятствия и юнитов.
неподвижные хранить в масиве и на основе этих данных расчитывать траекторию движения юнитов.
а для юнитов проверять при каждом шаге занятосте клетки куда хотим его переместить.

и вообще хорошая идея (стратегия на флэш). надо бы разбить на подтемы и заняться дружно)))

кто возъмется тех задание писать?

iNils
15.08.2005, 16:01
только я делаю стратегию не пошаговую. как я буду искать в массиве, занята ли клетка или нет, если информация о нужной клетки находится в конце массива и на поле пара десятков юнитов, то как быть?
Я тебя умоляю.... какое искать, ты знаешь что за клетка и смотришь сразу знапчение ее в массиве.

Stone
15.08.2005, 16:15
все же обращение к очень большому массиву будет реально тормозить систему. лучше разнести на много маленьких, опять же по координатам.

iNils
15.08.2005, 16:44
все же обращение к очень большому массиву будет реально тормозить систему. лучше разнести на много маленьких, опять же по координатам.
не будет тормозить

Takato
15.08.2005, 17:13
все же обращение к очень большому массиву будет реально тормозить систему. лучше разнести на много маленьких, опять же по координатам.

Массив не обязательно должен быть по каждой точке. Разделить поле на квадраты размером пикселей 20, например, и делать массив квадратов.

А на счет юнитов - так вобще им столкновения просчитывать не обязательно друг с другом. Представьте, что идет отряд людей навстречу другому отряду в реальной жизни - они че, пройти друг сквозь друга не смогут и тупо встрянут? Да и лишние страдания игроку тока будут, когда его юниты начнут толкаться и встревать, капая ему на нервы. Играл во много компутерных игр, где юниты не мешались друг-другу - так в глаза прежде всего бросалась не эта "нереалистичность" - а удобство игры.

То есть, остается прогить как препятствия тока здания и препятствия карты (горы и т д). Их во-первых намного меньше, они неподвижны и больше по размерам - то есть квадраты массива можно увеличить и до 50 пикселей а то и больше


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

iNils
15.08.2005, 17:24
если массив содержит инфу о 10000 клетках это не страшно.
а вот теперь попробуйте создать мувиклипы для этих 10000 клеток.
тут ваш флеш и загнется и совсем не из-за массива.

Stone
15.08.2005, 17:24
не будет тормозить
попробуй загнать тектовый документ размером 10-20 метров в массив. слово - элемент. а потом поработать с ним. 5-ка вешалась даже при загрузке вроде.

2 Takato
тогда ходить они у тебя будут кучей (выглядеть как один юнит), а по достижении цели противник увидет клонирование армии)))
и чесно я не представляю как может один человек пройти сквозь другова. ну свои еще могут уплотниться и прижаться, а вот как противники будут среляя друг в друга проходить сквозь противника и продолжать путь???

Takato
15.08.2005, 17:37
тогда ходить они у тебя будут кучей (выглядеть как один юнит), а по достижении цели противник увидет клонирование армии)))

блин, ты внимательно читал? -_- еще раз -

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


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

если у тебя запустится алгоритм атаки и при этом не остановится алгоритм движения - это уже проблемы кода игры.

iNils
15.08.2005, 17:44
попробуй загнать тектовый документ размером 10-20 метров в массив. слово - элемент. а потом поработать с ним. 5-ка вешалась даже при загрузке вроде.
а я говорю о разумных размерах
10000 вполне хватит для игры, это 100 на 100
Чтобы оценить много это или мало возьмите тетрадку в клетку и отсчитайте 100 клеток в одном направлении.

Ромастый
15.08.2005, 17:55
Массивы это конечно хорошо...
Но вот зря не обратили внимания на трабл, о котором iNils сказал.
С большим количеством двигающихся юнитов стратегия в реальном времени превратится в пошаговую. 10000 конечно перебор, но и 40-50 событий onEnterFrame - это вешь довольно серьезная, способная сильно притормозить машину.

Ромастый
15.08.2005, 19:40
имхо, флэш не очень подходит для стратегий в реальном времени. пошаговые - это уже ближе.
или идти на ухищрения, вроде как отряд из нескольких юнитов обрабатывается как один объект, просто еще учитывается численность группировки. а ля Hmm.

Takato
15.08.2005, 19:54
имхо, флэш не очень подходит для стратегий в реальном времени. пошаговые - это уже ближе.
или идти на ухищрения, вроде как отряд из нескольких юнитов обрабатывается как один объект, просто еще учитывается численность группировки. а ля Hmm.

Ты имеешь ввиду пощаговые какого плана? Вроде демиургов - когда на поле n юнитов, которые ходят по очереди, а в остальное время стоят, или типа Героев - где вобще, отдельный "юнит" - это толпа из 48 лучников, например?

old_dark_elf
15.08.2005, 19:57
да в любом случае пошаговые стратегии на флеше сделать проще, чем реал тайм, на что они не были бы похожи...

Ромастый
15.08.2005, 19:58
пошаговые на флэш можно любые делать... тут проблем с тормозами не предвидится.
а идея была заимствовать из героев фишку с юнитом, в котором много тех самых лучников, что поможет снизить нагрузку на проц в реальной стратегии. правда насколько эта идея жизненна для стратегии в реальном временем, вопрос...

Stone
16.08.2005, 11:58
юнитов 100 флэш должен потянуть вроде.
вот пример, движется 100 клипов. замедление примерно в 3-4 раза у меня на пне 1000.
но код еще можно оптимизнуть.

iNils
16.08.2005, 12:27
юнитов 100 флэш должен потянуть вроде.
вот пример, движется 100 клипов. замедление примерно в 3-4 раза у меня на пне 1000.
но код еще можно оптимизнуть.
Графику надо делать пиксельную и качество ставить low

Stone
16.08.2005, 12:56
меня больше волновой алгоритм волнует. если для каждого юнита считать маршрут, то пошаговость обеспечина.

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

iNils
16.08.2005, 13:07
меня больше волновой алгоритм волнует. если для каждого юнита считать маршрут, то пошаговость обеспечина.

и не хочется каждую секунду проверять для каждого юнита возможность атаки. единственное что лезит в голову это хиттест.
Сделать ограниченность прямого хода. Скажем нельзя из одного угла в другой послать, а только на 10-15 клеток. Не удобно, но проще.

DeadMorozz
16.08.2005, 17:01
а идея была заимствовать из героев фишку с юнитом, в котором много тех самых лучников, что поможет снизить нагрузку на проц в реальной стратегии.
Факт - именно удачные метафоры порой спасают положение.
Сталкивался.

Takato
16.08.2005, 17:11
Факт - именно удачные метафоры порой спасают положение.
Сталкивался.

Ааа, блин, не напоминайте про Героев - а то я щас точно начну пошаговую делать... :D

Ромастый
16.08.2005, 17:12
а там и до крестиков-ноликов дело дойдет :)

iNils
16.08.2005, 17:18
Ааа, блин, не напоминайте про Героев - а то я щас точно начну пошаговую делать... :D
Играл по сетке с братом в Age Of Empires 2. Когда юнитов по сотне у каждого и игроков 8 (мы компьютерных ботов подключили), то тормозил даже мой p4-2800.

Takato
16.08.2005, 17:23
Играл по сетке с братом в Age Of Empires 2. Когда юнитов по сотне у каждого и игроков 8 (мы компьютерных ботов подключили), то тормозил даже мой p4-2800.

Гм... Ну это по-мойму неоптимизированность АоЕ. В казаках например тормоза начинаются после нескольких тысяч юнитов - причем на моем пне 4-1500

А уж к третьим героям, сколько бы там юнитов не было, требования вобще смешные... Все-таки у пошаговок преимуществ много... Хотя риал-тайм на флэше смотрится эффектнее, имхо

iNils
16.08.2005, 17:37
В казаках например тормоза начинаются после нескольких тысяч юнитов - причем на моем пне 4-1500
Не играл. И они все по отдельности? Жуть.

Takato
16.08.2005, 17:44
Не играл. И они все по отдельности? Жуть.

Ага... Представляешь картину - первые полчаса игры - обводишь 500 крестьян - отправляешь в замок тренероваться... Толпа несколько минут туда забегает (!) (здания намного больше юнитов, особенно крепости и т д - практически реальные пропорции). В это время за замком в боевых порядках стоит еще 800 воинов, 200 рабочих рубят лес, работают в шахтах, еще столько же - обрабатывают поля, еще 100 чето строят... У 3-4 компов-противников народу не меньше... И особых тормозов еще нет...

Ромастый
16.08.2005, 19:21
2Takato: Кстать, ты на какую тему игру делаешь? Ежели не секрет, конечно...

Takato
16.08.2005, 19:37
2Takato: Кстать, ты на какую тему игру делаешь? Ежели не секрет, конечно...

Хотел/хочу сделать что-то вроде Старкрафта (то есть космос). Ну а пока делаю - у меня нарисованы просто чижики с копьями и казармы с флагами.

А вобще у меня щас времени не особо - и стратежку щас не прогю. Тем более, чем дальше тем больше хочется сделать что-то типа Героев или Дисциплес (не только потому, что пошаговые легче делать).

Stone
17.08.2005, 18:18
Хотя риал-тайм на флэше смотрится эффектнее, имхо
уже видел где то?

Takato
17.08.2005, 18:36
уже видел где то?

Не, я просто думаю, мнение обывателей какое будет? "О, смотрите, они бегают! О, я обвел их рамочкой и они побежали все в одну точку! Круто, прям как в настоящей стратегии! Неужели такое можно сделать на флэше??..." и т. д. А при виде пошаговой таких восторгов пожалуй не будет

old_dark_elf
17.08.2005, 19:53
это уже было, на этом форуме поройтесь - парочку отыщете...

Stone
18.08.2005, 17:37
Не, я просто думаю, мнение обывателей какое будет? "О, смотрите, они бегают! О, я обвел их рамочкой и они побежали все в одну точку! Круто, прям как в настоящей стратегии! Неужели такое можно сделать на флэше??..." и т. д. А при виде пошаговой таких восторгов пожалуй не будет
а мне кажется что такие восторги будут только у людей понимающих как сложно реализовать данный проект на флэше.

Takato
18.08.2005, 17:47
а мне кажется что такие восторги будут только у людей понимающих как сложно реализовать данный проект на флэше.

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

DeadMorozz
18.08.2005, 18:32
а мне кажется что такие восторги будут только у людей понимающих как сложно реализовать данный проект на флэше.
*рыдает* В точку!

iNils
18.08.2005, 18:51
Это понимают и многие из тех, кто и не умеет работать на флэше. Они же юзают игры-флэшки - так стреллялки все видели тысячами, квестов чуть меньше, потом рпг, файтинги - а вот стратегий совсем мало
Не фига. Если человек не понимает продукт изнутри, он ни когда не поймет сложно его делать или нет.

ScaredShard
19.08.2005, 18:37
http://www.jengajam.com/r/Warcraft-Flash-Game
Но там производится крайне ограниченное количество юнитов. Можно софтником код раскурочить. Причем поиск пути там туповатый, но приемлемый для несложной карты.

Stone
23.08.2005, 19:13
Это понимают и многие из тех, кто и не умеет работать на флэше. Они же юзают игры-флэшки - так стреллялки все видели тысячами, квестов чуть меньше, потом рпг, файтинги - а вот стратегий совсем мало
дай ссылки на РПГ и стратегии. уж больно любопытно посмотреть. сам что то не натыкался.