ActionScript - Ayuda con este script AS

 
Vista:

Ayuda con este script AS

Publicado por Vbx (1 intervención) el 16/06/2007 17:45:31
Buenas a todos.

Os suplico ayuda urgente con un script en AS. Veréis tengo un menú vertical que se mueve hacia a arriba o hacia abajo según la posición del ratón (típio). Me gustó mucho el script (no es mío) y lo he utilizado algunas veces en algunos trabajos. Mi problema ha sido cuando he intentado hacer que cuando llegue al límite inferior o superior se pare, en lugar de rebotar e ir hacia el lado contrario.

Me explico; supongamos que tengo un espacio vertical de 400 px., cuando el primer boton del movie clip que contiene los botones del menú llega al límite superior (coord. Y con valor 10) debe de pararse, y cuando el último botón llega al límite inferior (coord. Y con valor 390) también debería de pararse. El problema es que este script está pensado para que cuando se llega a un límite (sea superior o inferior) automáticamente "rebote" y continúe en el sentido contrario.

Os pongo el script:

En el primer frame de la película:
[code]
var bxi = 0;
//Holds current speed of scrolling menu
var stageH = Stage.height;
var midStage = mouseBuffer=stageH/2;
/* midStage holds the pixels located in the middle
of the stage */
/* Declare a mouse listener object, have onMouseMove event handler point to the
directMenu function and then add listener via addListener(...) */
mouseListener = new Object();
mouseListener.onMouseMove = directMenu;
Mouse.addListener(mouseListener);
//Declare and define the directMenu function
function directMenu() {
/* mouseBuffer stores the y coordinate of the mouse point from the last
mouse move event. Then on the next mouse move the following code checks
the current y coordinate of the mouse pointer with the one previously
stored in the mouseBuffer and takes appropriate actions */
if (mouseBuffer>_ymouse) {
/* If mouseBuffer is greater that means that you moved up so move
so move menu down by adding to bxi. If the ymouse is less than the
the middle of the stage increase scrolling speed. */
if (_ymouse<midStage) {
bxi = bxi+0.09;
} else {
bxi = bxi+0.06;
}
} else if (mouseBuffer<_ymouse) {
if (_ymouse>midStage) {
bxi = bxi-0.09;
} else {
bxi = bxi-0.06;
}
}
mouseBuffer = _ymouse;
}
[/code]

Y como evento "enterFrame" dentro del movie clip que contiene el menú en si:
[code]
onClipEvent (enterFrame) {
//Posicion Y actual
ty = this._y;
//Tamaño vertical del menu
tw = this._height;
//Pregunta si la suma de Y actual y el tamaño vertical son mayor o igual
if (ty+tw>=_root.stageH+tw/6.1) {
///trace("toco arriba");
_root.bxi = -(0.5);
} else if (ty<=-(tw/5.5)) {
//trace("toco abajo");
_root.bxi = +0.5;
}
this._y = this._y+_root.bxi;
}
[/code]

Este es el código. Ahora mismo lo que hace, como he dicho, es rebotar cuando llega al límite superior o inferior.

[b]Necesito que al llegar a dicho límite (el cual es variable porque el menú es desplegable) se pare, y al mover el ratón hacia la dirección contraria vuelva a moverse hasta llegar a otro límite de nuevo.[/b]

Espero haberme explicado.

Os doy mis más sinceras GRACIAS por adelantado.

Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Solución para detener el menú en los límites superior e inferior

Publicado por Alejandro (369 intervenciones) el 23/06/2023 17:17:50
Para lograr que el menú se detenga en los límites superior e inferior en lugar de rebotar, puedes modificar el código existente. En lugar de cambiar la dirección de desplazamiento cuando se alcanzan los límites, puedes hacer que el menú se detenga y solo se mueva en la dirección opuesta cuando se detecte movimiento en esa dirección.

Aquí tienes una posible solución:

En el primer frame de la película:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
var bxi:Number = 0;
var stageH:Number = Stage.height;
var midStage:Number = stageH / 2;
var isMoving:Boolean = false;
 
mouseListener = new Object();
mouseListener.onMouseMove = directMenu;
Mouse.addListener(mouseListener);
 
function directMenu():Void {
    if (mouseBuffer > _ymouse) {
        if (_ymouse < midStage) {
            bxi = Math.abs(bxi) * -1; // Cambia la dirección solo si estaba en movimiento hacia abajo
            isMoving = true;
        } else if (!isMoving) {
            bxi = Math.abs(bxi); // Restaura la dirección original si no había movimiento previo
            isMoving = true;
        }
    } else if (mouseBuffer < _ymouse) {
        if (_ymouse > midStage) {
            bxi = Math.abs(bxi); // Cambia la dirección solo si estaba en movimiento hacia arriba
            isMoving = true;
        } else if (!isMoving) {
            bxi = Math.abs(bxi) * -1; // Restaura la dirección original si no había movimiento previo
            isMoving = true;
        }
    }
    mouseBuffer = _ymouse;
}

En el evento "enterFrame" dentro del movie clip que contiene el menú:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
onClipEvent(enterFrame) {
    var ty:Number = this._y;
    var tw:Number = this._height;
 
    if (ty >= _root.stageH - tw / 6.1) {
        this._y = _root.stageH - tw / 6.1;
        isMoving = false; // Detiene el movimiento en el límite inferior
    } else if (ty <= -(tw / 5.5)) {
        this._y = -(tw / 5.5);
        isMoving = false; // Detiene el movimiento en el límite superior
    } else {
        this._y += _root.bxi;
    }
}

En esta solución, hemos agregado una variable booleana `isMoving` para rastrear si el menú está en movimiento o detenido. En la función `directMenu()`, comprobamos si el menú está en movimiento antes de cambiar la dirección en función de la posición del ratón. Si el menú ya está en movimiento, no cambiamos la dirección, sino que seguimos en la dirección actual hasta alcanzar un límite. Si el menú está detenido, cambiamos la dirección según la posición del ratón.

En el evento "enterFrame" del movie clip que contiene el menú, hemos agregado una condición para detener el movimiento cuando se alcanzan los límites superior e inferior. Si el menú está en uno de esos límites, simplemente establecemos la posición del menú en el límite correspondiente y establecemos `isMoving` en `false` para detener el movimiento.

Espero que esta solución te ayude a lograr el comportamiento deseado en tu menú vertical.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar