Показать сообщение отдельно
Старый 05.05.2014, 21:04
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 2  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
не возьмусь сказать, что конкретно косячит в вашем примере, но явно что-то с сохранением узлов в массиве точек (nodes который), он вообще в этом раскладе избыточный (у меня был приплетен ради выпендрежа с твином)
вот "отшкуренный' от лишних деталей вариант, может поможет разобраться

Код AS3:
package
{
 
	import com.bit101.components.*;
	import flash.display.*;
	import flash.events.*;
	import flash.geom.*;
 
	public class PlasticDeform extends Sprite
	{
 
		private var divX:int = 30;
		private var divY:int = 40;
 
		private var W:Number = 300;
		private var H:Number = 400;
 
		private var indices:Vector.<int>;
		private var uvData:Vector.<Number>;
		private var verticies:Vector.<Number>;
 
		[Embed(source="sample.jpg")]
		private var sample_jpg:Class;
 
		private var texture:BitmapData=Bitmap(new sample_jpg()).bitmapData;
 
		private var gridCheckBox:CheckBox;
		private var undoBut:PushButton;
 
 
		private var mX:Number;
		private var mY:Number;
 
		private var canvas:Sprite = new Sprite();
 
		private var undoList:Array = [];
 
 
		public function PlasticDeform():void
		{
 
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_LEFT;
 
 
 
			addChild(canvas);
			gridCheckBox = new CheckBox(this, 20, 420, "grid", draw);
			undoBut = new PushButton(this, 160, 420, "undo", undoBut_click);
 
			initGrid();
			draw();
 
			canvas.addEventListener(MouseEvent.MOUSE_DOWN, canvas_mouseDown);
			stage.addEventListener(MouseEvent.MOUSE_UP, stage_mouseUp);
 
		}
 
		private function canvas_mouseDown(e:MouseEvent):void
		{
			mX = mouseX;
			mY = mouseY;
 
 
			canvas.addEventListener(MouseEvent.MOUSE_MOVE, canvas_mouseMove);
			undoList.push(verticies.concat());
 
		}
 
		private function canvas_mouseMove(e:MouseEvent):void
		{
 
			for (var k:int = 0; k < verticies.length; k += 2)
			{
				var tX:Number = verticies[k];
				var tY:Number = verticies[k + 1];
				var fX:Number = (mX - tX < 0) ? ((W - tX) / (W - mX)) : (tX / mX);
				var fY:Number = (mY - tY < 0) ? ((H - tY) / (H - mY)) : (tY / mY);
				var f:Number = fX * fY;
				f *= f;
 
				verticies[k] += (mouseX - mX) * f;
				verticies[k + 1] += (mouseY - mY) * f;
			}
			draw();
			mX = mouseX;
			mY = mouseY;
 
		}
 
		private function stage_mouseUp(e:MouseEvent):void
		{
			canvas.removeEventListener(MouseEvent.MOUSE_MOVE, canvas_mouseMove);
		}
 
		private function undoBut_click(e:Event = null):void
		{
 
			if (undoList.length)
			{
				verticies = undoList.pop();
				draw();
			}
 
		}
 
		private function draw(e:Event = null):void
		{
 
			canvas.graphics.clear();
			if (gridCheckBox.selected)
			{
				canvas.graphics.lineStyle(0, 0x80FF80, 0.35);
			}
			canvas.graphics.beginBitmapFill(texture, null, false, true);
			canvas.graphics.drawTriangles(verticies, indices, uvData);
			canvas.graphics.endFill();
 
		}
 
		private function initGrid():void
		{
 
			uvData = new Vector.<Number>();
			verticies = new Vector.<Number>();
			indices = new Vector.<int>();
 
			var k:int = 0;
			for (var i:int = 0; i <= divY; i++)
			{
				for (var j:int = 0; j <= divX; j++)
				{
 
					verticies.push(W * j / divX, H * i / divY);
					uvData.push(j / divX, i / divY);
					if (i < divY && j < divX)
					{
						indices.push(k, k + 1, k + divX + 1, k + 1, k + divX + 2, k + divX + 1);
					}
 
					k++;
				}
			}
 
		}
 
	}
 
}

grid.swf   (36.5 Кб)
Вложения
Тип файла: swf grid.swf (36.5 Кб, 154 просмотров)