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

firefedot 09.06.2014 12:07

Туман войны из картинки
 
Добрый день.
Есть у меня "туман войны", который сделан из много-много черных квадратиков.
Но тут посетила идея сделать не просто черным все, нарисовать картинку прям тумана и ее открывать.
Скажите пожалуйста, как можно это реализовать.
Взять готовую картинку и ее как то распилить и постепенно открывать?
Вот как у меня сейчас все работает:
Код AS3:

 
public var blackBoxes:Vector.<MovieClip> = new Vector.<MovieClip>();
 
function shadowWar(){
 addChild(conteinerWar);
for(var oy:int = 0; oy < 54; oy ++)
{
for(var ox:int = 0; ox < 72; ox ++)
{
var blackBox:black = new black();
blackBox.x = ox * blackBox.width;
blackBox.y = oy * blackBox.height;
conteinerWar.addChild(blackBox);
blackBoxes.push(blackBox);
 
}
 
//Функция удаления тумана
function deletWar(){
 
for (var i = 0; i < blackBoxes.length; i++)
{       
        if(stage.contains(blackBoxes[i])){
        conteinerWar.removeChild(blackBoxes[i]);
        }else{
                //trace("Элемент тумана удален персонажем");
                }
}
        blackBoxes = new Vector.<MovieClip>();
        removeChild(conteinerWar);
        trace(blackBoxes.length);
 
}
 
//В этой функции я открываю туман
function lvl_1(){
 
...
 
for(var i :int = 0; i < blackBoxes.length; i ++)
{
        var distance:Number = Math.sqrt((blackBoxes[i].x - hero_2.x)*(blackBoxes[i].x - hero_2.x) + (blackBoxes[i].y - hero_2.y)*(blackBoxes[i].y - hero_2.y));
if(distance <= 40 && this.contains(blackBoxes[i]))
  conteinerWar.removeChild(blackBoxes[i]);
}
...
 
}

Скажите, как можно мне переделать все под нормальный и желанный вид)
Нарисовать большую картинку, нужного размера и ее разрезать или сделать бесшовную текстуру?
И может есть способ открывать область не квадратиками, а более мягко?
В общем буду раз любой помощи информации.
Спасибо.

Bletraut 09.06.2014 16:13

Можно либо через маску, либо через BlendMode.ERASE, или как-то так.

Добавлено через 1 минуту
А можно вообще этот туман рисовать кривыми, тогда будет плавно и как вам нужно.

ZackMercury 09.06.2014 16:19

Bletraut, ещё можно через setPixel, так можно и плавно и как угодно вообще)
Через маску тоже можно плавно.
А рисовать можно просто BitmapData.draw(... ..., color:uint);

firefedot 09.06.2014 16:25

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

import flash.events.MouseEvent;
import flash.display.MovieClip;
import flash.display.Sprite;
 
var imageMask:Sprite = new masker();
var box:Sprite = new boxer();
var container:Sprite = new Sprite();
addChild(container);               
container.addChild(box);
container.mask = imageMask;
 
        addChild(imageMask);
 
        addEventListener(Event.ENTER_FRAME, maskCreate);
 
        function maskCreate(event:Event):void{
                imageMask.x=mouseX;
                imageMask.y=mouseY;
        }

Этот код просто водит маску за мышкой, а как сделать, что маска оставалась на пройденных местах?
Дублировать маску? так ее может быть очень много и она вся будет следовать за объектом....

ZackMercury 09.06.2014 16:28

Использовать битмапу как маску.
И в её битмапдате рисовать masker.

firefedot 09.06.2014 16:57

То есть взять картинку, сделать маской...
а а вот про как в ее битмапдате сделать маску не понял)

Bletraut 10.06.2014 02:50

Цитата:

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

Для большего реализма можно фильтр какой-нить накинуть на неё.

firefedot 10.06.2014 03:11

А стирать чем?
Erase?

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

var pic_msk_data:BitmapData = new bg_clear();
 
var mymask:Sprite = new Sprite();
 
addChild(mypic_stage);
addChild(mymask);
 
stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMoves);
 
function onMouseMoves(event:MouseEvent):void
{       
                mymask.graphics.beginBitmapFill(pic_msk_data);
                mymask.graphics.drawCircle(mouseX, mouseY, 40);
                mymask.graphics.endFill();*/
 
}


Bletraut 10.06.2014 14:17

Не не, если через bitmap, то не ERASE. Рисуешь просто черную битмапдату, и потом в ней где персонаж ходит просто рисуешь прозрачные пиксели через draw. Или через copyPixels копируешь пиксели из битмапдаты "света" в битмапдату "тумана".

firefedot 10.06.2014 16:04

Так)
У меня есть картинка тумана. я ее нарисовал. красивая)))
Я ее хочу стирать)
То есть я под нее делаю draw.transpaert = true? или как там, типа разрешаю прозначность? и делаю такую же площать, как и картинка тумана?


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

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