Показать сообщение отдельно
Старый 16.03.2008, 21:57
Iv вне форума Посмотреть профиль Отправить личное сообщение для Iv Посетить домашнюю страницу Iv Найти все сообщения от Iv
  № 42  
Iv
 
Аватар для Iv

Регистрация: Apr 2001
Адрес: Moscow
Сообщений: 1,475
По умолчанию Замена

Возвращаемся в класс PathToArray и оцениваем возможность применения новых классов.
Только в этот момент обнаруживаю, что замена строковых данных на константы не везде сработала, поскольку строковые данные использовались не только в двойных кавычках, но и в одинарных.
Производим замену на константы.

Наша задача - заменить в массиве нетипизированные данные на объекты данных. Это нужно сделать как в процедуре наполнения массива, так и в процедуре использования.
Массив наполняется в классе PathToArray, где называется "drawCmds" и используется в классе SVGDisplayInFlash, где называется "dCmds". Заменим эти имена на одно: drawingCommands.

Начнем замену на объекты данных с класса PathToArray. Благодаря тому, что строки заменены на константы, нам трудно ошибиться какого класса команда должна быть использована.
Дублируем старую команду, комментируем верхнюю, а в нижней делаем соответствующую замену. Первые три замены будут выглядеть так:
Код AS3:
// drawingCommands.push([DrawingCommand.FILL, [fill.color, fill.alpha]]);
drawingCommands.push(new FillCommand(fill.color, fill.alpha));
 
// drawingCommands.push([DrawingCommand.STYLE, [stroke.width, stroke.color, stroke.alpha]]);
drawingCommands.push(new StyleCommand(stroke.width, stroke.color, stroke.alpha));
 
// drawingCommands.push([DrawingCommand.MOVE, [firstP.x, firstP.y]]);
drawingCommands.push(new MoveCommand(firstP.clone()));
Обратите внимание на то, что в последнем случае примера в качестве аргумента конструктора мы использовали копию точки, а не ее саму.
Заменяем все случаи добавления в массив и переходим к методу getShapes класса SVGDisplayInFlash.
Здесь для замены мы используем наши новые возможности. Мы можем заменить условную логику на полиморфизм. Суть будет заключаться в том, что в каждом классе команды рисования мы создадим метод draw и будем вызывать его в цикле.
Чтобы реализовать такое поведение можно пойти двумя путями: создать метод draw в классе DrawingCommand, а в подклассах его перекрыть, либо создать интерфейс и в классах рисования имплементировать его.
Мы пойдем вторым путем, поскольку нам это поможет создавать сами методы. К тому-же нам не придется беспокоиться о том, что кому-то в голову придет использовать метод draw у экземпляра класса DrawingCommand.

В папке draw cоздаем интерфейс IDrawable и описываем метод draw:
Код AS3:
package com.itechnica.svg.draw {
	import flash.display.Graphics;	
 
	public interface IDrawable {
		function draw(target:Graphics):void;
	}
}
Затем классам папки draw, кроме DrawingCommand, добавим имплементацию интерфейса, например:
Код AS3:
public class CurveCommand extends DrawingCommand implements IDrawable {...
После этого редактор подсветит ошибку, используя CTRL+1 исправляем ее - добавится метод draw. Каждому классу задаем свою соответствующую логику этого метода, например, класс CurveCommand будет использовать curveTo:
Код AS3:
public function draw(target:Graphics):void {
	target.curveTo(controlPoint.x, controlPoint.y, end.x, end.y);
}
Аналогично поступаем с остальными классами.

После чего вся логика, ранее реализованая в switch заменится на две строки:
Код AS3:
private function getShapes(iPath:Number):void {
	var drawingCommands:Array = new Array();
	conv = new PathToArray(paths[iPath], drawingCommands);
 
	// draw the shapes in clips in holder movieclip
	// holder.createEmptyMovieClip("p"+iPath, iPath+1);
 
	const drawLayer:Sprite = new Sprite();
	holderMc.addChild(drawLayer);
	const drawTarget:Graphics = drawLayer.graphics;
 
	for (var i:Number=0; i<drawingCommands.length; i++) {
		var command:IDrawable = drawingCommands[i] as IDrawable;
		command.draw(drawTarget);
	}
 
	// repeat til all paths have been read
	if (++iPath < nPathNodes) getShapes(iPath);
}
Тестируем, всё работает.
Вложения
Тип файла: zip SVGToFlash.zip (21.7 Кб, 147 просмотров)
__________________
http://realaxy.com


Последний раз редактировалось iNils; 20.12.2010 в 13:32.