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

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 02.04.2008, 22:11
Rzer вне форума Посмотреть профиль Отправить личное сообщение для Rzer Посетить домашнюю страницу Rzer Найти все сообщения от Rzer
  № 1  
Ответить с цитированием
Rzer
 
Аватар для Rzer

блогер
Регистрация: Feb 2007
Адрес: Spb
Сообщений: 613
Записей в блоге: 8
Отправить сообщение для Rzer с помощью ICQ
По умолчанию graphics и заливка

Работаю с заливкой. Собственно документ класс: (fps 31):

Код:
package {
	
	import flash.display.*;
	import flash.events.*;
	import flash.geom.*

	
	public class Landscape extends Sprite {
		public var isMouseDown:Boolean;
		private var matrix:Matrix;
		
		public function Landscape(){
			isMouseDown = false;
			matrix = new Matrix();
			configureListeners();
		}
		
		public function configureListeners():void{
			this.stage.addEventListener(MouseEvent.MOUSE_DOWN, mousePress, false, 0, true);
			this.stage.addEventListener(MouseEvent.MOUSE_UP, mouseRelease, false, 0, true);
			this.stage.addEventListener(Event.ENTER_FRAME, update, false, 0, true);
		}
		
		public function mousePress(e:MouseEvent):void{
			
			isMouseDown = true;
		}
		
		public function mouseRelease(e:MouseEvent):void{
			isMouseDown = false;
		}
		
		public function update(e:Event=null){
			if(isMouseDown){ 
 				
  				matrix.createGradientBox(100,100, 0,mouseX-50, mouseY-50);
  				this.graphics.beginGradientFill(GradientType.RADIAL, [0x150D04, 0x150D04], [0.1, 0], [0x00, 0xFF], matrix,SpreadMethod.PAD);  
				//this.graphics.beginFill(Number(Math.random()*255),0.1);
  				this.graphics.drawCircle(mouseX,mouseY,50);
				this.graphics.endFill();
			}
		}
		
	}
	
}
У меня два вопроса:
1. Почему при длительном рисовании начинаются задержки и как по этому поводу сделать "кеш" рисунка чтобы каждый след кружок рисовался с одинаковой скоростью.

2. Почему на крае круга при длительном удержании мышки в одном и том же положении (не перемещая) - на крае образуется белая кромка (или кромка с цветом фона сцены) при условии что цвет градиента на крае имеет альфу 0.

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

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
1. задержки из-за того что по Event.ENTER_FRAME плодишь столько шейпов, которые плееру вообще-то нужно перерисовывать на каждом такте, что он затыкается..
2. откуда берется твердый цвет при нулевой альфе на краю градиента не могу сказать..

как вариант решения: на каждом такте enterFrame скидывать нарисованный шейп в битмап.., некотрые артефакты тоже имеют место быть, но не такие дикие..
и хотя бы производительность не страдает
Код:
package {
	
	import flash.display.*;
	import flash.events.*;
	import flash.geom.*

	
	public class Landscape extends Sprite {
		public var isMouseDown:Boolean;
		private var matrix:Matrix;
		private var drawShape:Shape;
		private var drawCanvas:Graphics;
		private var resultBitmap:Bitmap;
		
		public function Landscape(){
			isMouseDown = false;
			matrix = new Matrix();
			
			resultBitmap = new Bitmap(new BitmapData(stage.stageWidth, stage.stageHeight, true, 0));
			resultBitmap.smoothing = true;
			addChild(resultBitmap);
			
			drawShape = new Shape();
			drawCanvas = drawShape.graphics;
			addChild(drawShape);
			
			configureListeners();
		}
		
		public function configureListeners():void{
			stage.addEventListener(MouseEvent.MOUSE_DOWN, mousePress, false, 0, true);
			stage.addEventListener(MouseEvent.MOUSE_UP, mouseRelease, false, 0, true);
			stage.addEventListener(Event.ENTER_FRAME, update, false, 0, true);
		}

		public function mousePress(e:MouseEvent):void {
			isMouseDown = true;
		}
		
		public function mouseRelease(e:MouseEvent):void{
			isMouseDown = false;
		}
		
		public function update(e:Event=null):void{
			if(isMouseDown){ 
  				matrix.createGradientBox(100, 100, 0, mouseX - 50, mouseY - 50);
  				drawCanvas.beginGradientFill(GradientType.RADIAL, [0x150D04, 0x150D04], [0.1, 0], [0x00, 0xFF], matrix,SpreadMethod.PAD);  
  				drawCanvas.drawCircle(mouseX,mouseY,50);
				//дорисовываем шейп к битпаму, а сам шейп очищаем
				resultBitmap.bitmapData.draw(drawShape);
				drawCanvas.clear();
				
			}
		}
		
	}
	
}

Старый 02.04.2008, 23:07
Rzer вне форума Посмотреть профиль Отправить личное сообщение для Rzer Посетить домашнюю страницу Rzer Найти все сообщения от Rzer
  № 3  
Ответить с цитированием
Rzer
 
Аватар для Rzer

блогер
Регистрация: Feb 2007
Адрес: Spb
Сообщений: 613
Записей в блоге: 8
Отправить сообщение для Rzer с помощью ICQ
2 silin: Большое спасибо за совет. Не думал что так просто. И второй пункт потерял актуальность. Ещё раз спасибо.

Создать новую тему Ответ Часовой пояс GMT +4, время: 09:27.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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