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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 12.08.2015, 14:44
Bazel вне форума Посмотреть профиль Отправить личное сообщение для Bazel Найти все сообщения от Bazel
  № 1  
Ответить с цитированием
Bazel
[+1 26.12.11]
[+1 11.09.11]

Регистрация: Feb 2011
Сообщений: 117
По умолчанию вращение и передвижение

Да простят меня админы, создаю еще одну тему.

Задача следующая, есть спрайт, который постоянно движется и вращается.
У нас есть таймер, к нему привязана функция которая через определенные промежутки времени вызывает вращение спрайта а затем перемещение. Все.
Проблема в том, что спрайт отлично вращается если мы не задаем никакую скорость по x и y осям. Или если нет вращения, то отлично передвигается. Но если спрайту нужно передвинуться и повернуться во время движения, тут он начинает неадекватно двигаться.

На форуме добрые люди помогли разобраться с вращением, оно выглядит так :

Код AS3:
public function rotateAroundCenter(object:DisplayObject, angle:Number):void 
{ 
 
 
	var center : Point = new Point(X,Y) ;
	angle += object.rotation;
        var a0:Number = - object.rotation * Math.PI / 180;
        var s0:Number = Math.sin(a0);
        var c0:Number = Math.cos(a0);
        var dX0:Number = object.x - center.x;
        var dY0:Number = object.y - center.y;
 
        object.rotation = 0;
        object.x = Math.round(center.x + dX0 * c0 - dY0 * s0);
        object.y = Math.round(center.y + dX0 * s0 + dY0 * c0);
 
        // new rotation
        var r:Number = angle * Math.PI / 180;
        var s:Number = Math.sin(r);
        var c:Number = Math.cos(r);
        var dX:Number = object.x - center.x;
        var dY:Number = object.y - center.y;
 
        object.rotation += angle;
        object.x = center.x + dX * c - dY * s;
        object.y = center.y + dX * s + dY * c;
 
	trace("object.x,object.y=",object.x,object.y) ;    
 
 
 
}
а перемещаем еще проще
Код AS3:
 
        X+=Number(Vx) ;   //скорость по Х
	Y+=Number(Vy) ;  // скорость по У
	trace("object.x0=",object.x);
	object.x+=Vx;
	object.x+=Vy;
Движение получается кривым. тут скорость по X и Y 1 и угловая скорость равна 1, а во втором случае просто вращаем тело, все работает. Гуглил, не очень помогло,буду еще гуглить, может кто-то сталкивался с похожей проблемой. Заранее спасибо!
Вложения
Тип файла: swf rectangle.swf (15.9 Кб, 284 просмотров)
Тип файла: swf true rotation.swf (15.9 Кб, 274 просмотров)


Последний раз редактировалось Bazel; 12.08.2015 в 15:05.
Старый 12.08.2015, 15:25
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 2  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
Ерунда какая-то написано или я чего-то не понимаю
делаете спрайт в адоб флеш СС и указываете начало координат в центре или гуглите как отцентровать спрайт

вращение
Код AS3:
			addEventListener(Event.ENTER_FRAME, rot)//создаёте слушатель для начала вращения, удалите, что бы перестало вращаться
		}
		private var sprite:Sprite = new Sprite(); //ваш спрайт
		private function rot(e:Event):void 
		{
			sprite.rotation += 1;// сами выбирайте скорость и направление вращения
		}

Старый 12.08.2015, 15:29
Bazel вне форума Посмотреть профиль Отправить личное сообщение для Bazel Найти все сообщения от Bazel
  № 3  
Ответить с цитированием
Bazel
[+1 26.12.11]
[+1 11.09.11]

Регистрация: Feb 2011
Сообщений: 117
в вашем коде он не будет вращаться вокруг своей оси

вращается он нормально и перемещается, но если мы сделаем скорость Vx <1 и Vy <1 то начинается двигаться вот так

а вот так например когда скорости Vy= 1 и Vx=1 , все нормально с тем же кодом

не совсем понял, начало координат же это всегда левый верхний угол?
Вложения
Тип файла: swf bad_movement.swf (15.8 Кб, 43 просмотров)
Тип файла: swf good_movement.swf (15.8 Кб, 48 просмотров)


Последний раз редактировалось udaaff; 13.08.2015 в 19:34.
Старый 12.08.2015, 15:45
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 4  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
Цитата:
Сообщение от Bazel Посмотреть сообщение
не совсем понял, начало координат же это всегда левый верхний угол?
координаты можно считать как и относительно сцены, так и относительно других объектов

Код AS3:
package  {
 
	import flash.display.MovieClip;
	import flash.events.Event;
 
 
	public class main extends MovieClip {
 
		private var sprite:mc = new mc();
		public function main() {
 
			sprite.x = sprite.y = 20;
			addChild(sprite);
			stage.addEventListener(Event.ENTER_FRAME, rot);
 
		}
		private function rot (e:Event):void
		{
			sprite.rotation +=5;
			sprite.x += 1;
			sprite.y += 2;
		}
	}
}
Вложения
Тип файла: swf ms.swf (643 байт, 35 просмотров)

Старый 12.08.2015, 15:58
Bazel вне форума Посмотреть профиль Отправить личное сообщение для Bazel Найти все сообщения от Bazel
  № 5  
Ответить с цитированием
Bazel
[+1 26.12.11]
[+1 11.09.11]

Регистрация: Feb 2011
Сообщений: 117
ваша правда, нарисовал многоугольник так чтобы его центр лежал на точке 0,0 родительского контейнера и вращение теперь нормальное! Не совсем въезжаю почему так.

Старый 12.08.2015, 16:07
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 6  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,922
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Потому, что так устроен рендер Flash.
Каждый DOC имеет свою систему координат, начало которой считается от x/y внутри родителя.
Вращаются объекты вокруг своего центра координат.
Если вы создадите 2 класса, например треугольник и круг, унаследовав их от Sprite, и центр у обоих будет слева вверху, и положите один в другой, например, треугольник в квадрат, и будем вращать квадрат, ничего не изменится, но если написать так
Код AS3:
triangle.x -= triangle.width/2;
triangle.y -= triangle.height/2;
то вращение будет происходить относительно центра треугольника. Т.е. смещается не центр, а мы смещаем треугольник относительно центра.
__________________
There is no thing in this world that is not simple.

Старый 12.08.2015, 16:07
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 7  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
потому что скорее всего расчёт вёлся относительно родительского контейнера, по этому и нужно центровать спрайты, там две строчки кода, но счас не вспомню, в гугле найдётся

с другой стороны это очень удобно, например создаём класс, который расширяет данный спрайт, и создадим в нём пару спрайтов написав this.addChild (если stage.addChild то расчёт будет относительно координат сцены) и всё, данные спрайты будут двигаться относительно расширенного спрайта, не нужно никаких расчётов, слушателей и т.п.

Старый 12.08.2015, 16:10
Bazel вне форума Посмотреть профиль Отправить личное сообщение для Bazel Найти все сообщения от Bazel
  № 8  
Ответить с цитированием
Bazel
[+1 26.12.11]
[+1 11.09.11]

Регистрация: Feb 2011
Сообщений: 117
понял вас, спасибо за помощь!


Последний раз редактировалось Bazel; 12.08.2015 в 16:22.
Создать новую тему Ответ Часовой пояс GMT +4, время: 23:22.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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