Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > Wolf

Оценить эту запись

Рисуем фигуры. Прямоугольник

Запись от Wolf размещена 22.07.2012 в 03:15
Обновил(-а) Wolf 22.07.2012 в 13:31

Возможности программного рисования в ActionScript 3 очень богаты, но есть один недостаток - нельзя в режиме реального времени управлять рисунком. Решить данную проблему можно следующим способом. Я написал класс который создает прямоугольник, и тут же ним можно управлять как вам хочется.

UPDATE
Добавил возможность опционально использовать stage.invalidate(). Если вам это нужно, то поставьте render=true, и тогда вызовите stage.invalidate().
Код AS3:
package 
{
	import flash.display.Graphics;
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
 
	/**
	 * ...
	 * @Wolf
	 * http://vk.com/id62810564
	 * http://vk.com/as3flashdev
	 */
	public class Rect
	{
		private var sprite:Sprite = new Sprite();
		private var lineStyle:Object = new Object();
		private var fillStyle:Object = new Object();
		private var _w:int;
		private var _h:int;
		public var draggable:Boolean = true;
		private var _render:Boolean = false;
		public function Rect(add:Function, x:int, y:int, w:int, h:int) {
		_w = w;
		_h = h;
 
		lineStyle.thickness = null;
		lineStyle.color = 0;
		lineStyle.alpha = 1;
		lineStyle.pixelHinting = false;
		lineStyle.scaleMode = "normal";
		lineStyle.caps = null;
		lineStyle.joints = null;
		lineStyle.miterLimit = 3;
 
		fillStyle.color = 0x000000;
		fillStyle.alpha = 1;
 
		draw();
 
		sprite.x = x;
		sprite.y = y;
			add(sprite);
			sprite.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
			sprite.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
		}
		private function renderListen(event:Event):void {
			trace("renderHandler: " + event);
			draw();
		}
		private function onMouseDown(e:MouseEvent):void {
			if(draggable==true)
			sprite.startDrag();
		}
 
		private function onMouseUp(e:MouseEvent):void {
			sprite.stopDrag();
		}
 
		private function draw():void {
			sprite.graphics.clear();
			sprite.graphics.lineStyle(lineStyle.thickness, lineStyle.color,lineStyle.alpha,lineStyle.pixelHinting,lineStyle.scaleMode,lineStyle.caps,lineStyle.joints,lineStyle.miterLimit);
			sprite.graphics.beginFill(fillStyle.color, fillStyle.alpha);
			sprite.graphics.drawRect(0, 0, this._w, this._h);
			sprite.graphics.endFill();
			trace("draw");
		}
 
		public function set width(w:int):void {
			this._w = w;
			if(!render) draw();
		}
		public function get width():int {
			return this._w;
		}
 
		public function set height(h:int):void {
			this._h = h;
			if(!render) draw();
		}
		public function get height():int {
			return this._h;
		}
		public function set line_thick(thick:Number):void {
			lineStyle.thickness = thick;
			if(!render) draw();
		}
		public function get line_thick():Number {
			return lineStyle.thickness;
		}
		public function set line_color(color:uint):void {
			lineStyle.color = color;
			if(!render) draw();
		}
		public function get line_color():uint {
			return lineStyle.color;
		}
		public function set line_alpha(alpha:Number):void {
			lineStyle.alpha = alpha;
			if(!render) draw();
		}
		public function get line_alpha():Number {
			return lineStyle.alpha;
		}
		public function set line_pixelHinting(pixelHinting:Boolean):void {
			lineStyle.pixelHinting = pixelHinting;
			if(!render) draw();
		}
		public function get line_pixelHinting():Boolean {
			return lineStyle.pixelHinting;
		}
		public function set line_scaleMode(scaleMode:String):void {
			lineStyle.scaleMode = scaleMode;
			if(!render) draw();
		}
		public function get line_scaleMode():String {
			return lineStyle.scaleMode;
		}
		public function set line_caps(caps:String):void {
			lineStyle.caps = caps;
			if(!render) draw();
		}
		public function get line_caps():String {
			return lineStyle.caps;
		}
		public function set line_joints(joints:String):void {
			lineStyle.joints = joints;
			if(!render) draw();
		}
		public function get line_joints():String {
			return lineStyle.joints;
		}
		public function set line_miterLimit(miterLimit:Number):void {
			lineStyle.miterLimit = miterLimit;
			if(!render) draw();
		}
		public function get line_miterLimit():Number {
			return lineStyle.miterLimit;
		}
		public function set fill_color(color:uint):void {
			fillStyle.color = color;
			//trace("fill");
			if(!render) draw();
		}
		public function get fill_color():uint {
			return fillStyle.color;
		}
		public function set fill_alpha(alpha:Number):void {
			fillStyle.alpha = alpha;
			if(!render) draw();
		}
		public function get fill_alpha():Number {
			return fillStyle.alpha;
		}
		public function get render():Boolean {
			return _render;
		}
		public function set render(render:Boolean):void {
			_render = render;
			if (render) sprite.addEventListener(Event.RENDER, renderListen); else 
			sprite.removeEventListener(Event.RENDER, renderListen);
		}
}
}
Вот такой вот нехитрый класс. Думаю как работать с ним вы разберетесь сами. Очень интересно услышать пожелания, чего не хватает и т.д.
Всего комментариев 11

Комментарии

Старый 22.07.2012 04:42 iNils вне форума
iNils
 
Аватар для iNils
Если в одном месте изменить у Rect 10 параметров, то метод draw будет вызван 10 раз, хотя фактически нужно нарисовать только последнее изменение. Поэтому советую почитать про stage.invalidate ()
Старый 22.07.2012 10:34 Aquahawk вне форума
Aquahawk
 
Аватар для Aquahawk
Цитата:
нельзя в режиме реального времени управлять рисунком
Это, простите, как?
Старый 22.07.2012 11:18 Wolf вне форума
Wolf
iNils, спасибо, буду иметь в виду.
Старый 22.07.2012 16:57 КорДум вне форума
КорДум
 
Аватар для КорДум
А в чем смысл сего класса? В чем его преимущество над прямыми вызовами методов Graphics?
И присоединяюсь к Aquahawk. Как это?
Старый 22.07.2012 17:22 i.o. вне форума
i.o.
 
Аватар для i.o.
Код AS3:
	public class Rect
	{
		private var sprite:Sprite = new Sprite();
		....
		public function Rect(add:Function, ....) {
			....
			add(sprite);
			sprite.addEventListener(...);
			sprite.addEventListener(...);
Смысл??
Не проще ли унаследоваться от спрайта:
Код AS3:
public class Rect extends Sprite
Старый 22.07.2012 19:01 samana вне форума
samana
 
Аватар для samana
Цитата:
Сообщение от КорДум
И присоединяюсь к Aquahawk. Как это?
Наверно имеется ввиду изменять заливку, обводку и т.п. уже у "нарисованной" фигуры - одной командой.
Обновил(-а) samana 22.07.2012 в 21:49
Старый 22.07.2012 21:24 Wolf вне форума
Wolf
samana, именно так
Старый 23.07.2012 00:52 -De- вне форума
-De-
 
Аватар для -De-
Хороший для вашего возраста результат, но...
Бросьте это гиблое дело.
Вы не меняете прямоугольник, вы перерисовываете его заново. В том спрайте, который вам передадут в graphics будет нарисован только прямоугольник, т.к. вы вызываете clear(). Другая графика будет удалена.
Кодом не рисуют. Код может рисовать на основе каких-то данных, но он не будет использовать drawRect. Уходите от подобного рисования кодом - такое смотрится крайне страшно. drawRect вообще крайне редко использется в проф. приложениях (я вот никогда не использовал) и чаще всего когда используется, то заливается битмапой.
Старый 23.07.2012 01:19 КорДум вне форума
КорДум
 
Аватар для КорДум
Цитата:
drawRect вообще крайне редко использется в проф. приложениях (я вот никогда не использовал) и чаще всего когда используется, то заливается битмапой.
-De-, рамки вокруг картинок-спрайтов создавать еще. Я использовал как-то для красоты )
Старый 23.07.2012 05:42 iNils вне форума
iNils
 
Аватар для iNils
drawRect использую чаще всех графических методов.
Старый 23.07.2012 22:10 dimarik вне форума
dimarik
 
Аватар для dimarik
Чутка подправлю тезис.

Возможности программного рисования в ActionScript 3 не очень богаты, и есть еще один недостаток — они медленные.
 
Последние записи от Wolf

 


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


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