Форум 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)
-   -   copyPixels. поиск юзан, хелп читан. (http://www.flasher.ru/forum/showthread.php?t=88041)

n0wa 16.11.2006 01:19

copyPixels. поиск юзан, хелп читан.
 
Вложений: 1
Доброго времени суток.

Продолжая свои экзерсизы с флешем наткнулся на баг не баг, фичу не фичу, даже не знаю как это обозвать ;)

Вообщем ситуация.

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

происходит следующее

если bit создавать без прозрачности (false) то все ок (всмысле картинка собирается как надо, но он не прозрачный =(). а вот если прозрачным, то в битмапе остается только последний скопированый кусочек т.е. рука.

эффект не понятен. почему так? по идее должно быть наоборот. если прозрачность есть то она должна учитываться, если - то нет.

код ниже.
Код:

function CreatePlayer(posx,posy,hands,legs,torso,weapon,pos,sit,sex)
{
var mc:MovieClip = new MovieClip;
var bit:BitmapData = new BitmapData(32, 40);//, true, 0x000000);
var up:Number = 0;
if(pos >= 8)
        return 0;
if(sit){
        sit = 1;up = 3}
if(sex)
        sex  = 1;

mc = createEmptyMovieClip(mc, this.getNextHighestDepth());

if(pos < 4)
        bit.copyPixels(hands,new Rectangle(32*pos,0,32,40),new Point(0,up));
else
        bit.copyPixels(hands,new Rectangle(256 + 32*pos,0,32,40),new Point(0,up));

bit.copyPixels(torso,new Rectangle(32*pos + 256*sex,0,32,40),new Point(0,up));
bit.copyPixels(legs,new Rectangle(32*pos + 256*sit,0,32,40),new Point(0,0));

if(pos >= 4)
        bit.copyPixels(hands,new Rectangle(32*pos,0,32,40),new Point(0,up));
else
        bit.copyPixels(hands,new Rectangle(256+32*pos,0,32,40),new Point(0,up));

mc.attachBitmap(bit,10);//,"auto",true);

return mc;
}

Вложение 15790

lowka 16.11.2006 02:02

Код:

var bit:BitmapData = new BitmapData(32, 40, true, 0x00000000);
так попробуйте.
А параметр отвечающий за прозрачность поумолчанию имеет значение true. В хелпе ошибка.

iNils 16.11.2006 02:05

n0wa уже получал устное предупреждение за теги к коду, теперь получает плюс.

n0wa 16.11.2006 02:05

пробовал, эффект тот же. =(
Посмотрите семпл

n0wa 16.11.2006 02:11

Цитата:

Сообщение от iNils
n0wa уже получал устное предупреждение за теги к коду, теперь получает плюс.

Спасибо.

lowka 16.11.2006 02:19

Код:

if(pos < 4)
        bit.copyPixels(hands,new Rectangle(32*pos,0,32,40),new Point(0,up),hands,new Point(0,up),true);
else
        bit.copyPixels(hands,new Rectangle(256 + 32*pos,0,32,40),new Point(0,up),hands,new Point(0,up),true);;

bit.copyPixels(torso,new Rectangle(32*pos + 256*sex,0,32,40),new Point(0,up),torso,new Point(0,up),true);
bit.copyPixels(legs,new Rectangle(32*pos + 256*sit,0,32,40),new Point(0,0),legs,new Point(0,up),true);

if(pos >= 4)
        bit.copyPixels(hands,new Rectangle(32*pos,0,32,40),new Point(0,up),hands,new Point(0,up),true);
else
        bit.copyPixels(hands,new Rectangle(256+32*pos,0,32,40),new Point(0,up),hands,new Point(0,up),true);

Теперь вроде бы все ок.
В хэлпе как всегда все написано (alphaBitmap, alphaPoint и чето там еще mergeAlpha)

iNils 16.11.2006 02:30

Кстати
Код:

var mc:MovieClip = new MovieClip;
...
mc = createEmptyMovieClip(mc, this.getNextHighestDepth());

Надо писать так
Код:

var mc:MovieClip = createEmptyMovieClip("mc", this.getNextHighestDepth());

n0wa 16.11.2006 02:35

ага. спасибо. на примитиве это работает.
На более сложном, на так сказать ingame графике уже сложности. получатся лажа.

Цитата:

В хэлпе как всегда все написано (alphaBitmap, alphaPoint и чето там еще mergeAlpha)
я ж говорю читал хелп. там написано дословно
Цитата:

If include the alphaBitmap and alphaPoint parameters, you can use a secondary image as an alpha source for the source image. If the source image has alpha data, both sets of alpha data are used to composite pixels from the source image to the destination image.
однако не понятно как должна выглядеть эта alphaBitmap и какое значение её пикселя является 100% альфой. Если же следовать логике то 0хFFFFFF, а наличие таких пикселей в картинке-сорсе 100% сомнительно. Я провожу опять же аналогии с другими API, флаш изучаю три дня от силы плотно. А также что если у сорс имадж есть альфа то они работают обе... опять таки как.

n0wa 16.11.2006 09:43

Вложений: 1
вообщем использование alphaBitmap не помогло. да и зачем оно, если в исходном то есть альфаканал.

Хотя я возможно что то е понимаю

Вложение 15791

n0wa 16.11.2006 13:27

Кстати. Может кто нибудь подскажет, что будет быстрее,
floodFill или get\setPixel в цикле если точно известно сколько пикелей будет заполнено.

З.Ы. это маленьки ап такой )

Одно из возможных решений проблемы в лоб. Не самое лучшее думается.

Код:

function CreatePlayer(posx,posy,hands,legs,torso,weapon,pos,sit,sex)
{
var mc:MovieClip = createEmptyMovieClip(mc, this.getNextHighestDepth());
var bit:BitmapData = new BitmapData(32, 40, false, 0x000000);
var tbit:BitmapData = new BitmapData(32, 40, true, 0x000000);

var up:Number = 0;
if(pos >= 8)
        return 0;
if(sit){
        sit = 1;up = 3}
if(sex)
        sex  = 1;

if(pos < 4)
        bit.copyPixels(hands,new Rectangle(32*pos,0,32,40),new Point(0,up));
else
        bit.copyPixels(hands,new Rectangle(256 + 32*pos,0,32,40),new Point(0,up));

bit.copyPixels(torso,new Rectangle(32*pos + 256*sex,0,32,40),new Point(0,up));

bit.copyPixels(legs,new Rectangle(32*pos + 256*sit,0,32,40),new Point(0,0));

if(pos >= 4)
        bit.copyPixels(hands,new Rectangle(32*pos,0,32,40),new Point(0,up));
else
        bit.copyPixels(hands,new Rectangle(256+32*pos,0,32,40),new Point(0,up));


tbit.copyPixels(bit,new Rectangle(0,0,32,40),new Point(0,0),bit,new Point(0,0),true);

bit.dispose();
delete tbit;

for(var i = 0;i < 32; i++)
        for(var j = 0; j < 40; j++)
                if(!tbit.getPixel(i, j))
                        tbit.setPixel32(i,j,0x00000000);

mc.attachBitmap(tbit,10,"auto",true);
return mc;
}



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

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