![]() |
|
||||||||||
|
|||||
|
Добрый день, господа.
Сегодня начал изучать 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 .. но тогда, как реализовать перемещение?) Заранее спасибо. |
|
|||||
|
Banned
[+1 16.05.2006]
[++1 16.05.2006] [+ 1 21.05.06] [++ за хамство] [+1 21.05.2006] Регистрация: 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} );
}
}
}
|
|
|||||
|
Спасибо за класс.
Вопросы есть: 1. Каким образом подключаются классы? (как я понял, классы хранятся в .as) 2. Как мне с ним работать, если рассматривать относительно моей задачи? (Как конкретно обратиться к функции slideTo и откуда? (из акшин кнопки) Спасибо |
|
|||||
|
Banned
[+1 16.05.2006]
[++1 16.05.2006] [+ 1 21.05.06] [++ за хамство] [+1 21.05.2006] Регистрация: Dec 2003
Сообщений: 3,925
|
1. В документацию
2. this.slideTo( ... ) |
|
|||||
|
Цитата:
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();
|
|
|||||
|
Ясно. Спасибо. Пойду копать документацию.
|
|
|||||
|
Banned
[+1 16.05.2006]
[++1 16.05.2006] [+ 1 21.05.06] [++ за хамство] [+1 21.05.2006] Регистрация: 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;
}
}
|
|
|||||
|
Цитата:
---- Работает, извиняюсь. У меня кнопка была button, исправил на мув и все как надо. Спасибо, идею понял. Последний раз редактировалось IBSN; 28.01.2006 в 22:49. |
![]() |
![]() |
Часовой пояс GMT +4, время: 03:15. |
|
|
« Предыдущая тема | Следующая тема » |
|
|