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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 05.12.2013, 18:41
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 1  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
По умолчанию Scale и Rotation одновременно

Потерял всю надежду сделать одновременно вращение и увеличение обьекта при помощи тригонометрии.
Уже второй день не могу даже понять в чем причина и возможно ли это сделать без дополнительных контейнеров и матриц. Все что я могу представить, это не округлённые координаты, но после округления ( уже везде расставил Math.round ) все тоже самое. Если кто то уже это прошёл, хоть на словах обьясните что для нужно для правильной работы.
Код AS3:
package
{
	import flash.display.DisplayObject;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.geom.Point;
 
	public class Main extends Sprite 
	{
		public function Main() 
		{
			_frameRate = stage.frameRate;
 
			var circle:Sprite = new Sprite();
			circle.graphics.lineStyle(1,0xffffff);
			circle.graphics.drawCircle(0, 0, 75);
			circle.graphics.endFill();
			circle.x = circle.y = 250;
			addChild(circle);
			var _circle:Sprite = new Sprite();
			_circle.graphics.lineStyle(1,0xffffff);
			_circle.graphics.drawCircle(0, 0, 125);
			_circle.graphics.endFill();
			_circle.x = _circle.y = 250;
			addChild(_circle);
			_sprite = new Sprite();
			_sprite.graphics.beginFill(0x8E6828);
			_sprite.graphics.drawRect(0, 0, 100, 100);
			_sprite.graphics.endFill();
			_sprite.x = _sprite.y = 200;
			addChild(_sprite);
			addEventListener(Event.ENTER_FRAME, enterFrameHandler);
		}
 
		private var _frameRate:Number;
		private var _allTime:Number = 0;
		private var _duration:Number = 3;
		private function enterFrameHandler(event:Event):void 
		{
			var time:Number = 1 / 1000 * _frameRate;
			_allTime += time;
			var ratio:Number = _allTime / _duration;
			if (_allTime >= _duration)
			{
				ratio = 1;
				removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
			}
			this.rotateAroundPoint(_sprite, new Point(250, 250), ratio * 360);
			this.scalePoint(_sprite, ratio * 1 + 1, ratio * 1 + 1, new Point(250, 250));
		}
		private var _sprite:Sprite;
		private static const DEG_TO_RAD:Number = 3.1415926535897932 / 180;
		public function rotateAroundPoint(target:DisplayObject, point:Point, angle:Number):void
		{
			var a0:Number = -target.rotation * DEG_TO_RAD;
			var c0:Number = Math.cos(a0);
			var s0:Number = Math.sin(a0);
			var dX0:Number = target.x - point.x;
			var dY0:Number = target.y - point.y;
 
			target.rotation = 0;
			target.x = Math.round(point.x + dX0 * c0 - dY0 * s0);
			target.y = Math.round(point.y + dX0 * s0 + dY0 * c0);
 
			var c:Number = Math.cos(angle * DEG_TO_RAD);
			var s:Number = Math.sin(angle * DEG_TO_RAD);
			var dX:Number = target.x - point.x;
			var dY:Number = target.y - point.y;
 
			target.rotation = angle;
			target.x = Math.round(point.x + dX * c - dY * s);
			target.y = Math.round(point.y + dX * s + dY * c)
 
		}
		public function scalePoint(target:DisplayObject, scaleX:Number, scaleY:Number, point:Point):void
		{
			const dXS:Number = Math.round((target.x - point.x) / target.scaleX);
			const dYS:Number = Math.round((target.y - point.y) / target.scaleY);
 
			target.scaleX = scaleX;
			target.scaleY = scaleY;
 
			target.x = Math.round(point.x + dXS * target.scaleX)
			target.y = Math.round(point.y + dYS * target.scaleY)
			trace(_sprite.x,_sprite.y)
		}
 
	}
 
}

Старый 05.12.2013, 18:49
Isfet вне форума Посмотреть профиль Отправить личное сообщение для Isfet Найти все сообщения от Isfet
  № 2  
Ответить с цитированием
Isfet

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
рисовать фигуры вокруг координаты (0,0)
Код AS3:
_sprite.graphics.drawRect(-50,-50, 100, 100);
и вращать просто через rotation
Код AS3:
		private function enterFrameHandler(event:Event):void 
		{
			_sprite.rotation += 10;
			_sprite.scaleX += 0.05;
			_sprite.scaleY += 0.05;
		}

Старый 05.12.2013, 19:02
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 3  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Цитата:
рисовать фигуры вокруг координаты (0,0)
Мне кажется, что такой вариант не сработает с drawPath, а ещё ведь и Bitmap есть..

Старый 05.12.2013, 19:03
Isfet вне форума Посмотреть профиль Отправить личное сообщение для Isfet Найти все сообщения от Isfet
  № 4  
Ответить с цитированием
Isfet

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
в drawPath - работает, в битмап - не пробовал

Старый 05.12.2013, 19:39
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 5  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
битмап надо класть в контенер и делать также. Либо ставить галочку, что это битмап и в классе оперировать координатами.
if(bitmap)
bitmap.x = -bitmap.width/2
и т.п.
__________________
Марк Tween

Старый 05.12.2013, 21:09
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 6  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
in4core вот я уже сто раз думал, что я не капельки не умный и за семь месяцев не чего не сделал и уже пора "хоть как то" делать.. Но не могу, вот я задал вопрос и чуть позже понял в чем может быть проблема, при вращении точка регистрации тоже ведь крутится. Пойду проверять.

Старый 05.12.2013, 22:04
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 7  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
точка крутится? ну да..
__________________
Марк Tween

Старый 05.12.2013, 23:10
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 8  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
Сообщение от in4core Посмотреть сообщение
if(bitmap)
Оффтоп немного. Расскажи, пожалуйста, где ты научился писать if без пробела перед скобкой?
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 05.12.2013, 23:58
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 9  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
dimarik - не знаю где я научился или не учился вовсе, всегда так писал, но добрый FD всегда сам ставит пробел) посему я об этом не думаю
__________________
Марк Tween

Старый 07.12.2013, 02:01
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 10  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
После ещё одного дня попыток совместить scale и rotation с помощью тригонометрии, пришёл к выводу, что если это и возможно, то оно просто того не стоит. Максимум что получилось, это приблизить точность с разницей 0.5 пикселя, НО только на маленьких скоростях. И после нескольких проб крутить обьект на высокой скорости, по формулам которые я взял на форуме, тоже происходит жуткое смещение. Не знаю, из - за предельно высокой скорости это или нет, но я выставлял её только для того, чтобы, как я думал, посмотреть что произойдёт через некоторое время. По этому я хочу спросить, если делать тоже самое с помощью матриц, то это будет возможно? И с чего лучше начать, со scale или rotation? В общем, можно что то одно заменить матрицей, а что то оставить? Или нужно обязательно всё матрицами?

Добавлено через 25 минут
И если кто то знает уроки или записи в блогах по матрицам, поделитесь.

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

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

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


 


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


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