Noticias

Importante: ¡Si quieres publicar tu juego no olvides leer este tema!

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!.

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - T789

Páginas: 1 2 3
1
Preguntas y respuestas / Re:Función para esperar cierto tiempo
« en: Noviembre 21, 2020, 05:09:06 am »
Saludos T1ag0

En GameMaker existe una funcion llamada sleep() que sirve para detener el juego un determinado numero de milisegundos, claro, esta funcion solo lo detiene en el mismo paso, y digamos que si quieres dibujar un texto antes de ejecutarla, entonces prácticamente este texto se ejecutara despues de que hayan pasado el numero de milisegundos.
Por suerte he creado un script que hace exactamente lo mismo, a diferencia de que puedo añadirle varias cosillas extras.
Acontinuacion enmarco 3 distintas versiones del script:
///sleep_color(miliseg, color)
var i;
i = 0;
do {
  draw_set_color(argument1)
  draw_rectangle(0, 0, room_width, room_height, 0)
  screen_refresh()
  i += 1;
} until (i >= argument0)
///sleep_text(miliseg, x, y, text)
var i;
i = 0;
do {
  draw_text(argument1, argument2, argument3)
  screen_refresh()
  i += 1;
} until (i >= argument0)
///sleep_sprite(miliseg, sprite, subimg, x, y)
var i;
i = 0;
do {
  draw_sprite(argument1, argument2, argument3, argument4)
  screen_refresh()
  i += 1;
} until (i >= argument0)
No se si la funcion screen_refresh() exista en versiones posteriores a GM8, si no es asi, entonces sugiero uses sleep(1) en cada script en lugar de screen_refresh(); claro, tampoco se si al cambiarlo se ignore lo demas, pero para hacerlo mas seguro, sugiero que la parte de la verificacion la hagas en el evento draw. Osea que si es una collision la hagas en el evento draw en vez de un evento step
Los siguientes usuarios dieron las gracias a este tema: T1ag0

2
Preguntas y respuestas / Re:Se activen diferentes rutas cada cierto tiempo
« en: Noviembre 18, 2020, 02:05:20 am »
Existen varios metodos. Podrias usar una variable llamada "accion" que tenga distintos valores numericos, por ejemplo que se le vaya sumando 1 cada vez que pasa algo y luego verificar los estados que tenga
/// Event Alarm[1]
switch(accion)
{
  case 0:
  //Lo que quieras
  //Poner antes del break la misma alarma[1] pero con un distinto valor
  break;

  case 1:
  //Lo que quieras
  //Poner antes del break la misma alarma[1] pero con distinto valor
  break;
}
accion += 1;
Asi puedes usar una misma alarma pero que ejecute distintas acciones segun los estados de una misma variable, y al final de esa alarma le sumas 1 a la variable para ir a un proximo estado, o, podrias dar valores aleatorios en los mismos "case" para saltarte a cualquier "case"

Tambien estan las "time lines" por si quieres hacerlo mas sencilo
Los siguientes usuarios dieron las gracias a este tema: T1ag0

3
Saludos T1ag0

Eso lo puedes hacer con el mismo instance_create, bueno no se que tan planeado quieras los movimientos pero todo podrias hacerlo programando objetos y usando alarmas.
Un ejemplo es crear una instancia de un misil y meternos en ella una vez la creemos:
/// Evento alarm[0]
with(instance_create(x, y, obj_misil)) {
  direction = point_direction(x, y, obj_p.x, obj_p.y)
  speed = 7;
}
alarm[0] = room_speed*1.5; //Fija el tiempo que quieras
En ese ejemplo nos metemos dentro de un objeto creado y le aplicamos una direccion (que seria hasta el jugador) y una velocidad. Notaras que al estar en una alarma se puede volver a utilizar indefinidamente, por lo que podrias usar una funcion choose() o irandom() para fijar distintas dimensiones

Otro ejemplo seria de que quieres crear varias instancias de distintos objetos y para ello puedes poner un choose
choose(obj_misil, obj_bala, obj_avion)

Todo depende de que es lo que quieras hacer
Los siguientes usuarios dieron las gracias a este tema: T1ag0

4
Saludos FernandoNavarro

Puedes usar un mismo sprite y gestionar manualmente cada subimagen dependiendo de cad estado. Por ejemplo yo suelo crear un solo sprite que contenga todas las animaciones que necesito (claro puede llegar a ser un poco largo), y de paso escribo en algun comentario el orden de cada subimagen:
Código: [Seleccionar]
/* Orden de subimagenes
 0-3 //caminar
 4-6 //corriendo
 7-8 //saltando
 9-11 //buceando
*/
En tu caso si lo que quieres es hacer un ataque pues solo verifica con unos if, y de misma forma con una variable que gestione el estado de ataque
/// Event Create
atack_state = ""; //funciona para establecer el estado de ataque

/// Event Step
if (atack_state == "cargando") {
  if (image_index > 3) //En caso de que la subimagen este mas alla de las de cargando, claro... Puse 3 como ejemplo
     image_index = 0;
}
else if (atack_state == "ejecutando") {
  if (image_index < 4 or image_index > 7) //En caso de que la animacion anterior se haya restablecido pero estemos ejecutando ataque, entonces ponerla automaticamente en la primera subimagen de la ejecucion
     image_index = 4;
}
Ese codigo de ahi se encargara gestionar las subimagenes dependiendo del estado de ataque; ahora habria que verificar donde poner para cambiar los estados de ataque. Voy a usar 2 eventos de tecleo como ejemplo
/// Event Keyboard Space
if (atack_state != "ejecutando") {
  //Podrias poner aqui un aumento para una variable de daño
  atack_state = "cargando";
}

/// Event Keyboard Released Space
atack_state = "ejecutando";
Bueno eso fue un pequeño ejemplo, te sugiero que veas si no estas verificando una animacion en otra parte, para no tener problemas
Los siguientes usuarios dieron las gracias a este tema: FernandoNavarro

5
Saludos B_12.4

Eso es muy facil, simplemente desmarca la casilla de "Delete Underlying" que te aparece en ese apartado. La casilla sirve para borrar instancias que se encuentren en la misma casilla donde se vaya a poner otra (sirve para evitar que haya 2 instacias colocadas en el mismo lugar)

Una vez que la hayas desmarcado no pasara otra vez

Los siguientes usuarios dieron las gracias a este tema: B_12.4

6
Preguntas y respuestas / Re:Como puedo registrar un cierre en el juego?
« en: Octubre 16, 2020, 07:16:37 pm »
Saludos Alemar5

No entendi exactamente que es lo que teneis de meta para lograr, pero si quieres archivar una salida del juego, podrías hacerlo con un archivo .ini que gestione cada cosilla. Un ejemplo para salir del juego:
if keyboard_check_pressed(vk_escape) {
  var exits;
  ini_open("Registro.ini")
  exits = ini_read_real("Parte1", "Salidas", 0) //Leera la clave donde se hayan el numero de salidas registradas, y si no hay ningun valor simplemente devolvera cero
  ini_write_real("Parte1", "Salidas", exits+1) //Le sumara 1 al valor actual de las salidas asignadas a la clave
  ini_close()

  game_end() //Salir del juego
}
Y para dibujar las salidas en el evento draw, seria practicamente lo mismo, a excepcion de que solo leeras y no escribiras
/// Event Draw
var salidas;
ini_open("Registro.ini")
ini_read_real("Parte1", "Salidas", 0)
ini_close()

draw_text(x, y, "Has jugado: "+string(salidas) + ", por favor vuelve mañana")

Bueno, de esa forma podrás archivar cada salida del juego, y si necesitas resetear a 0, pues simplemente lo vuelves a abrir y lo pones en 0.
Para saber como manejarlo mejor, busca la documentacion de archivos .ini aqui
Los siguientes usuarios dieron las gracias a este tema: Alemar5

7
 :'(  :'(  :'(  :'(  :'(  :'(
Bueno se me acabaron las ideas y sugerencias, asi que pasa todos los codigo de todos los eventos de tu obj_mama. Absolutamente habra que revisar todo. Espero eso funcione...  :-\
Los siguientes usuarios dieron las gracias a este tema: Alemar5

8
Bueno se me acabaron las sugerencias. Si ninguna parte esta en conflicto, probare cambiando el metodo a otro mas dinamico. Cambia todo el codigo anterior a este:
/// Event Step
if instance_exists(obj_textbox) {
  var dirObj;
  dirObj = point_direction(x, y, obj_prota.x, obj_prota.y);

  if (dirObj >= 45 && dirObj <= 135)
     sprite_index = spr_mama_arriba;
  if (dirObj >= 135 && dirObj <= 225)
     sprite_index = spr_mama_izquierda;
  if (dirObj >= 225 && dirObj <= 315)
     sprite_index = spr_mama_abajo;
  if (dirObj >= 315 && dirObj <= 45)
     sprite_index = spr_mama_derecha;
}
Los siguientes usuarios dieron las gracias a este tema: Alemar5

9
Olvidaste quitar 2 "obj_prota."; olvidando eso, ya que no se me ocurre que podria estar dando problema, intenta pasar todo ese codigo al evento draw, y en vez de usar sprite_index usas draw_sprite(). En lo general ya que no imagino porque da problema con el sprite_index, la alternativa es dibujarlo desde ese evento  :)

Otra cosa en la que estoy pensando, es que si no quiere cambiar el sprite con ese codigo entonces revisa a ver si no estas cambiando el sprite_index en otra parte del obj_mama (la mayoria de las veces no se puede cambiar sprite en un lado porque en otro ya se esta manejando).
Los siguientes usuarios dieron las gracias a este tema: Alemar5

10
Espera un momento... ¿El sprite que querias cambiar era el de la madre? Si es asi entonces quita el "obj_prota." de todos los sprite_index, ya que solo va cambiar su propio sprite

Si ese es todo el caso, entonces no hace falta usar el "bloque.hijo = id". Lo otro que iba decir es que el "48" en los place_meeting() eran solo de prueba, asi que puedes especificar mejor los pixeles (podrias intentar con el tamaño sumado del radio que seria: 10, pero mejor prueba vos)
Los siguientes usuarios dieron las gracias a este tema: Alemar5

11
Saludos Alemar5

Tengo 2 soluciones para ti
La primera: para que la colision sea mas precisa, debes cambiar el penultimo argumento a true de la funcion "collision_circle" (asi se verificara una colision mas precisa en el circulo, y de paso, para no tener problemas, sugiero que tengas marcada la casilla de precise en la máscara de colisión del sprite en comun)

La segunda: sugiero que le añadas una variable al obj_mama y que contenga el id del player, algo asi como: "bloque.hijo = id" y todo eso en el primer codigo
/// Event Step obj_mama
if instance_exists(obj_textbox) {
   if place_meeting(x-48, y, hijo)
      hijo.sprite_index = //Sprite mirando a la derecha
   if place_meeting(x+48, y, hijo)
      hijo.sprite_index = //Sprite mirando a la izquierda
   if place_meeting(x, y-48, hijo)
      hijo.sprite_index = //Sprite mirando abajo
   if place_meeting(x, y+48, hijo)
      hijo.sprite_index = //Sprite mirando abajo
}
Y eso solo pasaria si ya fue creada una instancia de obj_textbox. Espero te funcione, la verdad es que todo me lo acabo de pensar
Los siguientes usuarios dieron las gracias a este tema: Alemar5

12
Oh si... Eso sucede porque si no hay una instancia enemiga, entonces solo se estaria dibujando con el angulo .x de una variable con un id vacio. Solucionalo facilmente verificando primero si hubo colision en el circulo
/// Event Draw
var inCircle;
inCircle = collision_circle (x, y, rango, o_e1, 0, true);
if (inCircle)
  distObj = inCircle //Devolver el id de la instancia que entro en el rango del circulo de colision

// Detectar si paso el radio
if (distance_to_object(o_e1) < rango)
  draw_sprite_ext(sprite0, 0, x, y, 0.75, 0.75, point_direction(x, y, distObj.x, distObj.y), c_white, 1)
  else
  draw_sprite_ext(sprite0, 0, x, y, 0.75, 0.75, direction, c_white, 1)
Tambien sugiero que añadas la variable distObj en el evento create y que le des un valor predeterminado de "direction" para evitar que cuando no haya colision en el circulo simplemente muestre ese valor o... Si ya hubo una colision simplemente cuando el enemigo salga ya tendrias una direccion antigua
Los siguientes usuarios dieron las gracias a este tema: Momoni

13
Saludos Momoni

El problema esta en el evento draw, mas que nada cuando dibujas el sprite, si mal no veo estas usando la funcion point_direction para coger la direccion entre tus (x, y) y las (distancia.x, distancia.y). Ahi es donde radica el problema, pues la funcion "distance_to_object()" que usas en el evento step, solo almacena la distancia no el id del objeto. Sugiero que lo hagas dandole el valor de otra funcion: "collision_circle()" y de paso te puedes ahorrar lo del evento step en el evento draw
/// Event Draw
var distObj;
distObj = collision_circle (x, y, rango, o_e1, 0, true); //Devolver el id de la instancia que entro en el rango del circulo de colision

// Detectar si paso el radio
if (distance_to_object(o_e1) < rango)
  draw_sprite_ext(sprite0, 0, x, y, 0.75, 0.75, point_direction(x, y, distObj.x, distObj.y), c_white, 1)
  else
  draw_sprite_ext(sprite0, 0, x, y, 0.75, 0.75, direction, c_white, 1)
De esta forma puedes hacerlo mas lite xD

Por cierto si te preguntas como trabaja la funcion de "collision_circle", ajunto su documentacion:
https://docs.yoyogames.com/source/dadiospice/002_reference/movement%20and%20collisions/collisions/collision_circle.html
Los siguientes usuarios dieron las gracias a este tema: Momoni

14
Saludos Zorropa

Lo que pides es algo que se puede verificando facilmente. Simplemente crea una variable que gestione si esta abierta o no, lo puedes hacer desde el mismo objeto puerta
/// Evento Create obj_puerta
abierta = false;

// Crea una instancia del interruptor en cualquier cordenada de la room, y almacena el id de la puerta en ella para que asi pueda manejarla
with(instance_create(xx, yy, obj_interruptor));
   Mipuerta = other.id;
Ahora simplemente añade en el objeto interruptor, una condicion para abrir la puerta que nos creo (servira mejor creando el interruptor desde el objeto puerta). Usare como ejemplo el evento colision
/// Evento Collision con el obj_jugador
if (Mipuerta.abierta == false) //Solo abrira nuestra puerta, si esta cerrada
   Mipuerta.abierta = true;

Ahora, si te preguntas como poder crear los interruptores en distintas parte de la room sin tener que crear otra puerta... Pues simplemente añade una variable unica, en el "creation code" de la instancia de la puerta añadida en la room
xx = 320; //Posicion x donde crear mi interruptor
yy = 240; //Posicion y donde crear mi interruptor
Si lo notaste bien, al principio de este tema (en la parte donde creamos el interruptor), creamos la instancia del interruptor con los valores de esas variables unicas, que serian "xx" "yy"

Bueno espero que te sirva este metodo
Los siguientes usuarios dieron las gracias a este tema: Zorropa, LeipnirStudio

15
Preguntas y respuestas / Re:dudas de views para un juego pixel art
« en: Octubre 08, 2020, 03:37:41 am »
Saludos S4BAT

¿Podrias especificar un poco mas? Hay 2 formas de agrandar la pantalla con las view. La primera es manualmente desde la pestaña view del editor de room; y la segunda es por medio de las variables de la view

Quieres agrandarlo segun lei, podrias hacerlo duplicando "el port de la view"
Digamos que tu room tiene unas proporciones de...
Código: [Seleccionar]
room_width = 320;
room_height = 240;
Asi que solamente agranda los valores en el port a 320*2 = 640, 240*2 = 480. Podrias probar cambiando a otros valores mas grandes, pero siguiendo las proporciones originales.
Sugiero que mantengas a tus sprites en proporciones iguales, ya que en la mayoria de casos suelen deformarse algunos sprites y/o verse los pixeles arruinados (a mi me pasa que suelen perderse o borrarse algunos pixeles de un sprite)

Tambien podrias intentar cambiando el tamaño de la ventana del juego (es una forma mas y casi no suelen dañarse pixeles, bueno en el GM8 se ve borrosa la pantalla pero en el GMS no se ve borrosa) con la funcion:
window_set_size(room_width*2, room_height*2)
window_center() //centrar ventana para evitar problemas
Bueno... No se si todavia exista esa función en GMS
Los siguientes usuarios dieron las gracias a este tema: S4BAT

Páginas: 1 2 3