Foros del Web » Creando para Internet » Flash y Actionscript »

Como hacer que un objeto rebote y vuelva a su posición

Estas en el tema de Como hacer que un objeto rebote y vuelva a su posición en el foro de Flash y Actionscript en Foros del Web. Muy buenos días! tengo un gran problema que no puedo solucionar!! Tengo un objeto (mc) en el escenario que tiene este código: onClipEvent(enterFrame){ if(_root.flecha_mc._x <= ...
  #1 (permalink)  
Antiguo 29/04/2011, 09:18
 
Fecha de Ingreso: abril-2011
Mensajes: 2
Antigüedad: 11 años
Puntos: 0
Pregunta Como hacer que un objeto rebote y vuelva a su posición

Muy buenos días! tengo un gran problema que no puedo solucionar!!
Tengo un objeto (mc) en el escenario que tiene este código:

onClipEvent(enterFrame){
if(_root.flecha_mc._x <= 500){
_root.flecha_mc._x += 5;
}
else if(_root.flecha_mc._x >= 500){
_root.flecha_mc._x -= 5;
_root.flecha_mc._rotation = 180;
}
}

Lo que hace es avanzar de a 5px hasta la posición 500px. Cuando llega al 500 tendría que darse vuelta y retroceder de a 5px hasta llegar a su posición inicial, en la cual volvería a arrancar (como si hiciera un loop).
Esto lo tengo que hacer con Código AS2 y sin usar interpolaciones!!

AYUDAAAAA!!!
  #2 (permalink)  
Antiguo 29/04/2011, 12:09
Avatar de Hugo_Euan  
Fecha de Ingreso: abril-2011
Ubicación: Mérida, Yucatán, México
Mensajes: 193
Antigüedad: 11 años
Puntos: 71
Respuesta: Como hacer que un objeto rebote y vuelva a su posición

Hey que tal jppicun, que pasa con tu código ?
a simple vista lo que veo es que el efecto que buscas no se cumplirá tal cuál lo describes, eso es debido a <= 500 y >= 500 lo que me imagino que hace es un rebote demasiado corto, eso es por los limites que le diste, ademas que también las condiciones se cumplen antes de que termine la otra condición, no sé si me explique bien, por ejemplo
tu objeto lo mueves 5px y se mayor a 500 automáticamente se cumple la otra condición y disminuye 5px es por eso que no avanza mucho.

en fin, para empezar vamos a modificar un poco tu código, y en vez de que la acción la pongas en el movieclip, ponla en el fotograma 1.

para que pueda desplazarse tu objeto:
Código ActionScript:
Ver original
  1. var LimitX1:Number = 0; //Límite Izquierdo
  2. var LimitX2:Number = 400; //Límite Derecho
  3. var Control:Boolean = true; //Control para las condiciones
  4. var Adv:Number = 5; //Cantidad de avance (cuadros)
  5. var MyObject:Object = _root.flecha_mc; //el objeto con el que trabajarás
  6.  
  7. onEnterFrame = function(){
  8.     if((MyObject._x < LimitX2) && !(MyObject._x < (LimitX1-Adv)) && Control){
  9.         MyObject._x += Adv;
  10.     }else{
  11.         Control = false;
  12.         MyObject._x -= Adv;
  13.         if(MyObject._x < LimitX1){
  14.             Control = true;
  15.         }
  16.     }
  17. }

Veamos....
cuando inicia la sentencia EnterFrame valida:
1.- que tu objeto posicion x sea nenor a LimitX2 osea 0;
2.- valida que tu objeto posicion x no sea menor a LimitX2 osea 400;
3.- tambien valida que Control sea verdadero

si las 3 validaciones retornan verdadero

hacemos que tu objeto avance Adv osea 5 cuadros.

vamos al else
En donde asignamos que Control sea Falso
y movemos tu objeto de regreso
también validamos que tu objeto en posicion x sea menor a LimitX1 si es menor asignamos a Control true para que se repita el proceso desde el principio.

Tal vez no te quede muy claro la razon de Control.
Bueno lo que hace practicamente es un inter entre el If y el else...
es palabras mas sencillas, cuando Control es falso no permite al ejecutar los procesos dentro del if hasta que el objeto este en la posicion LimitX1.
y cuando Control es verdadero no permite ejecutar los procesos dentro del else.
así de sencillo, ahora, bien, con respecto a lo de tu rotación pues
puedes hacer lo siguiente:
Código ActionScript:
Ver original
  1. var LimitX1:Number = 0; //Límite Izquierdo
  2. var LimitX2:Number = 400; //Límite Derecho
  3. var Control:Boolean = true; //Control para las condiciones
  4. var Adv:Number = 5; //Cantidad de avance (cuadros)
  5. var RotationSpeed:Number = 5; //Velocidad de rotación
  6. var MyObject:Object = _root.flecha_mc; //el objeto con el que trabajarás
  7.  
  8. onEnterFrame = function(){
  9.     if((MyObject._x < LimitX2) && !(MyObject._x < (LimitX1-Adv)) && Control){
  10.         MyObject._x += Adv;
  11.     }else{
  12.         Control = false;
  13.         MyObject._x -= Adv;
  14.         MyObject._rotation+=RotationSpeed;
  15.         if(MyObject._x < LimitX1){
  16.             Control = true;
  17.         }
  18.     }
  19. }

solo incluimos:

var RotationSpeed:Number = 5; //Velocidad de rotación
MyObject._rotation+=RotationSpeed;


si pruebas esta función te darás cuenta que cuando tu objeto va de regreso a LimitX1 lo hace rotando y se detiene hasta llegar. si quisieras que tu objeto no tenga el efecto de rotacion y solo que simplemente se vea que roto, cambias:

MyObject._rotation+=RotationSpeed; por MyObject._rotation=RotationSpeed; solo le quitamos el signo de mas, pero eso hara que no se vea el efecto.

Muy bieeeenn, vamos bien.. jejej =D
aquí te posteo la ultima de mis opciones, si estas buscando que cuando tu objeto llegue a LimitX2 y regrese rotando pero no consecutivamente, osea que llegue a LimitX2 y rote 180 grados y se detenga antes de llegar a LimitX1

esta es la alternativa
Código ActionScript:
Ver original
  1. var LimitX1:Number = 0; //Límite Izquierdo
  2. var LimitX2:Number = 400; //Límite Derecho
  3. var Control:Boolean = true; //Control para las condiciones
  4. var Adv:Number = 5; //Cantidad de avance (cuadros)
  5. var RotationSpeed:Number = 5; //Velocidad de rotación
  6. var RotationAngle:Number = 180; //Ángulo de rotación
  7. var MyObject:Object = _root.flecha_mc; //el objeto con el que trabajarás
  8.  
  9. onEnterFrame = function(){
  10.     if((MyObject._x < LimitX2) && !(MyObject._x < (LimitX1-Adv)) && Control){
  11.         MyObject._x += Adv;
  12.         if(MyObject._rotation == RotationAngle){
  13.             MyObject._rotation = 0;
  14.         }
  15.     }else{
  16.         Control = false;
  17.         MyObject._x -= Adv;
  18.         if(MyObject._rotation < RotationAngle){
  19.             MyObject._rotation+=RotationSpeed;
  20.         }
  21.         if(MyObject._x < LimitX1){
  22.             Control = true;
  23.         }
  24.     }
  25. }

agregamos una variable mas
var RotationAngle:Number = 180;

y en el if

if(MyObject._rotation == RotationAngle){
MyObject._rotation = 0;
}


esto es para que el siclo de rotación del objeto se vuelva a repetir, en el else se agregó

if(MyObject._rotation < RotationAngle){
MyObject._rotation+=RotationSpeed;
}


esto para que mientras el ángulo del objeto sea menor a RotationAngle osea 180
el objeto rotara con una velocidad de 5 cuadros "RotationSpeed"

Así de sencillo verdad? =D

espero que te sirva y cualquier cosa posteas

SALUDOS Y EXITOO !!!!
  #3 (permalink)  
Antiguo 29/04/2011, 12:43
 
Fecha de Ingreso: noviembre-2010
Mensajes: 94
Antigüedad: 11 años, 6 meses
Puntos: 11
Respuesta: Como hacer que un objeto rebote y vuelva a su posición

Y como sería este fecto para AS3. Hace tiempo que busco un tuto al respecto y no encuentro ninguno.
  #4 (permalink)  
Antiguo 29/04/2011, 16:16
Avatar de Hugo_Euan  
Fecha de Ingreso: abril-2011
Ubicación: Mérida, Yucatán, México
Mensajes: 193
Antigüedad: 11 años
Puntos: 71
Respuesta: Como hacer que un objeto rebote y vuelva a su posición

Para que el efecto te Funcione en ActionScript3 hay que hacerle unos pequeños cambios al Código, para empezar la instanciacion del objeto, El EnterFrame y las propiedades.

veamos.... =D
Código ActionScript:
Ver original
  1. var LimitX1:Number = 0; //Límite Izquierdo
  2. var LimitX2:Number = 400; //Límite Derecho
  3. var Control:Boolean = true; //Control para las condiciones
  4. var Adv:Number = 5; //Cantidad de avance (cuadros)
  5. var RotationSpeed:Number = 5; //Velocidad de rotación
  6. var RotationAngle:Number = 180; //Ángulo de rotación
  7. var Mc:MovieClip = flecha_mc; //Instanciamos el Mc con el objeto con el que trabajarás
  8. var MyObject:Object = {}; // Creamos un Objeto vacio
  9. MyObject.Mclip = Mc; //Instanciamos MyObject.Mclip con el valor de Mc
  10.  
  11. addEventListener(Event.ENTER_FRAME,function(){
  12.     if((MyObject.Mclip.x < LimitX2) && !(MyObject.Mclip.x < (LimitX1-Adv)) && Control){
  13. &#160;       MyObject.Mclip.x += Adv;
  14. &#160;       if(MyObject.Mclip.rotation == RotationAngle){
  15. &#160;           MyObject.Mclip.rotation = 0;
  16. &#160;       }
  17. &#160;   }else{
  18. &#160;       Control = false;
  19. &#160;       MyObject.Mclip.x -= Adv;
  20. &#160;       if(MyObject.Mclip.rotation < RotationAngle){
  21. &#160;           MyObject.Mclip.rotation+=RotationSpeed;
  22. &#160;       }
  23. &#160;       if(MyObject.Mclip.x < LimitX1){
  24. &#160;           Control = true;
  25. &#160;       }
  26. &#160;   }
  27. });

Este código esta hecho en ActionScript 3 y se comporta de la misma manera que el anterior que fué hecho en ActionScript 2.

Creo que no hay nada más que explicar pues la función es igual.

espero haber resolvido tu duda Fletcher2009

No se por que en el codigo salen Numeros extraños asi que lo posteoo aqui de manera normal



var LimitX1:Number = 0; //Límite Izquierdo
var LimitX2:Number = 400; //Límite Derecho
var Control:Boolean = true; //Control para las condiciones
var Adv:Number = 5; //Cantidad de avance (cuadros)
var RotationSpeed:Number = 5; //Velocidad de rotación
var RotationAngle:Number = 180; //Ángulo de rotación
var Mc:MovieClip = flecha_mc; //Instanciamos el Mc con el objeto con el que trabajarás
var MyObject:Object = {}; // Creamos un Objeto vacio
MyObject.Mclip = Mc; //Instanciamos MyObject.Mclip con el valor de Mc

addEventListener(Event.ENTER_FRAME,function(){
if((MyObject.Mclip.x < LimitX2) && !(MyObject.Mclip.x < (LimitX1-Adv)) && Control){
        MyObject.Mclip.x += Adv;
        if(MyObject.Mclip.rotation == RotationAngle){
            MyObject.Mclip.rotation = 0;
        }
    }else{
        Control = false;
        MyObject.Mclip.x -= Adv;
        if(MyObject.Mclip.rotation < RotationAngle){
            MyObject.Mclip.rotation+=RotationSpeed;
        }
        if(MyObject.Mclip.x < LimitX1){
            Control = true;
        }
    }
});




SALUDOS Y EXITOO !!!!

Última edición por Hugo_Euan; 05/05/2011 a las 12:06

Etiquetas: actionscript, enterframe, objeto, onclipevent, actionscript2
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:01.