Mayo 09, 2012, 09:59:26 PM Ultima modificación: Mayo 09, 2012, 11:26:28 PM por knd144
Hola camaradas.
Ahora la escuela me tiene ocupado, pero me las arreglé para que en una materia me acepten de trabajo final un videojuego; bueno, en fin.
Lo que ahora quiero hacer es que un objeto busque en las 4 direcciones posibles si hay camino por donde él pueda pasar lo escoja al azar, para ello uso la función "collision_rectangle"; mi script es éste:


var i,direccion;
direccion=0;
i=0;
for(i=0;i<4;i+=1)
{
    direcciones[i]=-1;
}
i=0;
for(i=0;i<4;i+=1)
{
    while(true)
    {
        if(direccion>=360)
        {
            direccion-=360;
        }
        switch(direccion)
        {
            case 0:
                {
                    if(!collision_rectangle(x,y+(sprite_height/2),x+50,y-(sprite_height/2),obj_colision_calles_parent,false,true))
                    {
                        direcciones[i]=0;
                    }
                    break;
                }
            case 90:
                {
                    if(!collision_rectangle(x-(sprite_width/2),y,x+(sprite_width/2),y-50,obj_colision_calles_parent,false,true))
                    {
                        direcciones[i]=90;
                    }
                    break;
                }
            case 180:
                {
                    if(!collision_rectangle(x,y+(sprite_height/2),x-50,y-(sprite_height/2),obj_colision_calles_parent,false,true))
                    {
                        direcciones[i]=180;
                    }
                    break;
                }
                case 270:
                {
                    if(!collision_rectangle(x-(sprite_width/2),y,x+(sprite_width/2),y+50,obj_colision_calles_parent,false,true))
                    {
                        direcciones[i]=270;
                    }
                    break;
                }
        }
        direccion+=90;
        if(direcciones[i]!=-1)
        {
            break;
        }
    }
}
direction=direcciones[floor(random(4))]
speed=3;

Pero ocurre que se buclea el programa.  ???
¿Alguien que me pueda ayudar?  :-[

Saludos Makero knd144:

  Veo unas "incoherencias" en el código y te pregunto para ver si es que no logro entender:   :D


  1*   En la línea once (11) dice:

   while(true)

   En este caso siempre se ejecutará el ciclo "while" ya que siempre "true" es verdadero.  :-[  Esto puede hacer que se cicle eternamente.

   2*   En la línea cuatro (4) comienza un ciclo que termina en la línea siete (7). Dicho ciclo hace cuatro veces la misma operación, darle a la variable "direcciones" el valor de menos uno (-1). La variable "direcciones" no la conozco y no es necesario darle el mismo valor cuatro veces seguidas.  :-[

  Disculpa, más o menos estas incoherencias son las que veo. En el ciclo "while" debes poner una condición de parada que termine realmente.   :-[

  Gracias por la atención prestada y disculpa las molestias ocasionadas.  :D 


Hola, gracias por responder pero...
Pues no se porqué pero cuando copié y pegué el codigo no se copiaron los corchetes del arreglo "direcciones[]"; ahora está corregido, lo que hago es asignarle a cada espacio del arreglo un valor de -1; ésto me sirve para saber, posteriormente, si se le a asignado un valor a esa posición del arreglo comparándolo con que si no es igual a -1.

Luego, lo del while(true) no es un problema, por que si te fijas justo antes de que termine el bloque del while hay un

if(direcciones[i]!=-1)
        {
            break;
        }

Ésto indica que si se cumple tal condición el bucle while se detiene. El uso del while(true) se usa para muchas circunstancias, en éste caso para no tener que poner while(direcciones[0]!=-1 and direcciones[1]!=-1...); también se usa para cuando no se sabe cuándo se va a tener que cerrar el bucle, digamos que se puede cerrar tanto al principio, como en medio o al final, y pues por eso se pone un while(true) y se hace "break" cuando sea necesario. Así que pues ese no es el problema  :-[

Igual gracias por contestar nuevamente   ;)

¿Alguna otra observación?  :'(

Disculpa nuevamente makero knd144:


  Tengo otra observación:   :D

  En la línea trece (13) comienza una instrucción "if" que siempre que la variable "direccion" es mayor o igual que trescientos sesenta (360) le resta esa misma cantidad a la variable.  :-[

  if(direccion>=360)
        {
            direccion-=360;
        }

  Esto no me parece correcto ya que si el valor es noventa (90) le restará trescientos sesenta (360) y el valor será menos doscientos setenta (-270). Me parece que todos los valores que utilizas para la variable "direccion" son mayores o iguales que trescientos sesenta (direccion>=360)  :-[


  Pudiera ser este el problema...  ;)

  Gracias por la atención prestada y disculpa las molestias ocasionadas.  :D


#4 Mayo 10, 2012, 12:15:25 AM Ultima modificación: Mayo 10, 2012, 12:17:47 AM por knd144
¿Molestias? ninguna, de hecho agradezco que sigas respondiendo, pero... emmm, pues esa condición la hice para cuando la variable dirección sea igual o sobrepase 360, por que no quiero almacenar valores como 450, 540, etc, ya que esas no son direcciones que pueda tomar el personaje, por eso la reduzco en caso de que sobrepase (360 sería igual a 0, por eso también pregunto si es igual).
El problema que dices que puede tener pues virtualmente no es posible, ya que si direccion=90, entonces no se cumple la condición de "direccion>=90" ya que 90 no es mayor ni igual a 360 por lo que no se restaría, y a la variable direccion la inicio como 0 y le voy aumentando de 90 en 90. .. ¿o no estoy viendo algo?  :(

Cita de: knd144 en Mayo 10, 2012, 12:15:25 AM
¿Molestias? ninguna, de hecho agradezco que sigas respondiendo, pero... emmm, pues esa condición la hice para cuando la variable dirección sea igual o sobrepase 360, por que no quiero almacenar valores como 450, 540, etc, ya que esas no son direcciones que pueda tomar el personaje, por eso la reduzco en caso de que sobrepase (360 sería igual a 0, por eso también pregunto si es igual).
El problema que dices que puede tener pues virtualmente no es posible, ya que si direccion=90, entonces no se cumple la condición de "direccion>=90" ya que 90 no es mayor ni igual a 360 por lo que no se restaría, y a la variable direccion la inicio como 0 y le voy aumentando de 90 en 90. .. ¿o no estoy viendo algo?  :(

Wooo!!   :o

  ¡Disculpas mil! Tienes razón.  :-[
   ¡No se en que estoy pensando!  :-[

   disculpa, estoy estudiando PHP y hablando con un amigo al mismo tiempo...  :-[

   ¡Un millón de disculpas te pido!   :-[ 

   No veo nada entonces, lo siento...  :( :( :(


Tenés 2 opciones, o los case no se cumplen (porq la dirección no es ninguno de esos valores) o los collision_rectangle no se cumplen. Meté show_message arriba de los collision rectangle y adentro para saber cuál no anda




ferhand no hay problema, gracias por el apoyo.

Texic, tenías razón, las colisiones no se cumplían como yo quería, tenía que poner "true" en el parámetro de "prec" debido a cómo estoy manejando el escenario y los sprites; resulta que todos los objetos están dentro de uno más grande que tiene adentro dibujado los muros y al no usar colisiones precisas siempre estaba colisionando todos los objetos en cualquier dirección; al usar las colisiones precisas ya se consideran los muros dibujados dentro del objeto y no a toda su mask. Ufff  :-[

Gracias a ambos, y a tí ferhand por el tiempo  :D