Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Неправильная заливка при отрисовке через DrawPath (http://www.flasher.ru/forum/showthread.php?t=183716)

Isfet 30.08.2012 10:53

Неправильная заливка при отрисовке через DrawPath
 
Вложений: 1
всем привет, помогите решить проблему.
объект отрисовывается по линиям через DrawPath , заливается битмапом, но при добавлении нескольких линий в центр объекта, заливка становится корявой, появляется белой пятно, нужно чтобы все заливалось равномерно, вне зависимости от того какие внутри еще рисуются линии или фигуры. Все линии рисуются по одному пути рисования (тоесть по 1-му вектору комманд и координат).
Вложение 28393

Wolsh 30.08.2012 11:10

endFill()

Isfet 30.08.2012 11:17

энд филл есть
Код AS3:

fillShape.graphics.beginBitmapFill(fillBitmapData);
fillShape.graphics.drawPath(commands,coords);
fillShape.graphics.endFill();

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

alatar 30.08.2012 11:20

endFill должен вызываться до того, как будут отрисованы внутренние линии.

Isfet 30.08.2012 11:26

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

Wolsh 30.08.2012 11:35

Очевидно, перед каждым moveTo.
Плеер тоже не может интуитивно догадаться, что Вы хотите получить в итоге. При пересечении контуров действует winding. Да, чаще мешает чем помогает, но без него было бы невозможно делать "дырки" внутри замкнутых контуров.
Каждый moveTo по сути начинает новый контур. Надо закрыть предыдущий, чтобы не было виндинга. GraphicsEndFill такая же команда GraphicsData, как и все другие. А после нее еще надо заново объявлять заливку/обводку))

Isfet 30.08.2012 11:45

тоесть вариантов чтобы красиво залить больше нет, кроме как парсить массивы которые были изначала предназначены для отрисовки drawPath-ом, и делать конструкцию типа
Код AS3:

graphics.graphics.beginBitmapFill(fillBitmapData);
graphics.moveTo(0,0);
graphics.lineTo(0,100);
graphics.lineTo(100,100);
graphics.lineTo(100,0);
graphics.endFill();
 
graphics.beginFill(fillBitmapData);
graphics.moveTo(0x346333);
graphics.lineTo(0,100);
graphics.lineTo(100,100);
graphics.lineTo(100,0);
graphics.endFill();

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

alatar 30.08.2012 11:51

Что вы подразумеваете под "красиво"? Это нормальное поведение при заливке незамкнутых контуров (в большинстве векторных редакторов, реализация примерно такая же).

Isfet 30.08.2012 12:23

Вложений: 1
ну чтобы битмапа залила равномерно спрайт (без сдвигов рисунков и тп) вне зависимости от того сколько я еще дополнительно линий там не нарисовал
вектор комманд для отрисовки drawPath такой vecCommand = [1,2,2,2,2,1,2,2,2];
и мне кажется правильней чтобы заливка вела себя как правый вариант, нежели левый, а из-за такого поведения , приходится разбивать эти комманды (1,2,2,2,2,1,2,2,2) на moveTo , lineTo , внутри вставляя когда начинать заливку когда заканчивать, вместо того чтобы просто писать

Код AS3:

spr.graphics.beginBitmapFill(fillBitmapData);
spr.graphics.drawPath(vecCommand,vecCoords);
spr.graphics.endFill();

а дальше бы уже все объекты заливались одинаково
Вложение 28394

alatar 30.08.2012 12:51

Ваше "правильней" не позволит создавать заливки с отверстиями.

Wolsh 30.08.2012 12:54

1. Откуда Вы взяли про смещение рисунка заливки? Вы в одной системе координат рисуете. Не будете смещать с помощью Matrix — никто никуда и не сместится. Вы думаете, после moveTo или после объявления beginBitmapFill точка привязки заливки меняется?)) Нет. Заливка привязана к точке отсчета координат и сместить ее можно только матрицей, передаваемой в GraphicsBitmapFill или beginBitmapFill().
2. Еще раз... Не зацикливайтесь на своей конкретике. Обратитесь к Справке, там все есть. Включите логику, а не эмоции. Графикс содержит слои на низком уровне. Это можно увидеть, нарисовав несколько фигур с заливкой поверх друг друга и поставив среднюю прозрачность спрайту/шейпу. Вы увидите все фигуры полностью, потому что к каждой будет применена альфа отдельно как к самостоятельной фигуре, и будет наложение отдельных прозрачностей. В одном единственном спрайте/шейпе. Каждый контур это отдельный "слой" графикса. Пока Вы не закрыли заливку, Вы рисуете на одном таком "слое". И все пересечения контура будут обрабатываться в соответствии с правилом виндинга ("форточек"). Вы это правило не устанавливали, а по умолчанию оно делает дырки)). Так что
Код AS3:

path.winding = GraphicsPathWinding.NON_ZERO;

..и будет Вам счастье.
Но без дырок отверстий.

Isfet 30.08.2012 13:20

)) спасибо ограмное , то что нужно, кто же знал что в drawPath можно передавать еще и третий параметр)

Wolsh 30.08.2012 13:51

"Спасибо" за головную боль следить за направлением пересечений? Ну не знаю... мне кажется проще разобраться с логикой отдельности фигур)))


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

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