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

241
Preguntas y respuestas / Re:Error WallJump
Agosto 09, 2018, 05:37:56 AM
Hola ZELDA

Veo en tu código que lo que causa el error es la variable "walljump" que toma valor -1 o 1.
Con sinceridad te digo que esa variable no le entrega ninguna utilidad a tu código, si la eliminas solucionas el problema.

Al iniciar, asumo que walljump tiene valor 1, significa que puedes hacer wall jump SÓLO en la pared de la derecha, si intentas hacer en la izquierda, no funciona.
Una vez que haces el salto en la pared, walljump toma valor -1, significa que ahora SÓLO puedes hacer walljump en la pared izquierda, si intentas en la derecha no funciona.
Si eliminas la condición "& walljump =" y eliminas la asignación de la variable, ya podrás hacer walljump en ambas paredes.

Saludos
242
Hola Marcusmaniacus

Te he escrito un código sencillo que puede reemplazar el sistema de preguntas de los popup messages, aunque pienso que mi método es un poco arcaico.
Tu puedes modificar lo que quieras para adaptarlo a tus necesidades.

Para ello necesitamos un objeto visible y sin sprite, yo lo he llamado "obj_msg_box", es el encargado de pausar el juego y mostrar las preguntas.

CREATE EVENT
surface = surface_create(view_wview[0],view_hview[0]) //Crea una surface momentanea del tamaño de la view
surface_copy(surface,0,0,application_surface) //Copia el frame anterior a la nueva surface
instance_deactivate_all(true) //Desactiva todos los objetos (menos el cuadro de texto) como falso efecto de pausa
question = "" //Es la pregunta (la recibe desde el script)
choises = ds_list_create() //Son las respuestas (las recibe desde el script)
answer = 0 //Es la línea que estás eligiendo como respuesta, 0 es la primera
width = 0 //Es el ancho que tomará el cuadro (lo calcula en el script)
height = 0 //Es el alto que tomará el cuadro (lo calcula en el script)


DESTROY EVENT
if ds_exists(choises,ds_type_list) ds_list_destroy(choises) //Elimina la lista del cache
if surface_exists(surface) surface_free(surface) //Elimina la surface del cache
instance_activate_all() //Re-activa todas las instancias (un falto efecto de despausa)

/*La respuesta seleccionada está en la variable "answer", la puedes usar para tomar decisiones aquí
ej: ejecutar un script o pasarle la variable a otro objeto, etc.*/


STEP EVENT
if keyboard_check_pressed(vk_down) {
answer += 1 //elige la opción de abajo
if answer > ds_list_size(choises)-1 answer -= ds_list_size(choises) //si ya no había más opciones, vuelve al inicio
}
if keyboard_check_pressed(vk_up) {
answer -= 1 //eliga la opción de arriba
if answer < 0 answer += ds_list_size(choises) //si no había más opciones, salta al final
}

if keyboard_check_pressed(vk_enter) { instance_destroy() } //Seleccionas la respuesta


GAME END EVENT
if ds_exists(choises,ds_type_list) ds_list_destroy(choises) //elimina la lista del cache
if surface_exists(surface) surface_free(surface) //elimina la surface del cache


DRAW EVENT
draw_surface(surface,view_xview[0],view_yview[0]) //Dibuja el "frame anterior" (para dar el efecto de pausa)
var xx = view_xview[0]+(view_wview[0]/2)-width //Arregla este código, no supe calcular el centro de la pantalla jajajaj
var yy = view_yview[0]+(view_hview[0]/2)-height //lo mismo aca
var offset = string_height(question) //es la cantidad de pixeles que se salta para dibujar la siguiente línea
draw_set_colour(c_dkgray)
draw_rectangle(xx,yy,xx+width,yy+offset,false) //dibuja un rectangulo gris oscuro donde va la pregunta
draw_set_colour(c_white)
draw_rectangle(xx,yy+offset,xx+width,yy+height,false) //dibuja un rectangulo blanco donde van las respuestas
draw_set_colour(c_black)
draw_rectangle(xx,yy,xx+width,yy+height,true) //dibuja un borde negro en el recuadro
draw_text(xx,yy,question) //Escribe el texto de la pregunta
for (var i=0; i<ds_list_size(choises); i+=1) { //for loop con la cantidad de respuestas
var resp = ds_list_find_value(choises,i) //recibe la respuesta como string
draw_line(xx,yy+offset,xx+width,yy+offset) //dibuja una línea separadora arriba
draw_text(xx,yy+offset,resp) //Escribe el texto de la respuesta
if answer = i { //checkea si estoy seleccionando esta respuesta
    draw_set_alpha(0.4)
    draw_set_colour(c_aqua)
    draw_rectangle(xx,yy+offset,xx+width,yy+offset+string_height(resp),false) //dibuja un rectángulo azul para indicar que estoy seleccionando esta respuesta
    draw_set_alpha(1)
    draw_set_colour(c_black)
}
offset += string_height(resp) //varía la posición de dibujo para dibujar la siguiente respuesta justo debajo de la respuesta anterior
}


Este objeto lo crearemos desde un script, yo lo he llamado "scr_question()", pero tu le puedes poner como quieras

SCRIPT "SCR_QUESTION()"
///scr_question(pregunta,respuesta1,[respuesta2],...)
var args = argument_count //cuenta la cantidad de argumentos del script
var pregunta = argument[0] //recibe la pregunta como string
var inst = instance_create(0,0,obj_msg_box) //Crea y ejecuta el create event del objeto msg box
with inst { //aplica el siguiente código al objeto recién creado
question = pregunta //le pasa la pregunta al objeto de texto
width = string_width(pregunta) //calcula el ancho del cuadro de texto
height = string_height(pregunta) //calcula el alto del cuadro de texto
for (var i=1; i<args; i+=1) { //crea un for loop para cada respuesta
ds_list_add(choises,argument[i]) //le pasa las respuestas al objeto de texto
width = max(width,string_width(argument[i])) //re-calcula el ancho del cuadro de texto
height += string_height(argument[i]) //re-calcula el alto del cuadro de texto
}
if ds_list_size(choises) = 0 instance_destroy() //Se auto_destruye si el script se llamó sin argumentos de respuesta.
}


Su uso: desde cualquier objeto del juego, usa scr_question(pregunta,respuesta1,respuesta2,respuesta3,etc)
Se creará el objeto "obj_msg_box" que creará un falso efecto de pausa y mostrará un cuadro en la pantalla con la pregunta y todas las respuestas hacia abajo. Usas las flechas para moverte entre las respuestas y pulsas Enter para elegir una respuesta, eso despausará el juego.

La variable que guarda la respuesta es "answer" y la tiene el objeto "obj_msg_box", una vez que se destruye, pierdes la respuesta. Por favor notar que no le puse ningún código para que realice acciones según la respuesta elegida, ese código lo debes crear tu, tu eres el que sabe que debe hacer cada respuesta.

PD: Cada línea del código tiene su comentario al lado que explica su función

Saludos
243
Hola Marcusmaniacus

La función show_message_ext existió hasta GM8, en GMS1.4 pasó a ser obsoleta.

Y no hay manera de evitar que desaparezca el full screen cuando creas un pop-up message, por eso el "show_message" sólo debería usarse para debug.

Mi sugerencia es que crees tus propios cuadros de preguntas, utilizando objetos

Saludos Cordiales
244
Preguntas y respuestas / Re:Problema depth en juego 3d
Agosto 08, 2018, 03:07:32 AM
Hola Ares074

Nunca he usado 3D en game maker, pero tengo la ligera sensación de que tu error lo provoca el alpha test (desactivado por defecto).

Intenta usar la función:
draw_set_alpha_test(true)
Eso activará el alpha testing para poder dibujar los sprites con la transparencia correcta.

Saludos Cordiales
245
Hola Marcusmaniacus

Intenta con:
With Obj_Personaje_De_Marco instance_destroy()

Saludos
246
De nada, que bueno que te haya servido el mensaje.

Con gusto vería tu juego  :) me gusta ver de qué es capaz la gente con Game Maker y más aún si dices que es algo 3D.

Saludos
247
Preguntas y respuestas / Re:Error con vertex buffer
Agosto 05, 2018, 08:12:30 PM
Hola Edgamer63

Yo sufría ese mismo error en juegos 2D cuando intentaba ejecutar muchos draw events de muchos objetos al mismo tiempo, nunca he creado un juego 3D pero supongo que ocurre el mismo problema.
No sé como funciona el 3D de game maker, pero en los juegos 2D, los objetos fuera de cámara seguían ejecutando su draw event y saturaban la capacidad de dibujo.

Intenta desactivar los objetos lejanos con alguna de las funciones "instance_deactivate" o simplemente ponle un "if" al inicio del draw event que evite que se ejecute el dibujo si su distancia a la cámara es muy grande.

Saludos
248
Hola royer11

En ese caso creales una variable de colisión
Ej:
detectar = false

Reemplaza el evento colisión por el evento step.
En el step event del objeto mensaje pone:
If place_meeting(x,y,obj_player) {
if detectar=false {
instance_create(x,y,object2)
detectar=true
}
}
else {
detectar = false
}

Eso hará que detecte la colisión una sola vez y la vuelva a detectar si sales y entras denuevo en el rango de colisión

Ojo que eso no evita el problema de generar muchos object2, tienes que buscar una manera de hacerlos desaparecer después

Saludos
249
Hola royer11

No deberia haber problemas. En el ojeto mensaje, crea un evento de colisión con el player y ponle:
instance_create(x,y,object2)
Instance_destroy()

Eso hace que el objeto mensaje cree el objeto 2 en su misma ubicación y se autodestruya para evitar que se generen un object2 en cada step que el player colisiona con el mensaje

Cada mensaje es independiente y ejecuta su código por separado, si destruyes uno, no se destruyen los demás

Saludos
250
Hola dani_gym
Para calcular la posición, debes hacer un random entre el (x2-x1) y le sumas x1. Si tu "objeto área" tiene un sprite rectangular, entonces puedes usar su boundary box como x1 y x2 mediante las funciones "bbox_left" y "bbox_right"
En este código te muestro un ejemplo de cómo hacerlo.
var xx = bbox_left + irandom(bbox_right - bbox_left)
var yy = bbox_top + irandom(bbox_bottom - bbox_top)
Instance_create(xx,yy,obj_enemy)

Favor notar que para leer correctamente la boundary box, ese código tiene que correr en el objeto obj_player1, si quieres hacer correr el código desde otro objeto, entonces tienes que llamar a la bbox del player con "obj_player1.bbox_left".
Si no te funciona, puedes cambiar las funciones bbox por las coordenadas en la room

Saludos
251
Hola wilmerroa

Antes que nada, quiero felicitarte por el orden de tu código jajajaj me encantó, déjame desordenarlo un poco para ver si podemos corregir tu problema. Primero te diré la lógica que pensé y luego te pegaré el código que escribí.

Estás detectando mediante la función "device_mouse_check_button(0,mb_left)" cuando el primer dedo entra en contacto con la touch screen del dispositivo, esto genera 2 problemas... 1- el contacto se detecta en cualquier punto de la pantalla, 2- no puedes detectar un segundo dedo (ej: para pulsar el botón de golpe y el joystick al mismo tiempo).
Mi sugerencia es que en el CREATE EVENT del objeto "obj_analog_stick" crees una variable que controle con qué dedo estás pulsando el joystick, y que guarde "noone" si ningún dedo se está usando. Yo la he declarado como: "StickPressed = noone"

Para establecer un rango de detección, usé la función "point_in_circle" que detecta si un punto está dentro de un circulo, el punto son las coordenadas X e Y del dedo y el círculo lo establecí como 200 pixeles a la redonda a partir del centro del Stick Boundary.
Esto significa que tu "stick" ahora detecta una colisión a 200 pixeles a su alrededor (un poco más grande del tamaño del sprite que usa un radio de 146, es para que haya menos margen de error).

Cuando tu objeto joystick detecta un dedo y ese dedo está en el rango de detección, entonces le asignas a la variable StickPressed el valor del dedo que usaste para pulsar el joystick (0 o 1), de esa forma, puedes mover el dedo a cualquier parte de la pantalla y el joystick seguirá moviéndose, aunque te salgas de la zona de detección, eso permite un movimiento más fluido y evita que la persona deba mantener su dedo cerca de la zona de detección...

Ahora... si la variable tiene el valor de un dedo cualquiera, pero quitas ese dedo de la pantalla, la variable vuelve a valor "noone" y resetea el joystick a su posición original.

Acá va el código que pensé para corregir tu problema:
En el CREATE EVENT (en cualquier parte)
StickPressed = noone

En el STEP EVENT del objeto "obj_analog_stick" coloca:
/// actualizar stick analógico

//Este evento ocurre si NO he pulsado el rango del joystick
if StickPressed = noone {
//Checkea si el dedo 0 está en el rango de 200 pixeles
if (device_mouse_check_button(0,mb_left)) && point_in_circle(device_mouse_x_to_gui(0),device_mouse_y_to_gui(0),guiX,guiY,200) {
    StickPressed = 0; //Pulsé el rango con el dedo 0
}
//Checkea si el dedo 1 está en el rango de 200 pixeles
if (device_mouse_check_button(1,mb_left)) && point_in_circle(device_mouse_x_to_gui(1),device_mouse_y_to_gui(1),guiX,guiY,200) {
    StickPressed = 1; //Pulsé el rango con el dedo 1
}
//checkea si pulsé el rango con cualquiera de los dos dedos
if StickPressed != noone {
    // actualizar coords de mouse GUI solo si se presiona el mouse
    guiMouseX = device_mouse_x_to_gui(StickPressed);
    guiMouseY = device_mouse_y_to_gui(StickPressed);
    }
else {
// snap back to origin
    if (point_distance(stickX,stickY,guiX,guiY) >= snapRate*image_xscale) {
        var dir = point_direction(stickX,stickY,guiX,guiY);
        stickX += lengthdir_x(snapRate*image_xscale,dir);
        stickY += lengthdir_y(snapRate*image_xscale,dir);
    }
    else { // prevents overshooting
        stickX = guiX;
        stickY = guiY;
    }
}
}

//Este evento ocurre SI ESTOY pulsando el joystick
else {
    //Detecta si solté el dedo, en tal caso desactiva el joystick
    if !device_mouse_check_button(StickPressed,mb_left) {
        StickPressed = noone
        exit
    }
    //Actualiza la posición del Joystick, esto le permite al player moverse aunque se arrastre el dedo fuera del rango de detección
    guiMouseX = device_mouse_x_to_gui(StickPressed);
    guiMouseY = device_mouse_y_to_gui(StickPressed);

// update stick coords
    if (point_distance(guiX,guiY,guiMouseX,guiMouseY) <= radius*image_xscale) {
        stickX = guiMouseX;
        stickY = guiMouseY;
    }
    else { // constricción se adhieren a los límites
        var dir = point_direction(guiX,guiY,guiMouseX,guiMouseY);
        stickX = guiX + lengthdir_x(radius*image_xscale,dir);
        stickY = guiY + lengthdir_y(radius*image_xscale,dir);
    }


}

Te desordené un poco el código y las llaves y quizás olvidé algunos signos de cierre ";", pero eso ya lo puedes corregir tu...

Coméntanos si te funciona.

Saludos Cordiales
252
Preguntas y respuestas / Re:GM2/Version gartuita
Agosto 02, 2018, 03:11:14 AM
Hola Ikaro

Los módulos de exportación de Game Maker o licencias para cada plataforma se compran.
Incluso es más, con la versión gratuita ni siquiera deberías ser capaz de generar un archivo ejecutable para PC, pero puedes testear tu juego cuantas veces quieras desde el programa, sin restricción alguna.

Saludos
253
Preguntas y respuestas / Re:Tamaño celdas grid
Agosto 01, 2018, 10:24:37 PM
Hola Dublan
No sé que tienes en mente, pero si te refieres a las funciones "ds_grid", no es posible modificar el tamaño de la celda, cada celda es capaz de guardar un solo dato.

Si quieres guardar dos valores por celda tienes que implementar tu propia técnica, ya sea utilizar hexadecimales, separadores de carácteres, usar operaciones binarias, o alguna fórmula matemática, etc

Saludos
254
Preguntas y respuestas / Re:txt->ds list/array->txt
Agosto 01, 2018, 03:02:52 AM
Hola Dublan

Algunas correcciones:
1- En el "while loop", estás usando la función "file_text_readln" que a parte de leer la línea, lee carácteres de control no deseados que después podrían aparecer en tu archivo final, como espacios o saltos de línea. Para evitar eso, cámbialo por lo siguiente:
str[valor++] = file_text_read_string(file);//Un array de 1D
file_text_readln(file);

2- El principal problema del código es que tu "for loop" debe tener el signo "menor" en la condición, de esta forma:
for (i=0; i<15; i++)//Numero de palabras a encontrar

3- Como consejo, la función "randomize()" se usa sólo 1 vez y al inicio, no 15 veces dentro de un for loop, lo que hace la función es cargar una semilla aleatoria para que game maker use para generar los próximos números aleatorios, pero no es necesario cambiar la semilla 15 veces, si no usas ni una sola vez el randomize(), GM creará siempre el mismo patrón de número aleatorios.

4- Y último, el índice del array debe tener la función "irandom()" que es la que te genera el número aleatorio.
file_text_write_string(buscarlas, str[irandom(array_length_1d(str)-1)]);

Espero no haberte confundido con la explicación... corrigiendo las 4 líneas, el código debería funcionar a la perfección.

Saludos
255
Preguntas y respuestas / Re:txt->ds list/array->txt
Julio 31, 2018, 07:42:29 PM
Hola Dublan
Tu primer código lo veo casi bien, tiene dos detalles, en el for loop, estás cerrando el archivo en el primer loop, así qué sólo te grabará 1 línea de las 15, coloca el file_text_close afuera.
Además en el random usas como índice "3650". Siento que es más preciso usar la función "array_length_1d(str)-1"

Si con esas correcciones sigue sin funcionar, ve si estás guardando el archivo de texto en el directorio correcto, en appdata -> local -> nombre de tu juego

Saludos