Noticias

¡Ayuda a la Comunidad GM, haz una donación!

* Sponsor

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Autor Tema: tengo un error al hacer mi enemigo  (Leído 1021 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Bird Sick Games

  • Habitual
  • *
  • Puntos: 45
  • Mensajes: 18
    • Ver Perfil
en: Mayo 23, 2021, 08:21:41 pm
hola, estoy haciendo un videojuego en donde tienes que escapar de un asesino. lo que quiero que haga fue de que lo persiga, eso si lo logre a hacer, hasta logre hacer de que el enemigo apareciera aleatoriamente en la room, pero cuando le hice los sprites de izquierda, derecha, arriba y abajo no funcionaba, programe que si el jugador estaba arriba miraría hacia abajo y la animación iba demasiado rápido, pero no tuve ningún resultado. así que pido ayuda a ustedes, además le hice scripts

ESTO SON LOS EVENTOS DEL ENEMIGO

EVENTOS CREATE DEL ENEMIGO
 
///apareces aleatoriamente
var atorado = true;
    while(atorado){
          x = random(room_width);
          y = random(room_height);
          atorado = place_meeting(x,y , obj_parent_asesino
                                        and obj_bloque
                                        and obj_bloque_vallas
                                        and obj_muro
                                        and obj_candado
                                        and obj_candado_azul
                                        and obj_candado_rojo
                                        and obj_tablas_de_madera
                                        and obj_puerta_roja
                                        and obj_puerta_azul
                                        and obj_puerta_amarillo
                                        and obj_no_colision_perro
                                        and obj_cerca_metalica);
}

///inicializacion

enum eg{
        parado = enemigo_parado,
        corriendo = enemigo_corriendo
}

dir = "abajo";
estado = eg.parado;

EVENTOS STEPS DEL ENEMIGO

///propiedades

//avariables
depth = -y;
vv = 0;
vh = 0;
v = 1;

//direccion
if (vv > 0) dir = "abajo";
else if (vv < 0) dir = "arriba";
else if (vh > 0) dir = "derecha";
else if (vh < 0) dir = "izquierda";

//mirar al jugador
grados = point_direction(x,y, obj_prota.x, obj_prota.y);
if (grados < 45 or grados > 315) dir = "derecha";
else if (grados >= 45 and grados < 135) dir = "arriba";
else if (grados >= 135 and grados < 225) dir = "izquierda";
else if (grados >= 225 and grados <= 315) dir = "abajo";



SCRIPTS PARA ENEMIGO

script de parado
image_speed = 0;
image_index = 0;

script de corriendo
image_speed = 0.1;
if (image_index == 0) image_index++;

switch(dir){
    case "abajo":
        sprite_index = spr_enemigo_sur;
        break;
    case "arriba":
        sprite_index = spr_enemigo_norte;
        break;
    case "izquierda":
        sprite_index = spr_enemigo_oeste;
        break;
    case "derecha":
        sprite_index = spr_enemigo_este  
        break;
}

estaré muy agradecido con ustedes si me ayudan a corregir este error

 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado dixon

Respuesta #1 en: Mayo 23, 2021, 10:19:10 pm
Hola, saludos.  ;)

Al parecer hay un problema con las variables vv y vh, tu código necesita que esas variables cambien de valor para determinar la dirección del enemigo, pero nunca cambiarán su valor porque las estás declarando en el evento step y no en el create.

//avariables
depth = -y;
vv = 0;
vh = 0;
v = 1;

Si Dios quiere; Limpiaré la oficina, puliré el piso y les serviré café a todos, luego, me enseñarán a programar e iré a comprarles más café.
 


Desconectado Bird Sick Games

  • Habitual
  • *
  • Puntos: 45
  • Mensajes: 18
    • Ver Perfil
Respuesta #2 en: Mayo 23, 2021, 10:28:48 pm
hola amigo, ya puse esas variables en el evento create y no se ha arreglado el error    ???

 


Desconectado dixon

Respuesta #3 en: Mayo 23, 2021, 10:43:01 pm
Así como las declarastes en el evento créate, deberás eliminarlas del evento step, pero solo las variables vv y vh.

Si el problema persiste deberás mostrar la otra parte del código de tu enemigo donde se indica el cambio de esas variables.

Aunque es posible que no tengas ese código porque estás esperando que exista una relación automática con el movimiento del player y las variables vv y vh pero eso no sería lo correcto.
En el caso de que quieras relacionar el movimiento del player con las variables vv y vh estas deberían obtener el valor de las variables del sistema vspeed y hspeed respectivamente.

Aunque si el movimiento del enemigo es automático quizás las variables vspeed y hspeed no reflejen movimiento, porque quizás el sistema esté usando solo la variable llamada “speed” y la variable “direction”. De ser hasí deberás establecer la relación entre la velocidad y la dirección para transformarla en valores comprensibles por la vv y vh.

Otro camino más corto sería usar la  “xprevious” y la “yprevious” para indicar la dirección del movimiento.
Tienes que darme más detalles.

Si Dios quiere; Limpiaré la oficina, puliré el piso y les serviré café a todos, luego, me enseñarán a programar e iré a comprarles más café.
 


Desconectado Bird Sick Games

  • Habitual
  • *
  • Puntos: 45
  • Mensajes: 18
    • Ver Perfil
Respuesta #4 en: Mayo 23, 2021, 10:58:11 pm
muchas gracias sobre lo que me dijiste, pero se que no me explique bien, es que quería que el enemigo cambiara de sprite dependiendo del movimiento que estaba el player, si el player esta arriba el enemigo mirara arriba y así con todos los movimientos, además, ya pase los VV y VH al create y las elimine del step

 


Desconectado dixon

Respuesta #5 en: Mayo 23, 2021, 11:09:34 pm
No se preocupe  :-[, más bien me he equivocado yo pero ya creo tener la respuesta.

Ya he comprobado en estos instantes que si existe relación entre las variables: speed, direction, vspeed y hspeed. Lo que significa que para solucionar el problema debes volver al tu código original que se encontraba en el evento step, y solo hacerle la siguiente modificación.

//avariables
depth = -y;
vv = vspeed;
vh = hspeed;
v = 1;

Si Dios quiere; Limpiaré la oficina, puliré el piso y les serviré café a todos, luego, me enseñarán a programar e iré a comprarles más café.
 


Desconectado Bird Sick Games

  • Habitual
  • *
  • Puntos: 45
  • Mensajes: 18
    • Ver Perfil
Respuesta #6 en: Mayo 23, 2021, 11:19:55 pm
hola de nuevo, he hecho lo que usted me dijo y tampoco hubo resultado, siempre me pregunto porque estas cosas me pasan solo a mi  :'(

 


Desconectado dixon

Respuesta #7 en: Mayo 23, 2021, 11:56:21 pm
Bueno, jajaja.
Encontré otros fallos en tu código, en esta zona:
 
//direccion
if (vv > 0) dir = "abajo";
else if (vv < 0) dir = "arriba";
else if (vh > 0) dir = "derecha";
else if (vh < 0) dir = "izquierda";

//mirar al jugador
grados = point_direction(x,y, obj_prota.x, obj_prota.y);
if (grados < 45 or grados > 315) dir = "derecha";
else if (grados >= 45 and grados < 135) dir = "arriba";
else if (grados >= 135 and grados < 225) dir = "izquierda";
else if (grados >= 225 and grados <= 315) dir = "abajo";

1.   El primer grupo que se usa para hallar la dirección “//dirección” queda anulado por el segundo grupo de mirar al jugador “//mirar al jugador”. Ya que ambos están buscando establecer el valor de la variable dir pero siempre se tomará el valor que obtenga el conjunto de “//mirar al jugador”. Por lo tanto el primero conjunto no se usa y debe ser borrado.

Borrar esto:
//direccion
if (vv > 0) dir = "abajo";
else if (vv < 0) dir = "arriba";
else if (vh > 0) dir = "derecha";
else if (vh < 0) dir = "izquierda";

2.   No uses else if, a menos que lo necesites realmente, el “else if” puede ser malinterpretado. Modifica tu código sin usar el else if.

Codigo sin else if
//mirar al jugador
grados = point_direction(x,y, obj_prota.x, obj_prota.y);
if (grados < 45 or grados > 315) dir = "derecha";
if (grados >= 45 and grados < 135) dir = "arriba";
if (grados >= 135 and grados < 225) dir = "izquierda";
if (grados >= 225 and grados <= 315) dir = "abajo";

Aquí te dejo un html5 que usa parte de tu código y funciona bien


Si Dios quiere; Limpiaré la oficina, puliré el piso y les serviré café a todos, luego, me enseñarán a programar e iré a comprarles más café.
 


Desconectado Bird Sick Games

  • Habitual
  • *
  • Puntos: 45
  • Mensajes: 18
    • Ver Perfil
Respuesta #8 en: Mayo 24, 2021, 12:10:00 am
muchas gracias, pero dime donde tiene que ir cada uno, es que me revolví mucho XD

 


Desconectado dixon

Respuesta #9 en: Mayo 24, 2021, 12:17:31 am
El siguiente código es tu código original sin modificación:
///propiedades

//avariables
depth = -y;
vv = 0;
vh = 0;
v = 1;

//direccion
if (vv > 0) dir = "abajo";
else if (vv < 0) dir = "arriba";
else if (vh > 0) dir = "derecha";
else if (vh < 0) dir = "izquierda";

//mirar al jugador
grados = point_direction(x,y, obj_prota.x, obj_prota.y);
if (grados < 45 or grados > 315) dir = "derecha";
else if (grados >= 45 and grados < 135) dir = "arriba";
else if (grados >= 135 and grados < 225) dir = "izquierda";
else if (grados >= 225 and grados <= 315) dir = "abajo";

Recomiendo que lo modifiques de esta manera:
///propiedades

//avariables
depth = -y;
vv = vspeed;
vh = hspeed;
v = 1;

//mirar al jugador
grados = point_direction(x,y, obj_prota.x, obj_prota.y);
if (grados < 45 or grados > 315) dir = "derecha";
if (grados >= 45 and grados < 135) dir = "arriba";
if (grados >= 135 and grados < 225) dir = "izquierda";
if (grados >= 225 and grados <= 315) dir = "abajo";
Sólo has eso, y si el problema persiste deberás explicar con más detalles el problema, por ejemplo:
1.   El enemigo no muestra las imágenes correctas.
2.   El enemigo se queda pegado a las paredes.
3.   El enemigo no se mueve.
4.   El enemigo no muestra imágenes.
5.   El enemigo no quiere seguir al player.
6.   El enemigo se mueve y luego se queda pegado a las paredes.
7.   El enemigo no se mueve en la dirección correcta.


Si Dios quiere; Limpiaré la oficina, puliré el piso y les serviré café a todos, luego, me enseñarán a programar e iré a comprarles más café.
 


Desconectado Bird Sick Games

  • Habitual
  • *
  • Puntos: 45
  • Mensajes: 18
    • Ver Perfil
Respuesta #10 en: Mayo 24, 2021, 12:26:09 am
todo bien, pero lo malo es que solo mira para abajo, no muestra la imagen correcta, cuando el jugador esta huyendo a la derecha, el enemigo sigue mirando abajo, se queda igual y no cambia de la imagen

 


Desconectado dixon

Respuesta #11 en: Mayo 24, 2021, 12:38:01 am
Cuando programé la versión html5 tambien me di cuenta de que las imágenes no cambiaban, es por eso que reemplacé el “else if” por “if” y todo salió bien.

Si Dios quiere; Limpiaré la oficina, puliré el piso y les serviré café a todos, luego, me enseñarán a programar e iré a comprarles más café.
 


Desconectado Bird Sick Games

  • Habitual
  • *
  • Puntos: 45
  • Mensajes: 18
    • Ver Perfil
Respuesta #12 en: Mayo 24, 2021, 12:44:33 am
yo no tengo ningún else y no funciona, pueden ser tres cosas

1. las mascaras de colision y el centrado tienen algo que ver

2. o la acción de step toward point es el responsable de que pase eso

3. los scripts tienen algo que ver también

 


Desconectado dixon

Respuesta #13 en: Mayo 24, 2021, 01:18:12 am
De ser así vamos a desglosar el código hasta que no quede nada de el. Jejeje.
Los datos que tu me has suministrados me indican lo siguiente:
1.   El enemigo se mueve correctamente.
2.   El enemigo sigue al player.
3.   El enemigo no se pega a las paredes.
4.   El enemigo presentó fallas luego de agregarle la función de cambiar sus sprites.
5.   El enemigo presenta la única falla de que no muestra la imagen correcta al seguir al player.
Entonces en base a esos datos que tengo (suministrados por ti y por deducción), puedo concluir que el problema no se halla realmente en el toward point, ni en las máscaras de colición, por tanto nos quedan dos alternativas: Problema en el script o problema con sprites repetidos. El problema con sprites repetidos no creo que sea (a menos que tengas varios sprites repetidos jajajaja,).
Veamos, tienes cuatro sprites:
spr_enemigo_norte;
spr_enemigo_sur;
spr_enemigo_este
spr_enemigo_oeste;

 Bueno, el objetivo es que el enemigo cambie sus sprites dependiendo de donde se encuentre el player, para esto se toma la dirección que tiene el player con respecto al enemigo y se determina la imagen a usar:


Las imágenes por norma general deberán tener el mismo tamaño y el mismo punto central (esto es norma general, no voy a explicar eso. ejeje). Y por ultimo estas imágenes normalmente no requieren tener precisión, por lo tanto hay que desmarcar la casilla de precisión para evitar posibles errores.
Bueno aguimos analizando y nos encontramos con el siguiente script
switch(dir){
    case "abajo":
        sprite_index = spr_enemigo_sur;
        break;
    case "arriba":
        sprite_index = spr_enemigo_norte;
        break;
    case "izquierda":
        sprite_index = spr_enemigo_oeste;
        break;
    case "derecha":
        sprite_index = spr_enemigo_este  
        break;
}

Este script es el responsable de cambiar las imágenes del player y recibe como orden una variable (tipo cadena de texto) llamada dir que hace referencia a la dirección en donde se encuentra el player.
El método empleado puede presentar la siguiente falla:
La falla consiste en que aunque el player está a la derecha, el enemigo sigue mirando hacia abajo porque el player se encuentra dentro del ángulo indicado como “sur.”

Si ese es el caso, repórtalo.
Entonces el código switch anterior, al parecer está tabajando muy bien, según micaso. Pero pueden presentarse fallas si las imágenes son las incorrectas o que el resultado final no sea el que el programador esperaba (caso de la imagen anterior).
Bueno basta de análisis, agrega el siguiente código en un evento draw o dibujo y dime lo que vez:
//Dibujando al player
draw_sprite(sprite_index,image_index,x,y);

//texto
dx=0;
dy=40;
txt="";
ver="txt";

if(ver!="dir"){draw_text(dx,dy,"dir: "+string(dir));dy+=20;if(dy>room_height-20){dy=0;dx+=room_width/2}}

if(ver!="txt"){draw_text(dx,dy,"txt: "+string(txt));dy+=20;if(dy>room_height-20){dy=0;dx+=room_width/2}}
En la pantalla aparecerá la variable dir reflejada y debes indicar si esta cambia correctamente según la posición del player.

Si Dios quiere; Limpiaré la oficina, puliré el piso y les serviré café a todos, luego, me enseñarán a programar e iré a comprarles más café.
 


Desconectado Bird Sick Games

  • Habitual
  • *
  • Puntos: 45
  • Mensajes: 18
    • Ver Perfil
Respuesta #14 en: Mayo 24, 2021, 01:27:27 am
no funciona, por que me pasan estas cosas a mi  :'( ya de que sirve, mejor no te quiero seguir molestando