Показать сообщение отдельно
Старый 31.01.2012, 11:09
Black Soviet вне форума Посмотреть профиль Отправить личное сообщение для Black Soviet Найти все сообщения от Black Soviet
  № 1  
Ответить с цитированием
Black Soviet
 
Аватар для Black Soviet

Регистрация: Nov 2011
Сообщений: 41
The bomb! Мерцание при движении объекта (пример внутри))

Товарищи, вчера весь день лопатил и рунет и буржуйские форумы в поиске проблемы, связанной с мерцанием графического объекта при его программном движении. Эта проблема и здесь на форуме поднималась различными пользователями в нескольких темах, но нигде результирующего решения так и не было озвучено.(или я слепой).
НЕТ ПРОБЛЕМ С ПЛАВНОСТЬЮ ДВИЖЕНИЯ Есть проблема с отрисовкой объекта при его перемещении. То есть как я понимаю проблема в том Flash начинает рисовать объект на новом месте, до конца не удалив его с предыдущего, в результате на объекте видны мерцающие горизонтальные полосы.
В качестве примера быстро набросал программку с вращением шара по эллипсоидной траектории (фон черный, объект белый, специально для лучшего контраста), где сами можете даже не на слишком большой угловой скорости увидеть эффект с мерцанием.
http://megaswf.com/serve/2104891
Код:
Код AS3:
package 
{
 
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.display.Shape;
	import flash.display.BitmapData;
	import flash.display.Bitmap;
	import flash.utils.getTimer;
	import flash.events.TimerEvent;
	import flash.utils.Timer;
 
 
	public class main extends MovieClip
	{
		var a:int=100; // горизонтальный радиус (для эллипса)
		var b:int=100; // вертикальный радиус (эллипса)
		var cx:int = 350; // Х центра точки вокруг которой вращается шар
		var cy:int = 150; // Y центра точки вокруг которой вращается шар
		var t:Number=0;      // текущий угол в радианах
		var speed:Number = 0.05; // скорость вращения в радианах
		var mc:MovieClip; // Шар
		var dx,dy:Number; // используются как вспомогательные в формуле эллипса
 
		public function main()
		{
		mc = new Planet();
		addChild(mc);
		//mc.cacheAsBitmap = true;
		//mc.scaleX=1.1;
 
		addEventListener(Event.ENTER_FRAME,Vertigo);
		upBtn.addEventListener(MouseEvent.CLICK,Up); // нажатие на поле увеличивает скорость вращения
		downBtn.addEventListener(MouseEvent.CLICK,Down); // нажатие на поле уменьшает скорость вращения
 
		}
 
		function Vertigo(e:Event):void
		{
			t +=  speed; // увеличиваем угол 
			dx = a * Math.cos(t); // определяем положение по Х на эллипсе
			dy = b * Math.sin(t); // определяем положение по Y на эллипсе
			mc.x = cx + dx; //выставляем координаты шара, учитывая центр вращения (сх, су)
			mc.y = cy + dy;
 
 
			speedBar.text=String(speed); // показываем скорость на экране
		}
		function Up(e:MouseEvent):void
		{
			speed+=0.01;	
		}
		function Down(e:MouseEvent):void
		{
			speed-=0.01;	
		}
	}
 
}
Что пробовал для решения этой проблемы:
  • запихивать в мувиклип и вектор и растр - не помогает
  • cacheAsBitmap - не помогает
  • Использовать Timer с updateAfterEvent вместо EnterFrame - не помогает
  • прямолинейное движение только по целым координатам - не помогает
  • Увеличение FPS - не помогает

Кто-то говорит что надо ждать новой версии флеш-плеера, кто-то что это проблема ВООБЩЕ на флеше не решается. Но может есть у кого какой-нибудь опыт в борьбе с этим эффектом ? Был бы очень признателен.


Последний раз редактировалось Black Soviet; 31.01.2012 в 11:22.