Noticias

Se ha publicado un nuevo servicio, el Portal de Juegos Online

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 ... 13
1
Preguntas y respuestas / Re:Velocidad de sonic
« en: Octubre 27, 2020, 02:27:55 pm »
Saludos B_12.4

La manera mas facil seria agregandole a una variable con el tiempo, prueba creando una variable tipo "hsp" y sumarsela a la "x"
/// Event Create
hsp = 0;
maxhsp[0] = 4;
maxhsp[1] = 7;
maxhsp[2] = 9;

hithsp = 0;
hcont = 0;
htime = room_speed*3; //puse un tiempo hipotetico
/// Event Step
var kh;
kh = (keyboard_check(vk_right) - keyboard_check(vk_left));

/// Movimiento horizontal
if (kh <> 0 && !place_meeting(x+hsp, y, obj_solid) {
  if (abs(hsp) < maxhsp[hithsp])
  hsp += kh*0*5;

  image_xscale = 1+(2*(hsp<0));
  // Funciona para darle tiempo establecidos a cada aceleracion
  hcont += 1;
  if (hcont >= htime && hcont != 2) {
    hithsp = min(hithsp+1, 2);
    htime += room_speed*2;
    hcont = 0;
  }
}
else // Desaceleracion
if (hsp <> 0 && kh == 0) {
  var hx
  if (hithsp == 0)
      hx = 0.25;
      else
      hx = 0.5;

  hsp -= (sign(hsp)*hx);
  // Cambiar valores mientras se desacelera
  if (abs(hsp) > 4 && abs(hsp) < 7) {
    hithsp = 1;
    hcont = room_speed*3;
  }
  if (abs(hsp) > 0 && abs(hsp) < 4) {
    hithsp = 0;
    hcont = 0;
  }
}

/*Sumar hsp*/ x += hsp;

Creo que con lo primero de ese ejemplo de se puede lograr prácticamente lo mismo, bueno apenas acabo de pensarlo  :-[

2
Preguntas y respuestas / Re:Dibujar sólo lo que las views captan
« en: Octubre 26, 2020, 06:59:59 pm »
Se supone que nada mas se pueden notar cosas que esten dentro de la view, pero si quieres hacerlo de igual forma, entonces usa un pequeño script al principio de cada evento draw de cada objeto
///scr_InView(x, y, view)
var view; view = argument2;
return (argument0 > view_xview[view] &&
argument1 > view_yview[view] &&
argument0 < view_xview[view]+view_wview[view] &_
argument1 < view_yview[view]+view_hview[view])
/// Event Draw
if (!scr_InView(x, y, 0)) exit

3
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

4
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


5
Preguntas y respuestas / Re:Como puedo registrar un cierre en el juego?
« en: Octubre 16, 2020, 07:40:46 pm »
Alemar no existe forma de registrar eso, se supone que al presionar una tecla de esas, se ejecuta una accion al instante. En tu caso seria que se saldria del juego, simplemente se sale y ya, como la funcion de game_end() que solo sirve para ejecutar una sola cosa (la cual seria salirse del juegp), por esa razon se me ocurrio que lo hicieras una segundo antes de salirte del juego.

Si quieres registrar otras cosas, te valdria hacerlo manualmente, como... Por ejemplo...: "current_time", una variable que devuelve el tiempo transcurrido desde que se inicio el juego. Si quisieras registrar algo habria que calcularlo manualmente (por suerte existen algunas variables que sirven para devolver valores como aquel ejemplo)

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

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...  :-\

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;
}

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

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)

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

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

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

14
Preguntas y respuestas / Re:Trazar un dibujado con el mouse
« en: Octubre 09, 2020, 05:04:26 pm »
Gracias por la sugerencia. Tuve que hacer algunas cosillas extras pero igual funciono correctamente. Por cierto cuando dijiste que no podias imaginartelo correctamente, creo que tenias razon, a veces no suelo expresarme perfecto cuando trato de describir una idea; mejor lo hago con una imagen aclaratoria:



Tambien queria preguntar ¿si no habia una forma mas suave para intercalar los puntos entre lineas? Pues noto que algunos puntos (especificamente los ultimos puntos) suelen lagearse o no calcular muy bien las aproximaciones cercanas del mouse. Pero de paso las listas funcionaron bien ("me pregunto como se verian las lineas, si GameMaker gestionara vectores" ;))

15
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

Páginas: 1 2 3 ... 13