Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   делаю стратегию - пара вопросов (http://www.flasher.ru/forum/showthread.php?t=67492)

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

Цитата:

Сообщение от iNils
но координаты то у них разные?

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

Король 04.08.2005 16:15

Цитата:

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


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

iNils 04.08.2005 16:21

Цитата:

Сообщение от Takato
У меня всё-таки не полноценная изометрия - то есть, фактически, от х глубина не зависит - только от у. Поэтому просто так х-координату к у добавлять нельзя - а то получится вдруг х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);
        }
};

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


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

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