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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 05.03.2011, 20:53
cr0w312 вне форума Посмотреть профиль Отправить личное сообщение для cr0w312 Найти все сообщения от cr0w312
  № 121  
Ответить с цитированием
cr0w312
 
Аватар для cr0w312

Регистрация: Mar 2009
Адрес: this.x=0;this.y=0;this.z=0
Сообщений: 89
все ясно, спасибо.

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

Регистрация: Apr 2014
Сообщений: 18
Цитата:
Сообщение от MerlinTwi Посмотреть сообщение
В ActionScript 3 нет события onReleaseOutside, но его можно реализовать самостоятельно. Поскольку события mouseDown и mouseUp привязаны к объекту, то узнать о том, что кнопка мышки была отпущена за пределами объекта можно только слушая событие mouseUp глобально (см. предыдущий совет). Единственное, нужно добавить проверку отпустили кнопку мыши над тем же объектом (тогда это будет просто mouseUp) или над другим (тогда это будет onReleaseOutside).
Пример:
Код:
// в этой переменной запоминаем ссылку на объект по которому кликнули
var clicked:DisplayObject;

var circle:Sprite = new Sprite();
circle.graphics.beginFill(0x4080A0);
circle.graphics.drawCircle(50, 50, 25);
addChild(circle);

function mouseDown(evt:MouseEvent):void {
    trace("mouseDown");
    clicked = circle;
}
function mouseUp(evt:MouseEvent):void {
    trace("mouseUp");
}
function mouseUpOutside(evt:MouseEvent):void {
    trace("mouseUpOutside");
}

// обработчик события на клик мышкой по объекту circle
circle.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
// обработчики событий для глобального mouseUp (подробнее см. предыдущий совет)
stage.addEventListener(MouseEvent.MOUSE_UP, captureMouseUp);
stage.addEventListener(MouseEvent.MOUSE_UP, captureMouseUp, true);

function captureMouseUp(evt:MouseEvent):void {
    if (evt.eventPhase == EventPhase.BUBBLING_PHASE) return;
    
    // убедимся, что кликнули по нужному нам объекту
    if (clicked == circle) {
        clicked = null; // очищаем ссылку для следующих кликов
        
        var target:Sprite = evt.target as Sprite;
        // отпустили кнопку над circle
        if (target == circle) {
            mouseUp(evt);
        }else{
            // отпустили кнопку мыши вне circle
            mouseUpOutside(evt);
        }
    }
}
В этом примере мы реализовали аналог событий onPress, onRelease, и onReleaseOutside из AS1 и AS2.
Нажать и отпустить кнопку мыши над кругом (объект circle):
Код:
//output
mouseDown
mouseUp
Нажать кнопку мыши над кругом, а отпустить в другом месте:
Код:
//output
mouseDown
mouseUpOutside
Примечание: вместо того чтобы использовать переменную clicked, можно было бы в обработчике клика мышки mouseDown прописать слушателей на глобальный mouseUp, а в обработчике captureMouseUp удалить их.
хочу сделать такое же, но не получается

Вот класс
Код AS3:
package {
	import flash.display.Sprite;
	import flash.display.MovieClip;
	import flash.events.*;
	public class Provod extends MovieClip {
		public var pArr:Array= new Array();
		public var x1:Number,y1:Number,R1,smotrit;
		public function Provod(Num:int,x1,y1,R1:int,smotrit:int):void {
			//создаю части верёвки и заношу их в массив
			//сам провод
			//наконечник провода
 
			//остальная часть провода
			for (var i:int = 1; i <Num; i++) {var L:MovieClip= new p();	L.x = 0;L.y = i-Num;addChild(L);pArr[i] = L;
			}
			var Z:MovieClip= new z();Z.x = 0;Z.y = -Num;addChild(Z);Z.rotation=R1;pArr[0] = Z;
			//при движении мыши двигаю провод
			pArr[0].addEventListener(MouseEvent.MOUSE_DOWN,fun);
			pArr[0].addEventListener(MouseEvent.MOUSE_UP,funny);
		}
		public function fun(e:Event):void {
			pArr[0].startDrag(false);
			stage.addEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMove);
		}
		public function funny(f:Event):void {
			pArr[0].stopDrag();
			pArr[0].x=pArr[1].x;
			pArr[0].y=pArr[1].y;
			stage.removeEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMove);
		}
		public 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 > 1) {
					p2.x += (dist-1)*(dx/dist);
					p2.y += (dist-1)*(dy/dist);
				}
			}
			//перебераем звенья в обратном порядке, от фиксированного конца, до начального звена
			//фиксирую последее звено
			pArr[pArr.length - 1].x = x1;
			pArr[pArr.length - 1].y = y1;
			//цикл начинаю с предпоследнего звена, ведь последнее звено зафиксировано
			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 > 1) {
					p2.x += (dist-1)*(dx/dist);
					p2.y += (dist-1)*(dy/dist);
				}
			}
		}
	}
}
пробовал переделывать под ваш код, но не получилось, выдает ошибку #1009

не могли бы вы подсказать в чем проблема?

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

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

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


 


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


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