Mostrar Mensajes

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

Mensajes - Markus

1
Desarrollo de Scripts / Re:Console Log
Mayo 07, 2019, 02:03:20 PM
Cita de: somnus en Abril 29, 2019, 01:59:33 AM
yo uso mucho el show_debug_message, para mandar un string donde no se si se esta ejecutando cierta parte del codigo, supongo que este scritpts es para ver las variables o los valores internos, aunque para eso tenemos el modo debug, de cualquier manera me parece que con algunas modificaciones se pudiera usar hasta para mandar textos o dialogos en el evento draw.

Yo también lo uso mucho para evaluar código y por lo mismo a veces imprimo las variables involucradas para revisar que todo vaya según lo planeado. Así que creé este script por comodidad. Al última línea se puede reemplazar por "return mensaje;" y el script devolvería un string con el log en vez de enviarlo directamente a la consola, así podrias usarlo en el evento Draw.
2
Desarrollo de Scripts / Console Log
Abril 28, 2019, 06:56:29 PM

  • Nombre del creador: Markus
  • Breve descripción de su función: Permite enviar mensajes a la consola (show_debug_message()) permitiendo agregar argumentos al string del mensaje.
  • Versión GM utilizada:   Game Maker: Studio 2
  • Código del Script:

    Argumentos

    • mensaje: es un string con el mensaje a imprimir, cada '%s' que contenga se reemplazará con los argumentos entregados.
    • argumentos: puede ser un número o un string. También puede ser un arreglo con números y/o strings.

    Código
    [gml]
    //console_log(mensaje, argumentos);
    ///@param mensaje
    ///@param argumentos
    var mensaje   = argument[0];
    var argumentos = argument[1];

    if (is_array(argumentos))
    {
       for (var i = 0; i < array_length_1d(argumentos); i++)
       {
          var value = is_real(argumentos) ? string(argumentos) : argumentos;
          mensaje = string_replace(mensaje, "%s", value);
       }
    }
    else
    {
       var value = is_real(argumentos) ? string(argumentos) : argumentos;
       mensaje = string_replace(mensaje, "%s", value);
    }
    show_debug_message(mensaje);
    [/gml]

    Ejemplo con 1 argumento
    [gml]
    var nombre = "Pedrito";
    console_log("Hola, mi nombre es %s y soy feliz.", nombre);
    [/gml]
    Resultado: Hola, mi nombre es Pedrito y soy feliz.

    Ejemplo con un arreglo como argumento
    [gml]
    var nombre = "Pedrito";
    var edad = 12;
    console_log("Hola, mi nombre es %s y tengo %s años.", [nombre, edad] );
    [/gml]
    O también
    [gml]
    var datos = ["Pedrito" , 12];
    console_log("Hola, mi nombre es %s y tengo %s años.", datos);
    [/gml]
    Resultado de los dos anteriores: Hola, mi nombre es Pedrito y tengo 12 años.

3
Preguntas y respuestas / Re:joystick button released
Noviembre 11, 2018, 06:27:56 PM
Cita de: kostra en Noviembre 11, 2018, 04:24:52 PM
Dos preguntas, en tu codigo pusiste ademas del check_released, el check y el check_pressed, o me lo parece a mi?
Sí, aproveché para poner en realidad los 3 eventos: releassed, check y pressed.

Cita de: kostra en Noviembre 11, 2018, 04:24:52 PM
EDITO: Que se supone que va en numb???
EDITO2: He probado poniendo una id en "numb" y el mismo en el id del step, he probado con varios ids (1,2,3 y 15) y no me funca
Ahí corregí el comentario, era i, j en vez de id, numb.
4
Intenta con éste botón.
5
Preguntas y respuestas / Re:joystick button released
Noviembre 11, 2018, 03:33:52 PM
Lo siento, pero sólo lo puedes solucionar con variables. Puedes usar un arreglo:
[gml]
///Create
for (var i = 1; i <= 2; i++) //2 devices
{
  for (var j = 1; j <= 32; j++) //32 buttons
  {
    global.joy_pressed[i, j] = false;
    global.joy_press[i, j] = false;
    global.joy_releassed[i, j] = false;
  }
}
[/gml]

[gml]
///Begin Step
for (var i = 1; i <= 2; i++) //2 devices
{
  for (var j = 1; j <= 32; j++) //32 buttons
  {
    if (joystick_check_button(i, j))
    {
      if (!global.joy_press[i, j])
      {
        global.joy_pressed[i, j] = true;
        global.joy_press[i, j] = true;
      }
      else
        global.joy_pressed[i, j] = false;
    }
    else
    {
      if (global.joy_press[i, j])
      {
        global.joy_releassed[i, j] = true;
        global.joy_press[i, j] = false;
      }
      else
        global.joy_releassed[i, j] = false;
    }
  }
}
[/gml]
Luego, para usarlas:
[gml]
///Step
if (global.joy_releassed[1, 3]) //device 1 y button 3
{
  instance_create(x, y, obj_bala); //o lo que sea
}
[/gml]
6
Cita de: Yuzo en Diciembre 03, 2017, 11:13:17 AM
Sííííííííí !!!!, por fin funciona !!!!!.

Dios santo, no sabes como te lo agradezco, te debo una cerveza !!!!.

Te la cobraré  ;D

Cita de: Yuzo en Diciembre 03, 2017, 11:13:17 AM
...
Lo que no entiendo es por que todo el mundo usa END STEP para el tema de las surfaces, yo uso el evento STEP y funciona, a que se debe ?, a decir verdad ni si quiera se muy bien como funciona el END STEP.
...

END STEP se usa generalmente para asegurarse de que todas las instancias ya se hayan movido en STEP actual, antes de trabajar con la surface. Así evitas tener que crear la instancia controladora del surface en el orden correcto para ejecutar su código después de que todo el resto lo haga.
7
Por fin entendí lo que faltaba en la recomendación que te di. Así que vamos de nuevo:

Esto que tienes aquí:

EVENTO STEP
[gml]
...
// CREA LUZ SOBRE LAS BALAS
if instance_exists(ob_player_bullet){
draw_set_blend_mode(bm_subtract)                // modo de dibujar "EXTRAER"
draw_sprite(spr_luz_1,0,ob_player_bullet.x,ob_player_bullet.y)// Lo coloca sobre las balas
}
...
[/gml]

Por esto:
[gml]
// CREA LUZ SOBRE LAS BALAS
draw_set_blend_mode(bm_subtract)                // modo de dibujar "EXTRAER"
with(ob_player_bullet){
draw_sprite(spr_luz_1,0,x,y)// Lo coloca sobre las balas
}[/gml]

[gml]with(ob_player_bullet)[/gml]
hace que todo el código que viene después, dentro de los {} lo ejecute cada instancia del objeto ob_player_bullet, entonces, lo que faltaba era reemplazar las coordenadas que tenías
[gml](ob_player_bullet.x,ob_player_bullet.y)[/gml]
por las coordenadas de la instancia que ejecuta el código
[gml](x, y)[/gml]

¿Por qué? Porque cuando escribes objeto.x, usa la coordenada de la primera instancia existente en ese momento del objeto.

Lo probé y funciona.

Saludos.
8
Cita de: Yuzo en Noviembre 18, 2017, 10:34:26 AM
3DGeminis, sigue sin funcionar.

Markus, así funciona, pero sólo funciona en un objeto por room, es decir, si hay dos balas o más, sólo la primera que se creó tiene el efecto de luz.

No hay algo que se le pueda poner al objeto bala para que el efecto se haga desde el propio objeto ?, creo que sería mejor, y que usaría menos recursos, no ?.

En un fallido intento de hacerlo de dicha manera puse esto en el evento STEP del objeto bala:

[gml]/// LUZ EN SURFACE

// CREA LA LUZ SOBRE EL ATAQUE
if room == lvl_4 {
surface_set_target(global.oscuridad)            // llama a la surface
draw_set_blend_mode(bm_subtract)                // modo de dibujar "EXTRAER"
draw_sprite_ext(spr_luz_1,0,x,y,1,1,0,1,1)      // dibuja el sprite de luz
draw_set_blend_mode(bm_normal)                  // deja el modo de dibujo en normal
surface_reset_target()                          // cierra la surface
}[/gml]

Pero nada, así tampoco funciona, ya no se que hacer .....

¿Pero hiciste el cambio que te indiqué? Porque con WITH haces que todas las balas ejecuten su código, justamente lo que están diciendo que necesitas hacer.
9
Desarrollo de Scripts / Re:Texto que se crea poco a poco
Noviembre 17, 2017, 12:31:33 PM
Yo lo modificaría un poco.

Evento Create
[gml]
pagina = -1              //Contador de pagina actual, -1 = inactivo
paginas[0] = ""         //arreglo de paginas
mostrar = false         //mostrar cartel por defecto
i = 0
[/gml]

En el Evento Alarm[0]
[gml]
if(mostrar){
            if i < string_length(paginas[pagina]){
                i++
            alarm[0] = 4
            }
}
[/gml]

En el evento Step
Step Codigo 1
[gml]
///Controlar si el jugador abre el cartel
if (mostrar){
//Si se aleja cerramos el cartel y reiniciamos
if(distance_to_object(obj_Prota)>3){mostrar = false; pagina = -1}
}
else {
if (keyboard_check_pressed(ord("Z")) and distance_to_object(obj_Prota)<3){
mostrar = true}
}
[/gml]
Step Codigo 2
[gml]
///Comprobar si el jugador pasa la pagina
if(keyboard_check_pressed(ord("Z"))and mostrar){
//Pasar pagina
if(pagina+1 < array_length_1d(paginas)){ pagina++;alarm[0]=4
else{
    //Si nos pasamos el maximo reiniciamos el cartel
    mostrar = false
    pagina = -1
    }
}
[/gml]
Evento Draw GUI
[gml]
///Comprobar si el jugador esta cerca
if(mostrar){
    draw_sprite(spr_HUD_Texto,0,0,31)
    draw_set_font(f_Texto)
    draw_set_halign(fa_left)
    copia = string_copy(paginas[pagina],1,i)
    draw_set_color(c_black)
    draw_text(34,37,copia)
    draw_set_color(c_white)
    draw_text(33,36,copia)   
}
[/gml]
10
En resumen, el código debería quedar así.

GUARDAR
ini_open("ranura1.ini")
{
ini_write_string("save","nombre",global.nombre)

}
ini_close()

//CARGAR
ini_open("ranura1.ini")
{
global.nombre=ini_read_string("save","nombre",global.nombre)
}
ini_close()
11
Cita de: Yuzo en Noviembre 07, 2017, 04:33:21 PM
...
EVENTO STEP

[gml]///PROPIEDADES

// DIBUJA LA OSCURIDAD
surface_set_target(oscuridad)                   // llama a la surface
draw_set_color(c_black)                         // establece el color negro
draw_set_alpha(0.8)                             // nivel de transparencia en la oscuridad
draw_rectangle(0,0,room_width,room_height,0)    // dibuja el rectangulo negro que ocupa toda la room
draw_set_alpha(1)                               // establece el nivel de transparencia al normal

// CREA LA LUZ SOBRE EL JUGADOR
draw_set_blend_mode(bm_subtract)                // modo de dibujar "EXTRAER"
if instance_exists(ob_player_in_room){          // Lo coloca sobre el jugador entrando en la room
draw_sprite(spr_luz_1,0,ob_player_in_room.x,ob_player_in_room.y)
}else{                                          // lo coloca sobre el jugador
draw_sprite(spr_luz_1,0,ob_player.x,ob_player.y)
}
draw_set_blend_mode(bm_normal)                  // deja el modo de dibujo en normal
surface_reset_target()                          // cierra la surface

// CREA LUZ SOBRE LAS BALAS
if instance_exists(ob_player_bullet){
draw_set_blend_mode(bm_subtract)                // modo de dibujar "EXTRAER"
draw_sprite(spr_luz_1,0,ob_player_bullet.x,ob_player_bullet.y)// Lo coloca sobre las balas
}
draw_set_blend_mode(bm_normal)                  // deja el modo de dibujo en normal
surface_reset_target()                          // cierra la surface[/gml]
...

Sólo tienes que reemplazar esto:
[gml]
// CREA LUZ SOBRE LAS BALAS
if instance_exists(ob_player_bullet){
[/gml]

Por esto:
[gml]
// CREA LUZ SOBRE LAS BALAS
with(ob_player_bullet){
[/gml]
12
Preguntas y respuestas / Re:Tetris hard drop
Noviembre 17, 2017, 11:44:56 AM
No he visto tu archivo adjunto, pero lo que puedes hacer es un ciclo for que vaya desde el fondo del tablero hasta arriba. En él, vas analizando si la pieza colisiona con algún bloque. Si colisiona, sigues con el ciclo. Si no, ya encontraste la posición deseada.

En otras palabras, es ir probando a colocar la pieza en el fondo y si no cabe, ir subiendo 1 bloque.
13
Si el enemigo tiene una velocidad constante, entonces apunta con la flecha al lugar hacia donde se moverá el enemigo.

Si conoces la velocidad de la flecha, así como la velocidad y posición del enemigo, entonces puedes calcular hacia dónde apuntar para que la flecha golpee al enemigo.
14
Preguntas y respuestas / Re:¿Hay un tutorial de esto?
Noviembre 17, 2017, 11:19:41 AM
Yo no he jugado Megaman, pero por lo que se ve en la imagen, parece que son 2 objetos que se teletransportan. Si fuese así, tal vez sería más fácil.

Cada objeto tendría un path que definiría su patrón de movimiento, un contador de tiempo y una variable que indicaría uno de sus 3 estados: apareciendo, totalmente visible y desapareciendo.
El contador marcaría el tiempo en el que el objeto se mantiene en cada estado, de ese modo, cuando finalice el tercer estado, pasa a la siguiente posición del path y al primer estado.

Si quieres ahorrarte las variables de estado y contador, puedes crear un sprite con la animación completa de los 3 estados. Así, usas el evento Animation End para cambiar a la siguiente posición del path.
15
Preguntas y respuestas / Re:Generar bolas aleatorias
Noviembre 15, 2017, 05:14:30 PM
Tienes la función choose() para escoger el objeto a crear.
[gml]
bola_a_ser_creada = choose(obj_bola1, obj_bola2);
[/gml]

Luego funciones para elegir la posición de creación del objeto de forma aleatoria:

Cita de: NiuWeb en Noviembre 14, 2017, 07:47:58 PM
http://docs-gamemaker-es.blogspot.com.co/p/random_18.html
http://docs-gamemaker-es.blogspot.com.co/p/irandom.html
http://docs-gamemaker-es.blogspot.com.co/p/randomize_18.html

Finalmente, ponle gravedad a las bolas y caerán solas.