Форум 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=208007)

firefedot 27.05.2014 14:59

"Туман войны" или не видимая область для игрока.
 
Доброе...
Подскажите пожалуйста, как можно реализовать область, которую персонаж видит и не видит?
Поясню на примере.
Есть лабиринт, стрелками клавиатуры происходит управление персорнажем. Хочу сделать, так чтобы, когда игрок появился он не видел весь лабиринт, он был бы черным, и только делая шаг за шагом, он бы его открывал.
Так вроде понятней)
У меня была идея разместить много черных квадратиков и когда бы объект с ними соприкасался, они бы исчезали, открывая область. Но может это не правильный вариант? И тогда придеться накладывать много кусочков, для более плавного открытия области.
Или может масками как то?
Подскажите пожалуйста.
Спасибо.

Bletraut 27.05.2014 15:25

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

ZackMercury 27.05.2014 15:56

Можно просто отрисовывать область только вокруг персонажа.

firefedot 27.05.2014 15:58

Цитата:

Сообщение от SuriTheAngel (Сообщение 1166717)
Можно просто отрисовывать область только вокруг персонажа.

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

ZackMercury 27.05.2014 15:59

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

firefedot 27.05.2014 16:09

Тое сть в массив зоняю и отслеживаю столкноввения и стираю. верно понял?

Добавлено через 14 минут
Возник вопрос. а как правильно размешать, пусть например. черные квадраты на сцене?
Есть у меня объект blackBox. создаю массив количесвом равным отношений сторон всей области и размерами моего черного объекта? Типа первый помешаю в координаты 0,0, второй в координпту 0+ширина черного объекта? И так же по игрику?
Чтот запутался)

ZackMercury 27.05.2014 16:33

Циклом расставляете.
Код AS3:

var blackBoxes:Vector.<MovieClip> = new Vector.<MovieClip>();
 
for(var oy:int = 0; oy < MAP_HEIGHT; oy ++)
{
for(var ox:int = 0; ox < MAP_WIDTH; ox ++)
{
var blackBox:BlackBox = new BlackBox();
blackBox.x = ox * blackBox.width;
blackBox.y = oy * blackBox.height;
addChild(blackBox);
blackBoxes.push(blackBox);
}
}

Ну или width и height поменяете в координатах на нужные вам.

P.S. Извиняюсь за форматирование, просто в браузере не хочет отступать кнопкой TAB.

firefedot 27.05.2014 16:51

Спасибо, сейчас попробую...

Добавлено через 6 минут
Получилось, так сказать сетка для тумана готова)
Спасибо.
А чтобы его открывать. туман войны. нужно искать столкновения с вектором?

Добавлено через 14 минут
Что-то потерялся я)
Код AS3:

 if (blackBox.hitTestPoint(mx,my,true)){
        trace(mx,my);
          removeChild(blackBox);
        }

mx,my координаты мыши. Но тут даже трейс невыводит... тыкаю везде. где можно)
а тогда с чем мне искать столкновение?)
Код AS3:

trace(blackBox.x);

Выдает координату самого последнего созданного кусочка...

ZackMercury 27.05.2014 17:06

Ну, можно проверять вхождение в радиус вокруг персонажа каждый кусочек ежекадрово.
Код AS3:

var distance:Number = Math.sqrt((blackBoxes[i].x - player.x)*(blackBoxes[i].x - player.x) + (blackBoxes[i].y - player.y)*(blackBoxes[i].y - player.y));
if(distance <= ...) removeChild(blackBoxes[i]);

Добавлено через 3 минуты
Цитата:

Выдает координату самого последнего созданного кусочка...
В моём примере куски загоняются в массив кусков blackBoxes.
Чтобы пройтись по всем кускам, используется такая конструкция

Код AS3:

for(var i :int = 0; i < blackBoxes.length; i ++)
{
//Здесь проводим операции с каждым куском(каждый кусок доступен как blackBoxes[i])
}


firefedot 27.05.2014 17:16

Спасибо, элемент принаведении мыши удаляется, но выходит ошибка в окне вывода:
Код:

ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.
        at flash.display::DisplayObjectContainer/removeChild()
        at shadowwar_fla::MainTimeline/speedPers()[shadowwar_fla.MainTimeline::frame1:35]

Ругается на строку:
Код:

if(distance <= 10) removeChild(blackBoxes[i]);
так понимаю. условие уродское я ему дал?)

Добавлено через 1 минуту
Вот мой код. чую. что где то накосячил. а где, не пойму...
Код AS3:

var mx,my:int;
var blackBoxes:Vector.<MovieClip> = new Vector.<MovieClip>();
 
for(var oy:int = 0; oy < 14; oy ++)
{
for(var ox:int = 0; ox < 20; ox ++)
{
var blackBox:black = new black();
blackBox.x = ox * blackBox.width;
blackBox.y = oy * blackBox.height;
addChild(blackBox);
blackBoxes.push(blackBox);
}
}
 
addEventListener(Event.ENTER_FRAME, speedPers);
 
function speedPers(event:Event):void{
        for(var i :int = 0; i < blackBoxes.length; i ++)
{
        mx=mouseX;
        my=mouseY;
var distance:Number = Math.sqrt((blackBoxes[i].x - mx)*(blackBoxes[i].x - mx) + (blackBoxes[i].y - my)*(blackBoxes[i].y - my));
if(distance <= 10) removeChild(blackBoxes[i]);
}
        }



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

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