Comunidad de diseño web y desarrollo en internet online

Problemas con movimiento de círculo lateralmente

Citar            
MensajeEscrito el 26 Dic 2011 05:40 pm
Os indico qué he estado revisando y qué me está sucediendo, pues algo en el desarrollo lógico del script que he creado no lo está teniendo en cuenta, pero no consigo dar con qué es.

Utilizo Adobe Flash CS5 y estoy intentando mover un cículo a derecha e izquierda, dándolo unos valores límite a los que puede llegar, de manera que cuando los alcanza o sobrepasa, vuelve en sentido contrario. El script que he utilizado es el siguiente:


var BolaEjex_anterior = Bola_mc.x;
var BolaEjex_actual = Bola_mc.x;

function MovimientoBola (Distx) {
if (Bola_mc.x >= 120) {
BolaEjex_anterior = Bola_mc.x;
Bola_mc.x -= Distx;
BolaEjex_actual = Bola_mc.x;
}
else if (Bola_mc.x <= 10) {
BolaEjex_anterior = Bola_mc.x;
Bola_mc.x += Distx;
BolaEjex_actual = Bola_mc.x;
}
else if (BolaEjex_actual < BolaEjex_anterior) {
BolaEjex_anterior = Bola_mc.x;
Bola_mc.x -= Distx;
BolaEjex_actual = Bola_mc.x;
}
else if (BolaEjex_actual > BolaEjex_anterior) {
BolaEjex_anterior = Bola_mc.x;
Bola_mc.x += Distx;
BolaEjex_actual = Bola_mc.x;
}
else if (BolaEjex_actual == BolaEjex_anterior) {
Bola_mc.x += Distx;
BolaEjex_actual = Bola_mc.x;
}
trace (BolaEjex_anterior);
trace (BolaEjex_actual);
};

MovimientoBola (2);


El script hace que la bola comience a moverse hacia la derecha (sentido positivo de X), pero al alcanzar el primer punto en el que tiene que dar la vuelta (en este caso está puesto para >= que 120), hace bien el cambio de variable (la BolaEjex_anterior pasa a ser los 120 y la actual a 118), pero luego vuelve a ponerme la actual en 120 y la anterior en 118, y así va haciendo un bucle.

¿Podríais ayudarme alguno? Llevo toda la tarde estudiando el script y no doy con lo que es, aunque me da la impresión de que debe ir el problema por los ELSE IF.

Gracias de antemano.

Por Nedlam

13 de clabLevel



 

firefox
Citar            
MensajeEscrito el 26 Dic 2011 09:43 pm
Aparte de los límites usa otra variable que indique la dirección

Código ActionScript :

if(direccion == "derecha"){
bola.x += distancia;
if(bola.x >= limiteDerecha){ direccion="izquierda";}
}else if(direccion == "izquierda"){
bola.x -= distancia;
if(bola.x <= limiteIzquierda){ direccion="derecha";}


Esa es la idea

Por nasho

Claber

908 de clabLevel

1 tutorial

Genero:Masculino  

Web Developer

chrome
Citar            
MensajeEscrito el 27 Dic 2011 03:45 pm
El problema que me estoy encontrando es a la hora de hacer el cambio cuando llega a alguno de los límites (ya sea el izquierdo o el derecho, al primero que llegue, puesto que de ahí no pasa).
El problema es que al tener que hacer el cambio, como todo funciona a través de una variable, ya sea Dirección o Bola_mc.x, no hace bien el cambio, quedándose en el margen del límite que le he puesto y en el punto anterior, alternando constantemente entre ambos. He utilizado tu código y me ha pasado lo mismo.

Para evitar usar variables, lo he puesto a través de funciones:

function MovimientoBola (Distx, LimiteIzquierdo, LimiteDerecho) {
MovimientoIzq (Distx);
function MovimientoIzq (Distx) {
if (Bola_mc.x <= LimiteIzquierdo) {
MovimientoDer (Distx);
}
else {
Bola_mc.x -= Distx;
}
};
function MovimientoDer (Distx) {
if (Bola_mc.x >= LimiteDerecho) {
MovimientoIzq (Distx);
}
else {
Bola_mc.x += Distx;
}
};
};

MovimientoBola (2, 5, 120);

Pero me sigue pasando lo mismo. Es como si al tener que hacer el cambio no ejecutase bien alguno de los IF, haciendo el que tiene que hacer (el cambio ya ejecutado, que lo mandaría de izq a derecha) y el que todavía tenía (que lo mandaría de nuevo de derecha a izquierda).

¿Hay algún orden lógico que se me haya pasado?

Por Nedlam

13 de clabLevel



 

firefox
Citar            
MensajeEscrito el 27 Dic 2011 04:03 pm
Lo he estado intentando con este otro script, y he observado que no "salta" de un condicional a otro. Te lo indico a continuación:

function MovimientoBola (Sentido, Distx, LimIzq, LimDer) {
if (Sentido == "Izquierda") {
if (Bola_mc.x <= LimIzq) {
Sentido == "Derecha";
}
else {
Bola_mc.x -= Distx;
}
}
if (Sentido == "Derecha") {
if (Bola_mc.x >= LimDer) {
Sentido == "Izquierda";
}
else {
Bola_mc.x += Distx;
}
}
trace (Bola_mc.x);
};

MovimientoBola ("Izquierda", 2, 5, 120);


Da la impresión de que cuando llega a la condición de tener que cambiar del primer bloque IF (el que le indica el movimiento hacia la izquierda) hacia el segundo bloque IF (el que le indica el movimiento hacia la derecha) no lo hace. Se queda en el sitio. De hecho, probando este código, llega a 5,45 de posición, después a 3,45 y ya se queda ahí permanentemente (muestra constantemente la posición como 3,45, como si ejecutara el código y no cambiase de posición).
Parece ser que al tener dos IF, el segundo no lo tiene en cuenta, ¿hay algún otro comando para intentar hacer lo mismo que sí lo respete?

Por Nedlam

13 de clabLevel



 

firefox
Citar            
MensajeEscrito el 27 Dic 2011 05:52 pm

Código ActionScript :

function mueveBola (obj, dist, limD, limI, dir = true){
   obj.distancia = dist;
   obj.limiteD = limD;
   obj.limiteI = limI;
   obj.direccion = dir;
   obj.addEventListener(Event.ENTER_FRAME, mover);
}
function mover(e:Event){
   var obj:Object = e.currentTarget;
   if(obj.direccion){
      obj.x += obj.distancia;
      if(obj.x >= obj.limiteI){
         obj.direccion = false;
      }
   }else{
      obj.x -= obj.distancia;
      if(obj.x <= obj.limiteD){
         obj.direccion = true;
      }
   }
}
mueveBola(mc, 20, 20, stage.stageWidth - mc.width - 20);

Por nasho

Claber

908 de clabLevel

1 tutorial

Genero:Masculino  

Web Developer

chrome
Citar            
MensajeEscrito el 27 Dic 2011 06:43 pm
Con éso consigo que la bola se desplace un espacio hacia la derecha y otro después hacia la izquierda (el mismo efecto que tenía cuando te decía que no me reconoce el IF y hace como que retrocede pero de nuevo va hacia adelante).
El problema es ése, que cada vez que intento cambiar la dirección de alguna manera, al volver al inicio de la secuencia, está indicado que tiene que ir hacia un sentido, así que aunque le cambies lo que sea y vaya en sentido contrario, sólo lo hace una vez (la vez que cambia). Al retomar la secuencia, lo primero con lo que se encuentra es que tiene que volver a ir en el sentido original y éso es lo que hace. Por éso se queda alternando entre dos posiciones.
Es lo que no sé cómo se podría arreglar.

Por Nedlam

13 de clabLevel



 

firefox
Citar            
MensajeEscrito el 27 Dic 2011 08:26 pm
Entonces explícate bien que quieres

El código que te puse... sin añadirle ni quitarle nada, hace que el mc comience a desplazarse hacia la derecha, encuentra el límite de la izquierda y cambia de dirección... se desplaza hacia la izquierda, llega al límite y cambia de dirección...

Qué quieres? Que rebote y se quede parado en el principio?... Que esté rebotando siempre? (que eso hace)... Que esté rebotando y puedas cambiar los valores?....

Qué quieres?

Por nasho

Claber

908 de clabLevel

1 tutorial

Genero:Masculino  

Web Developer

chrome
Citar            
MensajeEscrito el 27 Dic 2011 09:33 pm
Yo lo que quería era dar unas posiciones iniciales al círculo y un movimiento inicial. Entonces, el círculo solo comienza a ir en dicha dirección y cuando llegase a un límite que se le indica, comienza a ir en sentido contrario.
Así sigue, hasta que alcanza el límite en dicha dirección, entonces, vuelve a ir al sentido original... y así continuamente.

Mi problema es que si comienza a ir hacia la derecha, al llegar al punto límite derecho y tener que hacer el cambio, hace un primer movimiento de retroceso (hacia la izquierda), pero luego vuelve a ir hacia la derecha otra vez (2º movimiento). Como vuelve a llegar al límite, vuelve a ir hacia la izquierda (3er movimiento) y entonces, vuelve a hacer el movimiento hacia la derecha (4º movimiento), así contínuamente.

Creo que el problema está en que al principio del script se le dice (de una manera u otra), que vaya hacia la derecha, con lo cual, cuando alcanza el punto de cambio, invierte su sentido hacia la izquierda (que ocurriría al final de toda la secuencia lógica de la función), pero como vuelve al principio a ejecutarlo todo, se vuelve a encontrar con que tiene que ir hacia la izquierda, con lo cual vuelve a hacer ese movimiento hacia la izquierda (que, de nuevo, lo lleva al límite y lo obliga a retroceder, etc.).

Por éso creo que se queda permanentemente alternando en el punto de cambio hacia adelante y hacia atrás, pero no sé cómo se puede solventar éso.

Por Nedlam

13 de clabLevel



 

firefox
Citar            
MensajeEscrito el 27 Dic 2011 11:10 pm
Probaste el código que puse?

Sin modificar ningún valor (excepto el nombre del objeto, yo lo nombre como "mc")
Olvídate por un momento de todo el código que has generado y utiliza el mio... hazlo en un nuevo archivo

Por nasho

Claber

908 de clabLevel

1 tutorial

Genero:Masculino  

Web Developer

chrome
Citar            
MensajeEscrito el 29 Dic 2011 03:15 pm
Lo mismo que me pasa en el código que yo puse. Comienza yendo hacia la derecha y cuando tiene que cambiar de sentido, se queda alternando entre la posición del límite máximo a la derecha y la inmediatamente antes (es como si cambiase de sentido en cada punto: va hacia la derecha, cambia de sentido, comienza a moverse hacia la izquierda, vuelve a cambiar de sentido, va hacia la derecha otra vez una posición y vuelve a ir hacia la izquierda, así contínuamente).
El problema que le veo es que hay que definir de la manera que sea, al principio, el sentido de movimiento, y cuando tiene que hacer el cambio, lo ejecuta, cambiando al sentido opuesto, pero luego vuelve a encontrarse con ese primer código que le dice el sentido de movimiento y vuelve a ir hacia el sentido original... creo que por éso se queda clavado en esa alternancia de izq - der, pero no sé cómo solventarlo.

Por Nedlam

13 de clabLevel



 

firefox
Citar            
MensajeEscrito el 29 Dic 2011 06:11 pm
Bueno según lo que habías dicho fue con lo que te quise ayudar...

Nedlam escribió:

Utilizo Adobe Flash CS5 y estoy intentando mover un cículo a derecha e izquierda, dándolo unos valores límite a los que puede llegar, de manera que cuando los alcanza o sobrepasa, vuelve en sentido contrario.


Ésto NO es lo que quieres verdad



Esa animación es el código que había publicado...

Alguien más que le ayude, yo no le entendí lo siento.

Por nasho

Claber

908 de clabLevel

1 tutorial

Genero:Masculino  

Web Developer

chrome
Citar            
MensajeEscrito el 30 Dic 2011 03:42 pm
Sí, éso es lo que quería, pero cuando pongo tu código, se me queda atascado en el primer cambio de sentido.

Por Nedlam

13 de clabLevel



 

firefox
Citar            
MensajeEscrito el 30 Dic 2011 06:45 pm

Código ActionScript :

function mueveBola (obj, dist, limD, limI, dir = true){
   obj.distancia = dist;
   obj.limiteD = limD;
   obj.limiteI = limI;
   obj.direccion = dir;
   obj.addEventListener(Event.ENTER_FRAME, mover);
}
function mover(e:Event){
   var obj:Object = e.currentTarget;
   if(obj.direccion){
      obj.x += obj.distancia;
      if(obj.x >= obj.limiteI){
         obj.direccion = false;
      }
   }else{
      obj.x -= obj.distancia;
      if(obj.x <= obj.limiteD){
         obj.direccion = true;
      }
   }
}
mueveBola(mc, 20, 20, stage.stageWidth - mc.width - 20);


mueveBola(instancia_del_MovieClip_que_se_anima, velocidad_distancia_según_fps, límite_izquierdo, límite_derecho);

Checa que tu archivo sea de AS3, si sigue el error... vuelve a instalar flash

Por nasho

Claber

908 de clabLevel

1 tutorial

Genero:Masculino  

Web Developer

chrome
Citar            
MensajeEscrito el 30 Dic 2011 06:48 pm
Me falto la dirección que es opcional, en caso de no ponerla se mueve a la derecha...

mueveBola(mc, 20, 20, stage.stageWidth - mc.width - 20, false);

al final si pones false saldría en primera instancia hacia la izquierda... claro el mc no debe estar cerca o junto al borde izquierdo.

Por nasho

Claber

908 de clabLevel

1 tutorial

Genero:Masculino  

Web Developer

chrome

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.