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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Закрытая тема
Старый 28.01.2006, 22:02
IBSN вне форума Посмотреть профиль Отправить личное сообщение для IBSN Посетить домашнюю страницу IBSN Найти все сообщения от IBSN
  № 1  
IBSN

Регистрация: Nov 2002
Адрес: Нарва, Эстония
Сообщений: 14
Отправить сообщение для IBSN с помощью ICQ
По умолчанию Перемещение кнопки

Добрый день, господа.
Сегодня начал изучать AS2.0...
Стоит задача: Реализовать выезд, при нажатие, кнопок в определенную точку.
Я попробовал реализовать:
Код:
var pixelsRight:Number = 200; // Выезд до опр. направо
var pixelsUp:Number = 10; // Выезд до опр. высоты
var maxSpeed:Number = 30; // Скорость

/* Первая кнопка */
Kn1 = knopka1; // Имя кнопки
Kn1.onRelease = function() {
	Kn1.pixX = 1; // Позиция по оси X
	Kn1.pixY = 100; // Позиция по оси Y
	onEnterFrame = function () {
		if (pixelsRight>Kn1.pixX) {
			movTo(Kn1.pixX, Kn1.pixY, Kn1);
			Kn1.pixX += speed(maxSpeed, Kn1.pixX, pixelsRight);
		}
		if (pixelsUp<Kn1.pixY && pixelsRight<Kn1.pixX) {
			movTo(Kn1.pixX, Kn1.pixY, Kn1);
			Kn1.pixY -= speed(maxSpeed, pixelsUp, Kn1.pixY);
		}
	};
};
/* Первая кнопка */

/* Вторая кнопка */
Kn2 = knopka2; // Имя кнопки
Kn2.onRelease = function() {
	Kn2.pixX = 1; // Позиция по оси X
	Kn2.pixY = 200; // Позиция по оси Y
	onEnterFrame = function () {
		if (pixelsRight>Kn2.pixX) {
			movTo(Kn2.pixX, Kn2.pixY, Kn2);
			Kn2.pixX += speed(maxSpeed, Kn2.pixX, pixelsRight);
		}
		if (pixelsUp<Kn2.pixY && pixelsRight<Kn2.pixX) {
			movTo(Kn2.pixX, Kn2.pixY, Kn2);
			Kn2.pixY -= speed(maxSpeed, pixelsUp, Kn2.pixY);
		}
	};
};
/* Вторая кнопка */


/* Функция перемещения */ 
function movTo(px:Number, py:Number, ob:Object) {
	ob._x = px;
	ob._y = py;
}
/* Функция ускорения */
_global.speed = function(sp:Number, a:Number, b:Number) {
	return (sp/((b/a)/2));
};
Вопрос:
1. С одной кнопкой данный код работает замечательно. Если добавляем вторую, то при одновременном нажатие на две, первая прекращает движение. Как выйти из ситуации? Не пойму, что у них общего?
2. Как Вы видите, мой код далеко не элегантен. Хотелось бы узнать, можно ли данную задачу реализовать более элегантно, например избавиться от kn1, kn2 ... (я думаю, что следует в акшин самой кнопки прописывать и юзать, что-то типа this .. но тогда, как реализовать перемещение?)

Заранее спасибо.

Старый 28.01.2006, 22:06
Antares вне форума Посмотреть профиль Найти все сообщения от Antares
  № 2  
Antares
Banned
[+1 16.05.2006]
[++1 16.05.2006]
[+ 1 21.05.06]
[++ за хамство]
[+1 21.05.2006]
 
Аватар для Antares

Регистрация: Dec 2003
Сообщений: 3,925
Берем два класса и проблема решена.
Код:
///////////////////////////////////////////////////////////
//  VisualObject.as
//  Original author: Michael Klishin
///////////////////////////////////////////////////////////

import mx.events.EventDispatcher;

import mx.transitions.Tween;
import mx.transitions.easing.Regular;

/**
 * @date        26.07.2004
 * @author Michael Klishin
 * @version 1.0
 */
class com.novemberain.display.VisualObject extends MovieClip
{
	// ---------------------------------------> Private props
	
	// ---------------------------------------> Public props
	
	/**
	 * For EventDispatcher
	 */
	public var addEventListener : Function;
	/**
	 * For EventDispatcher
	 */
	public var dispatchEvent : Function;

	/**
	 * For EventDispatcher
	 */
	public var removeEventListener : Function;
	
	/**
	 * For EventDispatcher
	 */
	public var dispatchQueue : Function;

	// ---------------------------------------> Constructor

	public function VisualObject ( ) 
	{
		// Initialize object with EventDispatcher
		EventDispatcher.initialize( this );
	}
	
	/**
	 * Initializes object
	 * 
	 * Override in subclasses
	 */
	public function init( ) : Void
	{
		// TODO : Override
	}
	
   
    /**
     * Hides object
     */
    public function hide(): Void
    {
	    this._visible = false;
    }

    /**
     * Moves object into specified coordinates
     * 
     * @param x		x coordinate
     * @param y		y coordinate
     * 
     * @return		Nothing
     */
    public function move( x:Number, y:Number ): Void
    {
	    this._x = x;
	    this._y = y;
    }

    /**
	 * Shows object
     */
    public function show(): Void
    {
	    this._visible = true;
    }

    /**
     * Moves object into specified position with Tween class
     * 
     * @param x				x coordinate
     * @param y				y coordinate
     * @param relative		Are coordinates relative to the current object's coords?
     * @param time			Time of movement
     * @param type			Tween movement type
     * @param callback		Function to execute when motion stops. Pass null to omit this.
     * 
     * @return				Nothing
     */
    public function slideTo(x:Number, y:Number, relative:Boolean, time:Number, type:Object, callback:Function): Void
    {
		// По умолчанию тип Elastic.easeOut
		if( type == undefined || type == null ) 
			type = Regular.easeOut;
		
		// Относительно или нет заданы координаты
		if(relative)
		{
			var xTo:Number = this._x + x;
			var yTo:Number = this._y + y;			
		} else
		{
			var xTo:Number = x;
			var yTo:Number = y;
		}
		
		var xTween:Tween = new Tween(this, '_x', type, this._x, xTo, time, true );
		var yTween:Tween = new Tween(this, '_y', type, this._y, yTo, time, true );
		
		// Callback
		if(callback) 
			xTween.onMotionStopped = callback;
		
		// Поехали?
		xTween.start();
		yTween.start();
    }

	/**
	 * getNextHighestDepth for Flash Player 6
	 * 
	 *   
	 * @return  	Number		Next highest depth
	 */
    public function getNextHighestDepth(): Number
    {
	    // Итератор
	    var key:Object = {};
	    
	    var max:Number = 0;
	    for( key in this )
	    {
		    if( (typeof( this[key] ) == "movieclip" || typeof( this[key] ) == "textfield") && this[key]._parent == this && this[key]._name == key )
		    {
			    if( this[key].getDepth() > max )
				max = this[key].getDepth();
		    }
	    }
	    
	    return max + 1;
    } 
	
  
    // -------------------------------------------------------------------------> Getters / Setters
    

}
От него наследуется
Код:
import ascb.util.Proxy;
import com.novemberain.display.VisualObject;


/**
 * @version 1.0
 * @created 14-08-2004 2:33:17
 */
class com.novemberain.display.InteractiveObject extends VisualObject 
{
	
	public function InteractiveObject( )
	{
		super();
	}
	
	
	// -----------------------------
	
	
	public function onRollOver() :  Void
	{
		if( this.enabled )
		{
			dispatchEvent( {type:"onRollOver", target:this} );			
		}	
	}
	
	public function onRollOut() :  Void
	{
		if( this.enabled )
		{
			dispatchEvent( {type:"onRollOut", target:this} );
		}	
	}
	
	public function onPress() :  Void
	{
		if( this.enabled )
		{
			dispatchEvent( {type:"onPress", target:this} );
		}	
	}
	
	public function onRelease() : Void
	{
		if( this.enabled )
		{
			dispatchEvent( {type:"onRelease", target:this} );
		}		
	}
}
Вопросы?

Старый 28.01.2006, 22:22
IBSN вне форума Посмотреть профиль Отправить личное сообщение для IBSN Посетить домашнюю страницу IBSN Найти все сообщения от IBSN
  № 3  
IBSN

Регистрация: Nov 2002
Адрес: Нарва, Эстония
Сообщений: 14
Отправить сообщение для IBSN с помощью ICQ
Спасибо за класс.
Вопросы есть:
1. Каким образом подключаются классы? (как я понял, классы хранятся в .as)
2. Как мне с ним работать, если рассматривать относительно моей задачи? (Как конкретно обратиться к функции slideTo и откуда? (из акшин кнопки)

Спасибо

Старый 28.01.2006, 22:27
Antares вне форума Посмотреть профиль Найти все сообщения от Antares
  № 4  
Antares
Banned
[+1 16.05.2006]
[++1 16.05.2006]
[+ 1 21.05.06]
[++ за хамство]
[+1 21.05.2006]
 
Аватар для Antares

Регистрация: Dec 2003
Сообщений: 3,925
1. В документацию
2. this.slideTo( ... )

Старый 28.01.2006, 22:29
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 5  
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
Цитата:
1. ...Не пойму, что у них общего?
2. .. можно ли данную задачу реализовать более элегантно,
1. общий у них onEnterFrame, который ты переопределяешь..
2. глянь такой ваоиант:
Код:
import mx.transitions.Tween;
import mx.transitions.easing.*
MovieClip.prototype.knRelease=function(){
	this.onRelease=function(){
		var t=new Tween(this,"_x",Regular.easeOut,this._x,this.pixX,20);
		var mc=this;
		t.onMotionFinished=function(){
			new Tween(mc,"_y",Regular.easeIn,mc._y,mc.pixY,20);
		}
	}
}

knopka1.pixX=300;
knopka1.pixY=20;
knopka2.pixX=400;
knopka2.pixY=200;
knopka1.knRelease();
knopka2.knRelease();

Старый 28.01.2006, 22:30
IBSN вне форума Посмотреть профиль Отправить личное сообщение для IBSN Посетить домашнюю страницу IBSN Найти все сообщения от IBSN
  № 6  
IBSN

Регистрация: Nov 2002
Адрес: Нарва, Эстония
Сообщений: 14
Отправить сообщение для IBSN с помощью ICQ
Ясно. Спасибо. Пойду копать документацию.

Старый 28.01.2006, 22:31
Antares вне форума Посмотреть профиль Найти все сообщения от Antares
  № 7  
Antares
Banned
[+1 16.05.2006]
[++1 16.05.2006]
[+ 1 21.05.06]
[++ за хамство]
[+1 21.05.2006]
 
Аватар для Antares

Регистрация: Dec 2003
Сообщений: 3,925
Да, забыл выложить нужный им Proxy:
Код:
class ascb.util.Proxy {

  public static function create(oTarget:Object, fFunction:Function):Function {

    var aParameters:Array = new Array();
    for(var i:Number = 2; i < arguments.length; i++) {
      aParameters[i - 2] = arguments[i];
    }

    var fProxy:Function = function():Void {
      var aActualParameters:Array = arguments.concat(aParameters);
      aActualParameters.push(arguments.callee);
      fFunction.apply(oTarget, aActualParameters);
    };

    return fProxy;
  }
}

Старый 28.01.2006, 22:46
IBSN вне форума Посмотреть профиль Отправить личное сообщение для IBSN Посетить домашнюю страницу IBSN Найти все сообщения от IBSN
  № 8  
IBSN

Регистрация: Nov 2002
Адрес: Нарва, Эстония
Сообщений: 14
Отправить сообщение для IBSN с помощью ICQ
Цитата:
Сообщение от silin
1. общий у них onEnterFrame, который ты переопределяешь..
2. глянь такой ваоиант:
Код:
import mx.transitions.Tween;
import mx.transitions.easing.*
MovieClip.prototype.knRelease=function(){
	this.onRelease=function(){
		var t=new Tween(this,"_x",Regular.easeOut,this._x,this.pixX,20);
		var mc=this;
		t.onMotionFinished=function(){
			new Tween(mc,"_y",Regular.easeIn,mc._y,mc.pixY,20);
		}
	}
}

knopka1.pixX=300;
knopka1.pixY=20;
knopka2.pixX=400;
knopka2.pixY=200;
knopka1.knRelease();
knopka2.knRelease();
Не работает.


----
Работает, извиняюсь. У меня кнопка была button, исправил на мув и все как надо. Спасибо, идею понял.


Последний раз редактировалось IBSN; 28.01.2006 в 22:49.
Создать новую тему Закрытая тема Часовой пояс GMT +4, время: 03:15.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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