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

61
Hola

A partir de GM Studio ya no puedes creo (que alguien corrija si me equivoco).

La única forma de darle acceso al proyecto a alguna carpeta del ordenador sería pedirle acceso al usuario que ejecuta el juego con una función llamada "get open filename" o algo así.

Sino, por lo menos en windows que uso yo, todos los archivos se crearán en la carpeta Local de la Appdata.

Saludos
62
Hola Arcadian

Cuando cambias de Room, los objetos persistentes NO vuelven a ejecutar ni su Create Event ni su Creation Code.

Si estás teniendo un problema, quizás la causa está en otro lado. Quizás algún objeto de la nueva room te está re-creando el objeto nuevamente en la nueva room.

Si nos explicas bien el problema que estás observando y nos explicas cómo deberían funcionar tus eventos, quizás podamos encontrar la causa y corregir el problema.

Saludos
63
Preguntas y respuestas / Re:Implementar double tap
Enero 17, 2020, 03:14:45 AM
Hola FernandoNavarro

Perfecto xD
No sé en qué momento asignas la variable "bolCanRun" para poder correr, sólo veo el "intCounterL = 2" pero eso no activa la alarma para activar el bolCanRun, quizás está un poco incompleto el código. Además 0.2 Steps de tiempo es casi NADA a menos que hayas cambiado la room_speed a una más lenta. Te sugiero dar 2 o 3 Steps de gap por lo menos.

Lo otro, es que como son variables separadas, cuando sueltes la tecla derecha para cambiar a la izquierda, el personaje dejaría de correr.
Eso sería una molestia para el jugador a la larga.

Como sugerencia, cuando vas corriendo y sueltas la tecla derecha, creale un delay de un par de Steps para que el jugador tenga tiempo de soltar la tecla y luego pulse Izquierda, sigas corriendo sin apretar el Doble Tap de nuevo.
Puedes aprovechar incluso el mismo delay de la alarma en el keyboard_check.

if ( (intCounterL == 1 or bolCanRun = 1 ) and keyboard_check(vk_left))
{
    intCounterL = 2;
}

Esa nueva condición del "bolCanRun" hará que cuando pulses la tecla izquierda y ya estabas corriendo de antes en cualquiera de las 4 direcciones, sigas corriendo ahora hacia la izquierda.

Saludos
64
Hola Black_Cat

Es bastante difícil, en ese caso, para dibujar e interactuar con una mano falsa de forma dinámica (donde no existen objetos carta en la mano como tal para detectar mouse o colisión).
Te recomiendo primero crear la mano como una Data Structure de tipo "ds_list" (pienso que es la que mejor aplica para este caso).
Cada carta debe tener un ID único, su ID debe hacer referencia a un sprite y a ciertas estadísticas que tendría la carta en combate, entonces cada vez que ganas una carta a la mano, añades el ID a la DS List.

Create Event
cards = ds_list_create() //Esto crea una DS Structure llamada "cards", ojo que luego hay que eliminarla, sino queda en la memoria cache de GM
card_width = sprite_get_width(spr_card) //yo he llamado "spr_card" a mi sprite y cada subimagen es un ID diferente de carta, tu puedes usar el sistema que quieras
card_height = sprite_get_height(spr_card) //Guardo el ancho y alto para no andar usando "sprite_get" a cada rato.
gap = 32 //Esta es la separación en pixeles que tendrá cada carta cuando se dibujen en la mano.
position_clicked = -1 //La posición de la carta que estoy seleccionando (o -1 si no hay ninguna clickeada)


en el evento Cleanup / Destroy / Game End / o cualquiera que quieras llamar para destuir la DS List. Ojo que si cierras el juego, se hace call al evento "Game End", pero NO al evento "destroy".
if ds_exists(cards,ds_type_list) ds_list_destroy(cards) //destruyes la DS List creada antes de la memoria

En el Draw Event, para dibujar la mano, simplemente usa un "for loop" y dibujas cada carta con la separación de la variable "GAP".
var hand_width = card_width*min(1,ds_list_size(cards))+max(0,ds_list_size(cards)-1)*gap //Esto calcula el ancho en pixeles de la mano, uso una variable local (con Var) en vez de una Instance Variable porque el tamaño de la mano varía constantemente.
for (var i=0; i<ds_list_size(cards); i+=1) { //Inicia el for loop desde 0 hasta la cantidad de cartas menos 1.
var card_id = ds_list_find_value(cards,i) //Esto trae el ID de la carta desde la Data Structure
draw_sprite(spr_card,card_id,(room_width-hand_width)/2+i*gap,room_height-card_height) //Aquí yo he dibujado mi Sprite llamado "spr_card" y la sub-imagen la usé como el ID de mi carta
}


Step Event
if mouse_check_button_pressed(mb_left) { //Esto es para clickear sobre la mano falsa, intenta crear otra condición para evitar que pulses 2 objetos al mismo tiempo, me refiero a los objetos que existen debajo de la mano al mismo tiempo que clickeas la mano.
var hand_width = card_width*min(1,ds_list_size(cards))+max(0,ds_list_size(cards)-1)*gap //Vuelve a calcular el tamaño de la mano en pixeles
if hand_width > 0 && point_in_rectangle(mouse_x,mouse_y,(room_width-hand_width)/2,room_height-card_height,(room_width+hand_width)/2-1,room_height-1) { //En caso que tengas más de
0 cartas (en realidad hago check al ancho en pixeles de la mano, pero si hay 0 cartas la mano mide 0 pixeles), esto detectará la posición de la carta que hayas pulsado, si pulsaste la primera, la segunda, etc.
position_clicked = 0 //Este es el valor por defecto que agarra en caso que tengas 1 carta, para seleccionar la posición cero que es la única que hay.
if ds_list_size(cards) > 0 { //En caso que tengas más de cero cartas
if mouse_x >= (room_width+hand_width)/2 - card_width { position_clicked = ds_list_size(cards)-1 } //Primero revisas si pulsas la carta de la derecha (la carta que se dibuja completa), y luego selecciona la última posición de la DS List.
else { position_clicked = (mouse_x - (room_width-hand_width)/2) div gap } //Sino, calcula la carta que clickeaste según el GAP, si clickeaste a 3 GAP de distancia, entonces es porque pulsaste la tercera carta xD
//Aquí detecta que has clickeado una carta de la mano y guarda la posición en la ds_grid en la variable "position_clicked" para uso futuro.
//Puedes abrir quizás algún objeto menú que diga "inspeccionar Carta", "Colocar en Campo", "Cancelar acción", etc.
//Si por alguna razón creas un objeto menu, debes evitar que este bloque de código te vuelva a detectar un clic sobre la mano falsa mientras esté abierto ese menú, quizás usando algún "if !instance_exists()" adelante de todo.
//Puedes usar la variable "position_clicked" en el Draw Event para darle información visual al player de la carta que clickeó, quizás dibujándola ligeramente más arriba que las otras o dibujarle algún outline de otro color.
}
}
else { position_clicked = -1 } //Esto sirve para deseleccionar la carta en caso que clickees fuera de la mano, puedes dejarlo así o usar tu propio método (quizás con algún botón "Cancelar Acción")
}


Para testear el código, en algún lado debes darte cartas en la mano, quizás cuando pulsas alguna tecla, sólo para testear si el código funciona o no.
if keyboard_check_pressed(ord("N")) { ds_list_add(cards,0) }

Saludos
65
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
66
Hola FernandoNavarro

Yo hice algo parecido hace poco, pero depende de la cantidad de eventos que quieres asignar al NPC es la complejidad del sistema.

Si necesitas sólo "lock" y "release", te sugiero crear una variable en el NPC que evite la ejecución de su Step Event normal.

Ej:
if ( lock = true ) { exit; }

Y luego solo haces true o false el valor de esa variable si quieres bloquearlo o desbloquearlo.

Saludos
67
Hola Black_Cat

Si el tablero de juego tiene una estructura definida y fija, mi sugerencia es que uses objetos para la posición del mazo, pila de descarte y cartas del campo. Eso para poder detectar la colisión con mayor facilidad usando las funciones integradas de Game Maker.

Para la mano por otro lado, no es cómodo usar objetos porque tendrías que reposicionarlos cada vez que ganas o pierdes una carta, entonces mi sugerencia es que dinámicamente generes el draw event y detectes la colisión en función de la cantidad de cartas que tengas en la mano.

Saludos
68
Preguntas y respuestas / Re:Implementar double tap
Enero 15, 2020, 12:53:45 AM
Hola FernandoNavarro

Mi sugerencia es que uses una tecla diferente para correr distinta a la de las 4 direcciones, en algunos juegos de play se corría con la "X" y te movías con el JoyStick.

Saludos
69
Preguntas y respuestas / Re:Hola me podrian ayudar
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
carga = 0

En el Step Event, cargas y luego disparas.
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
70
Hola Fabriyin

Pienso que tu error es que estás asignando la variable BJ1 al objeto incorrecto, debes cambiar la variable en el player 1 o en el player 2 según quién destruyó el Power Up.

Para saber si la Bola del Power Up la rompió el Jugador 1 o el Jugador 2, de alguna forma la Bala tiene que tener una variable para saber qué objeto la creó.
Si no sabes como asignar variables a otros objetos, una forma más sencilla de comprender pero menos óptima de lograr lo que quieres es usando 2 objetos diferentes, un objeto "bala1" para reconocer la bala creada por el player1 y un objeto "bala2" para reconocer la bala creada por el player2.

Cuando destruyes la Bola (supongo que lo haces en un evento colisión), si la bola fue destruida por la bala del player 1, usa este código:
with obj_player1 BJ1 = 1
Reemplaza "obj_player1" por el nombre que le hayas dado al objeto del player 1
Si la bala fue destruida por el player 2, entonces mencionas el objeto del player 2.

Eso debería activar correctamente la variable "BJ1" en el player para que haga el doble disparo.

Saludos
71
Fabriyin

Hola, yo quiero hacer algo contigo papu :$
72
Preguntas y respuestas / Re:Alarmas imprecisas
Enero 14, 2020, 03:07:10 AM
Hola El bananita

Eso puede ocurrir quizás porque modificas la Room Speed.
Una room_speed de 30 significa que caben 30 steps en 1 segundo. Si pones una alarma de 30 steps, se activará pasado 1 segundo.
Si cambias la room_speed a 20, significa que caben 20 steps en 1 segundo. La misma alarma de 30 steps ahora dura 1.5 segundos.

Saludos
73
Preguntas y respuestas / Re:if - else?
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í:
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
74
hola jhgv

puedes usar la variable "room".
Ejemplo:
if (room = room_intro) { room_goto(etapa1) }
75
Cita de: T789 en Diciembre 18, 2019, 05:47:56 PM
Parece buena sugerencia pero el problema es que tendria que volver a reiniciar los sonidos y los estados de los demas objetos y por como los tengo seria un infierno hacer todo ese progreso

Vamos nada es imposible en GM y tampoco quiero nada que ver con el room_persistemt

Si quieres evitar usar el room persistent y ahorrarte lo de crear un archivo txt externo, puedes intentar re-ejecutar el create event de algunos objetos clave usando:
with obj_player event_perform(ev_create,0)
with obj_enemy event_perform(ev_create,0)
etc

Eso haría al objeto "obj_player" y al objeto "obj_enemy" volver a ejecutar su "create event" aunque no hayan sido realmente creados de nuevo.

Incluso Game Maker permite crear eventos personalizados para tus objetos.
Puedes crear un evento "Other" (esos del diamante verde) llamado "User Defined" y elijes uno de los 12 eventos disponibles.
En ese evento puedes colocar el código que inicia el status de cada objeto y llamarlo con la función:
event_perform(ev_other,ev_user0)
En ese evento puedes colocar el código que resetearía el estado de cada objeto a su estado inicial y además colocar el x=xstart/y=ystart
Así puedes efectuar un "falso reset" de la room.

Saludos