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 - BssString

Páginas: 1 2 3 ... 9
1
Preguntas y respuestas / Re:Función lerp ,movimiento pad
« en: Abril 16, 2020, 03:48:47 am »
Hola Ikaro3d

Encuentro interesante tu idea de usar LERP para suavizar el movimiento, pero le veo un problema al código de teclado.
Específicamente a la condición: "if keyboard_key" del inicio... no le encuentro sentido, pienso que el código quedaría mejor si la borras.
Esa condición te hace frenar de golpe si sueltas todas las teclas y no dejas que el lerp complete la distancia.
Ejemplo: si vas todo a la derecha, te deberías mover a la derecha con el suavizado y todo perfect, pero si sueltas todas las teclas de golpe, el personaje frena de golpe, pero aún le falta recorrer un 85% de la distancia que el LERP del step anterior no lo hizo recorrer. Eso significa que si ahora pulso izquierda, el personaje primero avanzará ese 85% hacia la derecha y luego irá a la izquierda como era esperado.

Este código debería funcionar con el JoyPad. Va explicado con comentarios para que no te pierdas.

//Primero recibo en qué porcentaje muevo el Stick (regresa un valor entre -1 y 1).
//En algunos Joystick de mala calidad, el axis queda pulsado ligeramente, para evitar eso, cuando se mueve 0.1 o -0.1, lo interpreta como 0.
var hdir = gamepad_axis_value(0,gp_axislh); if abs(hdir) < 0.1 { hdir = 0 }
var vdir = gamepad_axis_value(0,gp_axislv); if abs(vdir) < 0.1 { vdir = 0 }

//En caso de haber movimiento en cualquiera de los dos ejes:
if hdir != 0 || vdir != 0 {
//Convierte la coordenada cuadrada del X/Y a una coordenada circular (para que no importa a cuál de los 360º se mueva el personaje, nunca supere la máxima velocidad "v", si no haces esto, en diagonal se movería más rápido)
hdir *= sqrt(1 - 0.5*vdir^2)
vdir *= sqrt(1 - 0.5*hdir^2)
//Esto simplemente ajusta el "x" target e "y" target tal como lo tienes en tu código para keyboard.
xx += v*hdir
yy += v*vdir
}
//Esto actualiza las coordenadas del personaje para moverse un 15% de la distancia que hay entre su coordenada actual y su coordenada objetivo.
x=lerp(x,xx,0.15)
y=lerp(y,yy,0.15)

Edit: Ojo que si pulsas derecha y al mismo tiempo mueves el Stick a la derecha, te moverás dos veces a la derecha (al doble de rápido). Deberías crear algún "if" que te haga moverte o con teclado o con joypad, pero no ambos a la vez

Saludos
Los siguientes usuarios dieron las gracias a este tema: Ikaro3d

2
Hola Ikaro3d

Intenta con:
image_angle = direction
Los siguientes usuarios dieron las gracias a este tema: Ikaro3d

3
Hola VietnamNeko

Crea variables auxiliares que almacenen la posición del proyectil (antes de crearlo).
Luego calcula la distancia y dirección que hay desde el origen de tu objeto hasta el proyectil creado
Luego crea el objeto en la misma distancia del origen, pero con la dirección afectada por la "image_angle" del objeto, eso hará que el objeto creado rote junto con el objeto creador.

Ejemplo:
if image_index = 15{
var xx = irandom_range(x,sprite_width); //La futura X donde crearás el objeto
var yy = irandom_range(y,sprite_height); //La futura Y donde crearás el objeto
var len = point_distance(x,y,new_x,new_y); //La distancia lineal entre el x,y del creador hacia la bala
var dir = point_direction(x,y,new_x,new_y); //La inclinación entre el x,y del creador hacia la bala
//Luego creas la bala en el nuevo lugar, alterado por la image_angle del creador, pero basada en la misma distancia original.
    with(instance_create(x+lengthdir_x(len,dir+image_angle),y+lengthdir_y(len,dir+image_angle),obj_hell_bullet)){
        motion_set(point_direction(x,y,jaguar.x,jaguar.y),1)
    }
}

Saludos
Los siguientes usuarios dieron las gracias a este tema: VietnamNeko

4
Preguntas y respuestas / Re:Como soluciono problema al saltar
« en: Marzo 28, 2020, 02:11:25 am »
Hola fredred156

En Game Maker cada línea de código se ejecuta una a una en orden, eso quiere decir que no ejecuta la segunda hasta que no haya leido la primera.
Corta el código de movimiento izquierda-derecha y pégalo después de todo el código que nos acabas de mandar.
Eso hará que el código de movimiento se ejecute justo después de caer y así se te actualice el sprite correctamente.

Saludos
Los siguientes usuarios dieron las gracias a este tema: Black_Cat, fredred156

5
Preguntas y respuestas / Re:Acciones al presionar y soltar un botón.
« en: Marzo 24, 2020, 12:10:27 am »
Que bien que te haya funcionado. Éxito solucionando el resto de problemas.

Saludos
Los siguientes usuarios dieron las gracias a este tema: Dager

6
Preguntas y respuestas / Re:Problema con ataques según la distancia
« en: Marzo 22, 2020, 01:31:30 pm »
Hola Zhekken

El error que ves: "Unexpected symbol in expression" es en realidad un bug de Game Maker. Cuando se usa la palabra "var" y se termina la línea en una función o script (como el instance_create) Game Maker no cierra la línea y arroja ese bug.

Para corregirlo, a la fila anterior, cierra la línea manualmente con un signo punto y coma " ; " y se arregla:
var inst = instance_create(x,y,obj_bala); //Con el signo al final ya funciona bien

El problema fue que cree el código sin probarlo en mi GM antes y me olvidé de ese bug.

Citar
y ahora eso me confundió porque no se exactamente que quisiste colocar ahí.
Lo que hice fue crear una variable local en el evento alarma llamada "inst". Esa variable local existe sólo en el evento que se llama y luego se borra, eso quiere decir que la puedes editar y leer sólo durante la ejecución de ese evento alarm. Si la intentas leer en el evento STEP, te dirá que la variable ya no existe.
Hacer que la torre cree una bala, luego guarda el ID único que la bala que acaba de crear en la variable "inst" para poder manipular las variables de sólo esa nueva bala sin afectar a las balas que ya existen.

Luego la expresión:
inst.enemigo = enemigo
El problema fue que a la bala y a la torre les cree la misma variable "enemigo", por eso es un poco confuso, pero significan cosas diferentes.
La variable "enemigo" de la bala es el Instance ID del enemigo que tengo que perseguir hasta la muerte.
La variable "enemigo" de la torre es el Instance ID del objeto enemigo más cercano a la torre.

Entonces le estoy diciendo a la bala que acabo de crear, que persiga a muerte al enemigo que actualmente está más cercano a la torre.
Es como hacer:
obj_bala.x = 12, pero si hiciera eso, se cambiaría la variable de todos los "obj_bala" del juego y eso no es lo que se quiere.

Saludos
Los siguientes usuarios dieron las gracias a este tema: Zhekken

7
Preguntas y respuestas / Re:Acciones al presionar y soltar un botón.
« en: Marzo 22, 2020, 03:47:30 am »
Hola Dager

En el "Step End Event" del Objeto cuchillo.
x = obj_player.x
y = obj_player.y + 20
Ese código hará que el objeto "cuchillo" se mueva a la posición de mi objeto "obj_player", pero 20 pixeles hacia abajo (tú ponle como hayas llamado a tu objeto y en la coordenada respectiva según el tamaño de tus sprites y los puntos de origenes)

Si dices que la animación de ataque con el cuchillo tiene 3 sprites, al crearlo debes hacer que la animación no se ejecute hasta que sueltas la tecla "K".
En el "Create Event" del Objeto cuchillo:
image_speed = 0 //Esto evita que la animación se dibuje

Hace que el ataque se ejecute al soltar la tecla.
En el "Step Event" normal del Objeto cuchillo, coloca:
if keyboard_check_release(ord("K")) {
image_speed = 1 //Esto reactiva la animación. Si la animación va muy rápido, en vez de 1, ponle una velocidad más lenta, ej: 0.25, eso hará que la animación avance 1 sub-imagen cada 4 steps.
}

En el evento "End Animation" del Objeto cuchillo (que está en other), ponle que haga daño a los enemigos y una alarma que desaparezca la mano con cierto delay.
ejemplo:
if image_speed != 0 { //Esta condición hace que el ciclo de animación no se repita y el tiempo de la Alarma se ejecute sólo 1 vez.
image_speed = 0 //Cuando termina la animación, esta línea frena nuevamente la animación hasta que la mano desaparece
alarm[0] = 6 //Esto activa una alarma en 6 Steps para poder eliminar la mano.
}

en "Alarm[0]" del Objeto cuchillo, después de que pasan esos 6 Steps:
instance_destroy() //Elimina la mano con el cuchillo cuando se activa la alarma 0

Está de más decir que el player NO puede crear otro cuchillo hasta que el primero desaparezca, añade una condición para revisar si el objeto ya existe antes de crearlo
En el Step Event del Personaje
if keyboard_check_pressed(ord("K")) && !instance_exists(obj_cuchillo) { instance_create(x,y,obj_cuchillo) }

Saludos
Los siguientes usuarios dieron las gracias a este tema: Dager

8
Hola KayasamiX

Eso se logra con una Shader.

Puedes usar este video como guía donde generan un efecto similar con algunas variaciones:


Saludos
Los siguientes usuarios dieron las gracias a este tema: KayasamiX

9
Preguntas y respuestas / Re:CREAR ACELERACION
« en: Marzo 01, 2020, 10:24:21 pm »
Hola nonoroman

 El problema es que el "while" repite ese mismo código infinitas veces en el mismo step hasta que la condición se deje de cumplir, por eso ves que se mueve de golpe.
Reemplaza el "while" por un "if" y se debería solucionar.

Saludos
Los siguientes usuarios dieron las gracias a este tema: nonoroman

10
Preguntas y respuestas / Re:Error al cargar el juego
« en: Febrero 05, 2020, 01:43:56 am »
Hola Kalimerodrag

Que extraño. No sé que plataforma o sistema operativo estés usando, pero al menos yo uso Windows y sé que Game Maker Studio no puede acceder a las carpetas de tu ordenador, sólo puede acceder a ciertas carpetas, de hecho por defecto se crean y cargan los archivos desde Local/Appdata. Puedes acceder al directorio si buscas %localappdata% en el buscador de Windows.

Si has cambiado el archivo al escritorio e intentas cargar ejemplo: load_game("Desktop/game.sav") no te va a funcionar aunque el archivo exista porque Game Maker no tiene acceso a "Desktop".

Para que Game Maker gane acceso a cualquier carpeta del ordenador, el jugador le tiene que dar acceso manualmente mediante las funciones "get_open_filename" o "get_save_filename".

Intenta esto para cargar tu juego:
var file; file = get_open_filename("Continuar", "")
if file != "" load_game(file)

Eso te abrirá un cuadro de díalogo (los tipicos cuando pulsas "File" > "Open" en Windows) que te permitirá buscar el archivo en tu ordenador y cargarlo manualmente a Game Maker.

Saludos
Los siguientes usuarios dieron las gracias a este tema: Kalimerodrag

11
Preguntas y respuestas / Re:Problema con plataforma circular
« en: Febrero 02, 2020, 12:51:24 am »
Hola LastSparkle

Game Maker guarda las coordenadas que tenía el objeto en el Step Anterior.

Cuando cambias la "X" e "Y" de la plataforma, puedes encontrar cuántos pixeles se movió horizontalmente/verticalmente y aplicarlos al player.

Ejemplo, en el Evento que mueve tu plataforma:
//Primero calcula si el player está arriba tuyo:
var player_arriba  = false
if ( place_meeting(x,y-1,obj_player) ) { player_arriba = true } //Si la plataforma es atravezable, deberás hacer otro check.
//Ahora mueves la plataforma con el código que tengas
x = lengthdir_x bla bla
y = lengthdir_y lo mismo
//Acá la magia
var x_offset = x - xprevious //Esto calcula cuántos pixeles se movió la plataforma
var y_offset = y - yprevious
//Si el player estaba arriba de la plataforma, lo mueve también:
if ( player_arriba ) {
obj_player.x += x_offset
obj_player.y += y_offset
//Acá debes correr un código de colisión en el player para detectar si ha colisionado con algo, así evitas que el player se atasque.
//Según el resultado puedes regresar la plataforma a su posición anterior (x = xprevious) para no avanzar o botar al player de la plataforma o causarle daño al player o no mover el player, etc.
//Ejemplo, si el player colisiona, no mueve la plataforma:
var player_colisiona = false
with ( obj_player ) { if ( place_meeting(x,y,obj_wall) ) { player_colisiona = true } }
if ( player_colisiona = true ) { x = xprevious; y = yprevious; obj_player.x -= x_offset; obj_player.y += y_offset } //Esto regresa tanto a la plataforma como al player a la posición anterior.
}

Yo he llamado al player "obj_player", pero tu le pones el nombre que usaste tú

Saludos
Los siguientes usuarios dieron las gracias a este tema: 3dgeminis, LastSparkle

12
Preguntas y respuestas / Re:Sistema de scripts de XSE
« en: Enero 16, 2020, 10:58:44 pm »
Hola FernandoNavarro

Interesante, yo lo hice con un ini, en el parámetro "section" puse el número de script y luego en el parámetro "key" le puse un número en orden correlativo.

Ejemplo:
[1]
1="lock"
2="faceplayer"
3="release"

Entonces corrí in while loop mesclado con la función "ini_key_exists" para saber si aún me faltaban líneas por leer y ya las iba leyendo.

Leí los comandos como "string", pero lurgo los ejecuté como scripts que tenía creados en el árbol de recursos de Game Maker.

Cree scripts con la programación dentro llamados así:
ev_lock
ev_faceplayer
ev_release

Y los llamé buscando el asset index primero y luego usando un script_execute.
Un ejemplo rápido:
var evento = ini_read_string("1","1","")
script_execute(asset_get_index("ev_"+evento))

Para los argumentos fue más complejo porque usé un script tokenizer para convertir cada palabra adicional en un argumento adicional para mi script.

Quizás te sirvan algunos aspectos de mi idea

Saludos
Los siguientes usuarios dieron las gracias a este tema: FernandoNavarro

13
Preguntas y respuestas / Re:Hola me podrian ayudar
« en: Enero 14, 2020, 03:29:30 am »
Hola XxBL100xX

Nunca he jugado Megaman, pero por lo que entedí de lo que escribiste, quieres que al soltar rápido el botón haga un disparo simple y al manterner pulsado y luego solar, entonces haga un disparo fuerte.

Para eso mi sugerencia es que uses una variable para medir durante cuánto tiempo has pulsado el botón, y que al soltar el botón, en base al tiempo, haga un disparo u otro.

Una forma sencilla de lograr esto sería hacer lo siguiente:
En el Create Event declaras la variable
Código: [Seleccionar]
carga = 0
En el Step Event, cargas y luego disparas.
Código: [Seleccionar]
if keyboard_check(vk_space) { carga = min(room_speed,carga+1) } //Esto cargará el disparo mientras mantienes pulsado la tecla espacio (hasta un máximo de 1 segundo)
if keyboard_check_released(vk_space) { //Esto ocurre al soltar el botón
if carga = room_speed { creas el disparo poderoso } //Si cargaste al máximo, hace el disparo poderoso
else { creas el disparo normal } //Si no cargaste el máximo, entonces hace un disparo normal.
carga = 0 //Resetea la variable carga para que empiece a cargar desde 0 para cuando quieras disparar otra vez.
}

Eso es en términos generales, ahí tu adapta el código a como mejor te parezca y como mejor se adapte a tu proyecto.
Lo que hace el código de arriba es que al mantener pulsado espacio, por cada STEP que pasa te sube la variable carga en 1.
Usé la variable "room_speed" que mide la cantidad de STEPS que hay en 1 segundo, por defecto es 30.
Eso quiere decir que si mantienes pulsado espacio por 30 STEPS (1 segundo) hace el disparo fuerte.
Si lo sueltas antes, hace el disparo normal.
Al hacer el disparo debes resetear la variable carga a cero de nuevo para que al volver a disparar, te vuelva a contar el tiempo desde cero.

Puedes complementar el Script anterior con un draw event para dibujar una barra de carga o modificar la pose del jugador o el color de la pistola, así el jugador recibe información visual de si ya se cargó lo suficiente para hacer el disparo poderoso o el disparo simple.

Si quieres más o menos tiempo, modifica el valor de "room_speed" por el número que quieras para modificar el tiempo de carga.

Saludos
Los siguientes usuarios dieron las gracias a este tema: XxBL100xX

14
Preguntas y respuestas / Re:if - else?
« en: Enero 02, 2020, 11:56:37 pm »
Hola Ikaro3d

Según como lo veo yo, el código no funciona bien, no sé que habrá hecho el instructor, de hecho no tiene mucho sentido para mi que se escriba un "else" después de cada keyboard_check.

Para mi lo que tiene sentido es que se haga algo así:
Código: [Seleccionar]
if keyboard_check(izquierda) {
//Moverse a la izquierda
}
else if keyboard_check(derecha) {
//Moverse a la derecha
}
else {
//No moverse
}

PD: la palabra izquierda y derecha dentro del Keyboard Check es referencial, ahí pones la tecla que quieras comprobar

Saludos
Los siguientes usuarios dieron las gracias a este tema: Ikaro3d

15
Preguntas y respuestas / Re:Verificar si se esta en una room
« en: Diciembre 29, 2019, 03:24:55 pm »
hola jhgv

puedes usar la variable "room".
Ejemplo:
Código: [Seleccionar]
if (room = room_intro) { room_goto(etapa1) }
Los siguientes usuarios dieron las gracias a este tema: jhgv

Páginas: 1 2 3 ... 9