Показать сообщение отдельно
Старый 01.08.2011, 21:40
Gantenbain вне форума Посмотреть профиль Отправить личное сообщение для Gantenbain Найти все сообщения от Gantenbain
  № 5  
Ответить с цитированием
Gantenbain

Регистрация: Jul 2011
Сообщений: 32
Да, я пробовал и этим вариантом снимать данные с BitmapData...
Кстати, должен покаяться (как бы ни было досадно это делать) - поторопился отрапортовать, что удовлетворил свой "академический интерес" ... Давно не ощущал себя в такой прострации:
чтобы не гонять бессмысленные циклы, изменим
Код AS3:
while(i < 150)
, добавим переменную
Код AS3:
var trigg:int = 0;
и внутрь var paintBm:
Код AS3:
trigg = 1 - trigg;
var vvv:Vector.<Vector.<Number>> = Vector.<Vector.<Number>>([Vector.<Number>([5, 5, 20, 5, 20, 25, 5, 25, 5, 5]), Vector.<Number>([15, 15, 30, 15, 30, 35, 15, 35, 15, 15])]);
tmpSh.graphics.drawPath(commands, vvv[trigg]);
и в итоге:
trigg:0; color:0xff0000,0xff00ff
trigg:1; color:0xff0000
trigg:0; color:0xff0000,0xff00ff

Цвета второго прямоугольника игнорированы при любом начальном значении trigg...
Однако, если исказим углы прямоугольников
Код AS3:
var vvv:Vector.<Vector.<Number>> = Vector.<Vector.<Number>>([Vector.<Number>([7, 5, 20, 5, 20, 25, 5, 25, 7, 5]), Vector.<Number>([10, 15, 30, 15, 30, 35, 15, 35, 10, 15])]);
то, надо полагать, благодаря размытию, получим:
trigg:0; color:0xff0000,0xff001f,0xff003f,0xff007f,0xff009f,0xff00bf,0xff00ff
trigg:1; color:0xff0000,0xff00df,0xff009f,0xff005f,0xff001f,0xff00ff
trigg:0; color:0xff0000,0xff001f,0xff003f,0xff007f,0xff009f,0xff00bf,0xff00ff

Попытки отследить связи через отладчик меня не навели ни на какие выводы о причинах такого загадочного поведения... Возможно был недостаточно внимателен, возможно мое знание flash'a and AS изобилует пробелами, что вполне вероятно, т.к. увлекся этим недавно,... но озадачен. Возможно, допускаю некое хулиганство в конструкторе класса, но мне оно не очевидно.

Добавлено через 20 часов 4 минуты
Если код изменить таким образом
Код AS3:
public function MyClass() {
 			var thisbitmapdata:BitmapData = new BitmapData(800, 600, true, 0x80FFFFFF);
			this.bitmapData = thisbitmapdata;
			var commands:Vector.<int> = Vector.<int>([1, 2, 2, 2, 2]);
			var data:Vector.<Number> = Vector.<Number>([5, 5, 19, 5, 19, 19, 5, 19, 5, 5]);
			var i:int = 0;
			var pixelValue:uint = 0;
 
			var paintBm:Function = function(bmp:Bitmap):void {
				var arr:Vector.<String> = new Vector.<String>();
	                        var tmpSh:Shape = new Shape();
				tmpSh.graphics.beginFill(0xFF00FF, 1);
				tmpSh.graphics.drawPath(commands, data);
				var r:Rectangle = tmpSh.getBounds(stage);
				var w:int = r.width;
				var h:int = r.height;
				var bmpdata:BitmapData = new BitmapData(w, h, false, 0xFF0000); 
				bmpdata.draw(tmpSh);
				var mtr:Matrix = new Matrix(1, 0, 0, 1, 30 + i*10, r.topLeft.y);
				var aSh:Bitmap = new Bitmap();
				var aShbmpdata:BitmapData = new BitmapData(w, h, false, 0x00DDCC); 
 
				for (var m:int = 0; m < w; m++) {
					for (var j:int = 0; j < h; j++) {
						pixelValue =  bmpdata.getPixel(m, j);
						if (pixelValue == 0xFF00FF) aShbmpdata.setPixel(m, j, pixelValue);
				        if (arr.length == 0 || arr.indexOf(("0x"+pixelValue.toString(16))) < 0)  arr.push("0x"+ pixelValue.toString(16));
					} 
				}
 
				arr.splice(0, arr.length);
				aSh.bitmapData = aShbmpdata;
				bmp.bitmapData.draw(tmpSh);
				bmp.bitmapData.draw(aSh, mtr, null, null, null, false);
				tmpSh.graphics.clear();
				bmpdata.dispose();
			}
			while(i < 20) {
			for (var e:int = 0; e < data.length; e++ ) {
				data[e] += i; 
			}
			paintBm(this);
			i +=2;
			}
		}
то создается впечатление, что метод getPixel возвращает пиксели из области, которую объект успешно покидает, и которая определяется начальным getBounds объекта. Не придумал лучшего, как зарегистрировать баг в базе данных Адоба #2933259, но, судя по датам уже имеющихся багов, это надолго.. Я не вижу, в чем может быть некорректность используемого мной приема, а отказываться от него жаль, т.к. сильно экономит код.