sugerencias para divgo del pesado de hokuto

Started by hokuto40, April 10, 2019, 09:36:30 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

hokuto40

Seguimos con mas sugerencias.

Cuando un enemigo te ataca se suele usar la tecnica del parpadeo y mientras estas parpadeando tu personaje es invensible por un corto periodo de tiempo y no se le puede quitar toda la vida de golpe.

Pero esto es un poco complicado de hacer en el lenguaje div,por eso propongo una serie de funciones que te ayuden en esto.

parpadeo(tiempo)
al_finalizar_parpadeo()
esta_parpadeando()


El parpadeo durara el tiempo establecido en la funcion y luego dejara de parpadear,la funcion esta_parpadeando() es para comprobar si esta parpadeando y decirle que no te pueden quitar vida en ese estado.

La funcion al_finalizar_parpadeo() es para decirle que pueden quitarte vida otra vez,esto es solo un ejemplo,se puede usar para muchas cosas.

if(colisiona con enemigo)
te quita vida
parpadear(3 segundos)
end
if(esta_parpadeando())
invensible
end
if(al_finalizar_parpadeo())
deja de ser invensible
end 

hokuto40

#16
Otra sugerencia.

Me gustaria el poder aumentar o disminuir la mascara de colision y tambien el poder visualizar la mascara,para verla cuando ejecuto el juego.

tamaño_mascara = 100 normal,menos de 100 disminuir y mas de 100 aumentar
visualizar_mascara = true o false //con esto pueder ver el tamaño puesto


Que yo sepa la mascara en el lenguaje div ocupa todo el sprite,y pienso que seria util hacer esto.En un juego de naves es crucial,si no tendria que crear otro objeto que hiciera de mascara.

AmakaSt

Quote from: hokuto40 on April 15, 2019, 09:20:19 AM
Hola amakast.

Lo de friction es como la friccion,es una fuerza invisible que se le aplica al objeto para que se vaya frenando poco a poco y no de golpe.Ejemplo lo tienes en el mario,que no se para de golpe.

Lo de la barra de vida pues esta muy bien texture_in_map() pero he visto mucho calculo hay y ademas hay que crear un proceso aparte.

Yo me refiero a esto.

process nave()
private vida = 100;
begin
   graph = 1;
   x = 100;
   y = 100;
   drawGraphic(grafico=2,x,y,,angle,punto de centrado,sizeX=vida,sizeY,alpha)
    drawGraphic(grafico=2,x,y,,angle,punto de centrado,sizeX=vida,sizeY,alpha)
   loop
      vida--;
      frame;
   end
end

Con esto podemos tener muchos graficos en un solo proceso y es mucho mas sencillo de usar que el tuyo.

Lo del wait() pues poner frame(300) no ralentiza el juego o lo para hasta que termina.No es mejor tener una funcion propia para esto como si fuera un contador interno que tu activas cuando quieres.

Lo de drawGraphic() se parece bastante al xdraw() de DivGO: xdraw(fichero, gráfico, x, y, size, angle, alpha, región)

Frame() no ralentiza el juego, es necesario que todos los procesos lo tengan para que estos dibujen en pantalla y no se mueran. Hay varios ejemplos que usa frame() para generar un parpadeo de imágenes, por ejemplo.

Quote from: hokuto40 on April 15, 2019, 09:36:42 AM
Otra sugerencia.

Me gustaria el poder aumentar o disminuir la mascara de colision y tambien el poder visualizar la mascara,para verla cuando ejecuto el juego.

tamaño_mascara = 100 normal,menos de 100 disminuir y mas de 100 aumentar
visualizar_mascara = true o false //con esto pueder ver el tamaño puesto


Que yo sepa la mascara en el lenguaje div ocupa todo el sprite,y pienso que seria util hacer esto.En un juego de naves es crucial,si no tendria que crear otro objeto que hiciera de mascara.

Existen 3 funciones para colisionar procesos:
collision() > pixel perfect (no necesitas mascaras con esta función)
collision_box() > no es pixel perfect, colisiona con todo el tamaño del gráfico y es más optimo que collision()
collision_circle() > tamaño del gráfico en circulo, sin esquinas y es más optimo que collision()

Un saludo.  :)

hokuto40

Puede que xdraw() me sirva para lo que quiero,pero de momento no puedo hacer pruebas por el problema que ya sabes.

En cuanta a las colisiones pues no me sirve,porque si yo quiero reducir el campo de colision de mi nave,para que sea un circulo pequeño en el centro donde sea la colision,habria que crear algo para poder reducir ese campo o mascara.

Pero si no se puede pues habra que conformarse con crear otro proceso con un grafico pequeño.

hokuto40

Mas sugerencias.

Si se quiere conseguir una buena animacion no queda mas remedio que trabajar con arrays,pero esto hace que se llene de muchos numeros y si hay muchas animaciones puede ser una locura.

Se me ha ocurrido el crear una funcion para esto.

animacion(fichero,grafico inicial,grafico final,velocidad)


Aqui tenemos la funcion con el fichero,el grafico donde quieres que comience,el grafico donde finaliza y la velocidad de animacion.

Claro esta que para hacer bien esto habria que meter cada animacion en su fpg correspondiente,es decir...Si tienes el personaje parado con sus animacion ira en un fpg y si tienes el personaje con movimiento en otro fpg.

hokuto40

#20
Otra sugerencia,pero esta es una flipada mia que puede no ser muy sensata pero te la digo igualmente.

Esta claro que no vas a crear un editor de escenarios para colocar mis objetos y crear un buen escenario,entonces lo tengo que crear yo y no tengo ni idea de como se hace.

Se me ha ocurrido unas funcionalidades que faciliten esta tarea.

crear_editor(proceso,guardar,camara)
activar_editor = true o false
rejilla(tamaño de cuadricula,tamaño de cuadricula)


La variable "activar_editor" es para decirle al programa que funcione como editor,la funcion rejilla(32,32) es para decirle el tamaño de cada cuadricula de la pantalla donde colocaremos los objetos,ya sea el suelo o la pared o un enemigo.

Esta rejilla sirve para que no se pongan encima un objeto de otro,y la funcion crea_editor(proceso,guardar,camara) tiene el proceso que vamos a utilizar para ir colocandolo en el nivel,luego pondremos en guardar a true para que guarde el contenido creado cuando cierres la aplicacion y el parametro camara = true es para activar la camara.

La camara estara configurada para mover con los cursores de teclado y el objeto lo moveremos con el raton y si dejamos pulsado el boton izquierdo se ira colocando continuamente mientras nos desplazamos con el raton.

Si queremos crear mas objetos y seleccionarlos utilizaremos otra variable para que se activa el boton de seleccion que sera la rueda del raton.

seleccion_objeto = true


Por lo que si tenemos muchos objetos se podran seleccionar con la rueda del raton y quedaria de esta forma.

crear_editor(proceso=type objeto,guardar=true,camara=true)
crear_editor(proceso=type objeto2,guardar=true,camara=true)
crear_editor(proceso=type objeto3,guardar=true,camara=true)
activar_editor = true
rejilla(32,32)
seleccion_objeto = true


Cuando queramos volver al modo normal para jugar a nuestro nivel creado pues desactivamos el modo editor.

activar_editor = false


Se que esto es una flipada mia pero hay esta por si sirve para dar alguna idea y facilitar el diseño del editor casero.


hokuto40

#21
Sigamos con esto.

Ahora una coleccion de funciones y variables para el movimiento.

Hspeed;
Vspeed;
advancePoint(x,y,velocidad,tipo,rotacion);
advanceSinCos(tipo,velocidad,angulo);


Hspeed y Vspeed es para darle al objeto un movimiento en vertical y horizontal,esto es util para cosas simples pero se puede utilizar para juegos de plataformas y cuando te hable de las sugerencias sobre plataformas estas seran muy utiles para esto.


advancePoint(x,y,velocidad,tipo,rotacion) esta te la explique pero te la explico otra vez,el objeto se desplaza a la posicion x e y, y con su velocidad,el tipo seria si quieres que sea un desplazamiento en linea recto o circular y la rotacion es para decirle si quieres que el sprite rote segun la direccion que tenga o no.

advanceSinCos(tipo,velocidad,angulo),esta funcion es como si utilizas las funciones sin() y cos() juntas,con esta dos funciones se consiguen unos movimientos interesantes pero hay que meter mucho codigo y calculos y es un rollo.El tipo es para decirle si quieres que el movimiento sea en vertical,horizontal o en circulo,luego la velocidad y el angulo es para decirle el tamaño del recorrido,como recorrer un circulo pequeño o grande. 

hokuto40

Otra de movimiento sacada de la gamelibzero de javascripts de erkozone.

var p = new path();
    p.add(100,100);
    p.add(200, 100);
    p.add(300, 100);
    p.add(400, 100);
    p.add(924, 100);
    p.add(924, 500);
    p.add(100, 500);
    p.setPoint(0);
    p.setVelocity(5);
    p.rotation = true;
    p.smooth = 0.1;

p.move(tipo de movimento)


Este es un comportamiento de movimiento automatico donde primiero le pones las distintas coordenadas que tiene que recorrer y luego tienes para decirle en que punto empieza,su velocidad,si el sprite rota o no segun su direccion,la suavidad del movimeiento.

Y por ultimo temos la funcion move para decirle que empiece a moverse con una constante predefinida.

FORWARD
REVERSE
FORWARD_LOOP
REVERSE_LOOP


Ejemplo,p.move(FORWARD),si quieres saber mas preguntale a erkozone.

hokuto40

#23
Vamos con mi sugerencia favorita.

Los divlike no tienen ningun sistema para el manejo de los niveles y por lo que veo todo el mundo suele usar el switch() para manejar todos los objetos y crear multiples niveles,pero cuando se trata de un juego muy grande se complica bastante el tema.

Ademas de que se te puede quedar por hay algun procesos vivo y ya ves los problemas que te puede causar.

Yo propongo crear un proceso especial para esto,con algunas funciones que te ayuden en el manejo de los niveles.

process_scene nivel1()
begin
      graph = 1;//grafico del fondo
      x = 300; y = 200;
      jugador();
      enemigo();
      enemigo2();
      balablabla();
      loop
         if(ya no hay enemigos en pantalla)
         pasar_nivel(type nivel2);//funcion para pasar de nivel
         end
   
         if(el jugador muere)
         reiniciar_nivel();//funcion para reiniciar nivel
         end
         frame;
      end
end

process_scene nivel2()
begin
      graph = 1;//grafico del fondo
      x = 300; y = 200;
      jugador();
      enemigo();
      enemigo2();
      balablabla();
      loop
         if(ya no hay enemigos en pantalla)
         pasar_nivel(type nivel3);//funcion para pasar de nivel
         end
   
         if(el jugador muere)
         reiniciar_nivel();//funcion para reiniciar nivel
         end
         frame;
      end
end


Tenemos el proceso especial process_scene() que es para el manejo de niveles,este tiene todas la propiedades del proceso normal y ademas sirve para el manejo del nivel.

Es decir,esto es un contenedor donde meter todos los objetos del nivel y cuando pasamos de nivel con la funcion pasar_nivel(id) se elimina automaticamente todos los objetos que hay en el para que al pasar al siguiente nivel este todo limpio y solo con los objetos del nivel 2.

Ademas tambien eliminara automaticamente los textos y los recursos que haya en la memoria.La funcion reiniciar_nivel() hace lo mismo que pasar_nivel(id) pero en vez de pasar al nivel siguiente volvera a mostrar el nivel donde esta con todo limpito para mostrar lo del nivel actual.

Pongo un videotutorial de gamemaker donde se explica como se manejan los niveles en este engine y con esto podras entender mejor mi sugerencia.
https://www.youtube.com/watch?v=BaTGBtdKLBU

Hay que ver entero el video sino no sirve. :)

hokuto40

Seguimos con mas sugerencias y tranquilo que mañana ya te digo las ultimas. ;D

Ahora vamos con una coleccion de variables y funciones para el plataformeo,en los divlike no hay nada para ayudarte ha realizar un juego de plataformas,por eso propongo introducir alguna ayudita.

gravity = 0 a 100 o mas
gravity_direction = 270//en angulos
solid = true o false
place_free(x,y)
move_contact_solid(direccion,velocidad)


Gravity es para poner una gravedad al juego y gravity_direction es para decirle el angulo que afecta la fuerza de la gravedad,solid es para decirle que un objeto sea solido,esto seria sobre todo para el suelo,paredes,techo y con esto no se podra atravesar ni por arriba,abajo y los lados.

Place_free(x,y) es para comprobar cada pixel si no hay ningun objeto solido y move_contact_solid(direccion,velocidad) es para solucionar los errores que tiene el sprite al colisionar con el suelo y que quede pegado a el y no se quede por encima o enterrado un poco,la direccion seria la de gravity_direction y la velocidad la de la gravedad.

Tal vez no me he explicado bien o sea complicado de entender,por eso dejo un tutorial de gamemaker donde se explica detalladamente como hacer un pequeño juego de plataformas usando todo esto que he dicho y mas cosas.
https://www.youtube.com/watch?v=iTH3Z9ta69g

Hay que verlo entero,es muy interesante y da muchas ideas. 8)

hokuto40

Vamos con las dos ultimas sugerencias,por ahora.


rebote(fuerza=0 a 10,direccion=angulos,velocidad);


Esta funsion sirve para hacer que un objeto rebote al colisionar con otro ya sea solido o no.

La direccion seria en angulo,la velocidad no hace falta explicarlo y la fuerza seria el impulso que tendria la pelota,ejemplo.

Si pongo 10 en fuerza que es el maximo,la pelota rebotaria por toda la pantalla(izquierda,derecha,arriba,abajo),esto seria ideal para un juego de arkanoid.

Si pongo la fuerza a 5,la pelota rebotaria por los lados y abajo pero no llegaria arriba,solo llegaria a la mitad porque no tiene suficiente impulso,esto seria ideal para un juego como el pang.

hokuto40

Y ahora el ultimo.


mover_hacia_objeto(objeto,velocidad,distancia,solido);


Esta es una funcion de inteligencia articial o algo parecido,sirve para que un objeto te persiga y pueda esquivar.

El parametro objeto es para colocar el objeto que quieres que persiga(type jugador),la velocida no hace falta explicarla,la distancia seria la que hay que tener para que empiece a persiguirte,ejemplo.

Si pones 100 en distancia el objeto empezara a perseguirte cuando su distancia sea igual o menor que 100,si es mayor no te persigue.

El ultimo parametro solid es para decirle si quieres que se pare al colisionar con un objeto solido o si quieres que lo rodee o busque una salida o lo esquive para seguir persiguiendote,True se para,false esquiva.

hokuto40

Voy a poner otro sugerencia,esta la iba a dejar solo en el foro de gemix pero creo que es mejor compartirlo en todos los sitios por igual.

El mapa de durezas ya dio todo lo que tenia que dar por eso hay que buscar una alternativa y la mejor para mi es el editor mapeditor,hay que hacer compatible divgo con este editor para crear tus niveles y aplicar una forma de usarlo como pilasengine.

Dejo aqui el enlace al editor de niveles.
https://www.mapeditor.org/

Aqui dejo un enlace a la parte del manual de pilasengine donde explica como hace uso de este editor de una forma muy original.Hay que leerlo entero,no vale saltarse nada. :P
http://manual.pilas-engine.com.ar/mapas_y_plataformas/

Ahora si que es la ultima,creo. ;D

AmakaSt

Quote from: hokuto40 on April 16, 2019, 07:18:17 PM
Vamos con mi sugerencia favorita.

Los divlike no tienen ningun sistema para el manejo de los niveles y por lo que veo todo el mundo suele usar el switch() para manejar todos los objetos y crear multiples niveles,pero cuando se trata de un juego muy grande se complica bastante el tema.

Ademas de que se te puede quedar por hay algun procesos vivo y ya ves los problemas que te puede causar.

Yo propongo crear un proceso especial para esto,con algunas funciones que te ayuden en el manejo de los niveles.

process_scene nivel1()
begin
      graph = 1;//grafico del fondo
      x = 300; y = 200;
      jugador();
      enemigo();
      enemigo2();
      balablabla();
      loop
         if(ya no hay enemigos en pantalla)
         pasar_nivel(type nivel2);//funcion para pasar de nivel
         end
   
         if(el jugador muere)
         reiniciar_nivel();//funcion para reiniciar nivel
         end
         frame;
      end
end

process_scene nivel2()
begin
      graph = 1;//grafico del fondo
      x = 300; y = 200;
      jugador();
      enemigo();
      enemigo2();
      balablabla();
      loop
         if(ya no hay enemigos en pantalla)
         pasar_nivel(type nivel3);//funcion para pasar de nivel
         end
   
         if(el jugador muere)
         reiniciar_nivel();//funcion para reiniciar nivel
         end
         frame;
      end
end


Tenemos el proceso especial process_scene() que es para el manejo de niveles,este tiene todas la propiedades del proceso normal y ademas sirve para el manejo del nivel.

Es decir,esto es un contenedor donde meter todos los objetos del nivel y cuando pasamos de nivel con la funcion pasar_nivel(id) se elimina automaticamente todos los objetos que hay en el para que al pasar al siguiente nivel este todo limpio y solo con los objetos del nivel 2.

Ademas tambien eliminara automaticamente los textos y los recursos que haya en la memoria.La funcion reiniciar_nivel() hace lo mismo que pasar_nivel(id) pero en vez de pasar al nivel siguiente volvera a mostrar el nivel donde esta con todo limpito para mostrar lo del nivel actual.

Pongo un videotutorial de gamemaker donde se explica como se manejan los niveles en este engine y con esto podras entender mejor mi sugerencia.
https://www.youtube.com/watch?v=BaTGBtdKLBU

Hay que ver entero el video sino no sirve. :)
Hola hokuto40,

Revisándome tus sugerencias, está es la que puedes hacer como indicas con los procesos normales, lo del switch() lo usa quien quiere, cada cual desarrolla su juego de la forma que le parezca más útil. Pero lo que veo en tu ejemplo se puede hacer sin problemas con los procesos o funciones actuales.

Cuando pueda, en un rato, te subo un ejemplo a ver como lo ves. :)

Un saludo.

AmakaSt

Aquí tienes un ejemplo simulando lo que habías puesto para saltar de nivel: https://www.divgo.net/c-584df9b2