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

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

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

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Я просто не переделывал код в вашем файле, а написал с нуля. Мой код в классе, но это не должно вам помешать понять его логику. Там почти всё тоже самое.
Код AS3:
package 
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
 
	/**
	 * ...
	 * @author samana
	 */
	public class Main extends Sprite 
	{
		private var p:Sprite;
		private var pArr:Vector.<Sprite> = new Vector.<Sprite>();
		public function Main():void 
		{
			//создаю части верёвки в виде прямоугольников и заношу их в массив
			for (var i:int = 0; i < 60; i++) 
			{
				p = new Sprite();
				p.graphics.beginFill(0);
				p.graphics.drawRect( -3, -2, 6, 4);
				p.graphics.endFill();
 
				p.x = i * 5;
				p.y = 100;
 
				addChild(p);
				pArr[i] = p;
			}
 
			//при движении мыши двигаю верёвку
			stage.addEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMove);
		}
 
		private function stage_mouseMove(e:MouseEvent):void 
		{
			//сначала выствляем верёвку от первого звена (которое в координатах мыши)
			//до последнего
			pArr[0].x = mouseX;
			pArr[0].y = mouseY;
			for (var i:int = 1; i < pArr.length; i++) 
			{
				var p1:Sprite = pArr[i-1];//предыдущее звено
				var p2:Sprite = pArr[i];//текущее звено
				var ang:Number = Math.atan2(p1.y - p2.y, p1.x - p2.x);
				var dx:Number = p1.x - p2.x;
				var dy:Number = p1.y - p2.y;
				var dist:Number = Math.sqrt(dx * dx + dy * dy);
 
				p2.rotation = ang * 180 / Math.PI;
				if (dist > 10)
				{
					p2.x += (dist-10)*(dx/dist);
					p2.y += (dist-10)*(dy/dist);
				}
			}
			//------------------------- revers
			//перебераем звенья в обратном порядке, от фиксированного конца, до начального звена
			//фиксирую последее звено
			pArr[pArr.length - 1].x = 100;
			pArr[pArr.length - 1].y = 100;
			//цикл начинаю с предпоследнего звена, ведь последнее звено зафиксировано
			for (i=pArr.length-2; i >= 0; i--) 
			{
				p1 = pArr[i+1];//звено следующее (в сторону начала верёвки)
				p2 = pArr[i]; // текущее звено
				ang = Math.atan2(p1.y - p2.y, p1.x - p2.x);
				dx = p1.x - p2.x;
				dy = p1.y - p2.y;
				dist = Math.sqrt(dx * dx + dy * dy);
 
				p2.rotation = ang * 180 / Math.PI;
				if (dist > 10)
				{
					p2.x += (dist-10)*(dx/dist);
					p2.y += (dist-10)*(dy/dist);
				}
			}
		}
 
	}
 
}

Старый 12.04.2014, 22:21
Булат Гиниятов вне форума Посмотреть профиль Отправить личное сообщение для Булат Гиниятов Найти все сообщения от Булат Гиниятов
  № 12  
Ответить с цитированием
Булат Гиниятов

Регистрация: Apr 2014
Сообщений: 18
Цитата:
Сообщение от Булат Гиниятов Посмотреть сообщение
Что-то у меня не получилось, цикл организовать не получается

Добавлено через 5 минут


не поделитесь как это у Вас получилось? Буду благодарен
Спасибо!

Старый 12.04.2014, 22:34
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 13  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Пожалуйста!

Старый 12.04.2014, 22:43
Булат Гиниятов вне форума Посмотреть профиль Отправить личное сообщение для Булат Гиниятов Найти все сообщения от Булат Гиниятов
  № 14  
Ответить с цитированием
Булат Гиниятов

Регистрация: Apr 2014
Сообщений: 18
Цитата:
Сообщение от samana Посмотреть сообщение
Пожалуйста!
Все работает!
Еще раз спасибо

Старый 12.04.2014, 23:40
Булат Гиниятов вне форума Посмотреть профиль Отправить личное сообщение для Булат Гиниятов Найти все сообщения от Булат Гиниятов
  № 15  
Ответить с цитированием
Булат Гиниятов

Регистрация: Apr 2014
Сообщений: 18
Цитата:
Сообщение от samana Посмотреть сообщение
Я просто не переделывал код в вашем файле, а написал с нуля. Мой код в классе, но это не должно вам помешать понять его логику. Там почти всё тоже самое.
Код AS3:
package 
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
 
	/**
	 * ...
	 * @author samana
	 */
	public class Main extends Sprite 
	{
		private var p:Sprite;
		private var pArr:Vector.<Sprite> = new Vector.<Sprite>();
		public function Main():void 
		{
			//создаю части верёвки в виде прямоугольников и заношу их в массив
			for (var i:int = 0; i < 60; i++) 
			{
				p = new Sprite();
				p.graphics.beginFill(0);
				p.graphics.drawRect( -3, -2, 6, 4);
				p.graphics.endFill();
 
				p.x = i * 5;
				p.y = 100;
 
				addChild(p);
				pArr[i] = p;
			}
 
			//при движении мыши двигаю верёвку
			stage.addEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMove);
		}
 
		private function stage_mouseMove(e:MouseEvent):void 
		{
			//сначала выствляем верёвку от первого звена (которое в координатах мыши)
			//до последнего
			pArr[0].x = mouseX;
			pArr[0].y = mouseY;
			for (var i:int = 1; i < pArr.length; i++) 
			{
				var p1:Sprite = pArr[i-1];//предыдущее звено
				var p2:Sprite = pArr[i];//текущее звено
				var ang:Number = Math.atan2(p1.y - p2.y, p1.x - p2.x);
				var dx:Number = p1.x - p2.x;
				var dy:Number = p1.y - p2.y;
				var dist:Number = Math.sqrt(dx * dx + dy * dy);
 
				p2.rotation = ang * 180 / Math.PI;
				if (dist > 10)
				{
					p2.x += (dist-10)*(dx/dist);
					p2.y += (dist-10)*(dy/dist);
				}
			}
			//------------------------- revers
			//перебераем звенья в обратном порядке, от фиксированного конца, до начального звена
			//фиксирую последее звено
			pArr[pArr.length - 1].x = 100;
			pArr[pArr.length - 1].y = 100;
			//цикл начинаю с предпоследнего звена, ведь последнее звено зафиксировано
			for (i=pArr.length-2; i >= 0; i--) 
			{
				p1 = pArr[i+1];//звено следующее (в сторону начала верёвки)
				p2 = pArr[i]; // текущее звено
				ang = Math.atan2(p1.y - p2.y, p1.x - p2.x);
				dx = p1.x - p2.x;
				dy = p1.y - p2.y;
				dist = Math.sqrt(dx * dx + dy * dy);
 
				p2.rotation = ang * 180 / Math.PI;
				if (dist > 10)
				{
					p2.x += (dist-10)*(dx/dist);
					p2.y += (dist-10)*(dy/dist);
				}
			}
		}
 
	}
 
}
Вот что из этого получилось
Вложения
Тип файла: rar Провод с наконечником.rar (1.7 Кб, 43 просмотров)

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

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Неплохо, но почему-то движения дёрганые получились. Кстати, здесь можно прикреплять swf прямо в сообщение (http://www.flasher.ru/forum/showthread.php?t=186313)

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

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,922
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
У вас наконечник, если оттянуть за пределы провода и отпустить, - останется в месте отпускания мыши.
__________________
There is no thing in this world that is not simple.

Старый 13.04.2014, 12:21
Булат Гиниятов вне форума Посмотреть профиль Отправить личное сообщение для Булат Гиниятов Найти все сообщения от Булат Гиниятов
  № 18  
Ответить с цитированием
Булат Гиниятов

Регистрация: Apr 2014
Сообщений: 18
Цитата:
Сообщение от SuriTheAngel Посмотреть сообщение
У вас наконечник, если оттянуть за пределы провода и отпустить, - останется в месте отпускания мыши.
Это можно доделать Главное получилось

Старый 19.04.2014, 14:17
Булат Гиниятов вне форума Посмотреть профиль Отправить личное сообщение для Булат Гиниятов Найти все сообщения от Булат Гиниятов
  № 19  
Ответить с цитированием
Булат Гиниятов

Регистрация: Apr 2014
Сообщений: 18
Цитата:
Сообщение от Булат Гиниятов Посмотреть сообщение
Это можно доделать Главное получилось
Конечный результат
Вложения
Тип файла: swf Project.swf (15.5 Кб, 87 просмотров)

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

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,922
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Цитата:
Сообщение от Булат Гиниятов Посмотреть сообщение
Конечный результат
А теперь у вас при отводе мышки за пределы длины "верёвки" отпускания при отжатии мышки не происходит.

Добавлено через 1 час 53 минуты
Создается впечатление, что вы слушаете отжатие не от stage, а от объекта.
__________________
There is no thing in this world that is not simple.

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

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

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


 


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


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