PDA

Просмотр полной версии : copyPixels. поиск юзан, хелп читан.


n0wa
16.11.2006, 01:19
Доброго времени суток.

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

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

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

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

если 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
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
вообщем использование 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;
}

n0wa
16.11.2006, 22:09
больше никто ничего дельного не посоветует ?;) ау, мегагуру флеша, помогите плз.

miramax
16.11.2006, 22:12
FloodFill однозначно быстрее copyPixels
Зайди в поиск, я эту тему долго обуждал здесь недели две назад