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

46
Agrega keyboard_clear(ord("T")) al final del evento keyboard_pressed T del obj_dialogo.

Keyboard_clear limpia el estado de la tecla, de manera que no se ejecutarán eventos o comprobaciones que dependan de la tecla después de usada la función. Los eventos relacionados al teclado se ejecutan entre Begin Step y Step, al ponerla al final del evento keyboard_pressed T previenes que el mismo teclazo sea usado luego en el evento Step para crear otro dialogo.
47
Nos estas mostrando el código, no el error que produce. Si tuviera que adivinar, diría que el error es que las variables key_right, key_left y/o walk_spd no han sido declaradas, pero no sé si las estas declarando en otra parte del código y el error es otro.

Viendo el tipo de código que es, si las variables están declaradas se verían así:

[gml]key_right = keyboard_check(vk_right);
key_left = keyboard_check(vk_left);
walk_spd = 4;[/gml]

Tal vez con otros valores para las teclas o la velocidad. Busca si ese código es parte del proyecto y si no lo es prueba agregándolo al inicio de la función.
48
La función variable_instance_set puede modificar variables de objetos cuyo nombre se pasa como string, buscala en el manual.
49
Prueba primero cambiando el orden de dibujo para la surface, si no te funciona subes el demo para revisarlo.
50
Sospecho que es un asunto de orden de dibujado, trata de usar el código en el evento Draw End, o asegurate de que el código de la surface sea el último en ser ejecutado durante el evento Draw.
51
No existe manera de implementar delta timing en un proyecto avanzado sin tener que adaptar el código del proyecto.

Aparte de computadoras sin la potencia para correr el juego a su velocidad normal, no es normal que un juego vaya más rápido o más lento en unas u otras máquinas. Sé que hace algún tiempo hubo un bug en que si el juego se mostraba en algunos monitores con frecuencia de actualización superior aceleraba la lógica del juego, pero el bug ya había sido arreglado, considera enviar un reporte de bug a Yoyogames, mientras más detalles puedas dar mejor, versión de GMS, modelo de computadora, tarjeta de video y monitor, probablemente te vayan a pedir también una copia de tu proyecto para probar.
52
GameMaker tiene muchas maneras de mover objetos, que manera en especifica es la más apropiada pasa usar depende del caso, y habría sido mejor que mostraras la manera en que tú estás moviendo el objeto para ayudarte a arreglar ese código.

En todo caso, acá te dejo una manera de mover el objeto como quieres:

[gml]Dist = min(6,point_distance(x,y,mouse_x,mouse_y));
Dir = point_direction(x,y,mouse_x,mouse_y);

Xx = lengthdir_x(Dist,Dir);
Yy = lengthdir_y(Dist,Dir);

if Xx > 0 move_contact_solid(0,abs(Xx));
if Xx < 0 move_contact_solid(180,abs(Xx));
if Yy > 0 move_contact_solid(270,abs(Yy));
if Yy < 0 move_contact_solid(90,abs(Yy));[/gml]

En este código la variable Dist tiene la distancia que el objeto va a moverse por step, que será ente caso 6 o la distancia hasta el mouse, el que sea el valor menor. Cambiando el número 6 por otros valores cambia la distancia máxima que el objeto se mueve.

La variable Dir tiene la dirección hacia el mouse desde el objeto.

Usamos esos 2 valores junto con las funciones lengthdir_ para calcular el factor vertical y horizontal del movimiento del objeto, los calculamos por separado para que el objeto se mueva como quieres de manera que si no puede moverse horizontalmente al menos mantenga el movimiento vertical, o viceversa.

Finalmente cambiamos la posición del objeto con la función move_contact_solid, que moverá un objeto en la dirección determinada la distancia indicada o hasta encontrar un objeto sólido. La función tiene la particularidad de que si le pones valores negativos se vuelve loca así que hay que asegurarnos de pasarle un valor positivo, y eso significa tener condiciones para las 4 direcciones básicas.

Dejo un ejemplo con ese código para que lo veas en uso.
53
Haz que el código compruebe colisiones progresivamente antes de cambiar la posición del objeto en lugar de cambiarla de golpe:

[gml]var recoil_check = recoil
do{
   var recoil_x = lengthdir_x(recoil_check,obj_gun.image_angle);
   var recoil_y = lengthdir_y(recoil_check,obj_gun.image_angle);
   recoil_check--
}until (!place_meeting(x-recoil_x,y-recoil_y,obj_pared) || recoil_check < 0)
x = x - recoil_x
y = y - recoil_y[/gml]

Con ese código se prueba la posición final del objeto antes de moverlo, si la posición tiene colisión se revisa la anterior a esa, y si esa tiene colisión la anterior, y así hasta que encuentre un posición libre donde poner el objeto.
54
Ese código efectivamente crea una surface del tamaño del room, cualquiera que sea el problema que estas teniendo no es por ese código.
55
Revisaste que los respaldos funcionaran? El punto del respaldo es no tener que buscar soluciones externas, solo remplazas el proyecto por el respaldo y sigues trabajando.

Sobre tu pregunta, no conozco ningún software gratuito para reparar imágenes corrompidas, y según lo poco que conozco del tema, aún el software pago falla la mayoría del tiempo si el daño esta pasado la cabecera del archivo.
56
El GMS 1 tiene una opción para crear respaldos cada vez que salvas, me parece que la opción viene activada por defecto con 5 respaldos permitidos, mientras no hayas desactivado la opción, ni te hayas puesto a probar el juego varias veces "para ver si ahora si funciona" deberías poder recuperar un estado anterior de tu proyecto.

Los respaldo se guardan por defecto en la ruta C:\Users\UserName\Documents\GameMaker\Backups, encontrarás carpetas con los nombres de los proyectos que has creado con GMS 1, y dentro de ellas más carpetas numeradas, la carpeta 0 posee el respaldo más reciente.
57
Es tu juego, eres tú el que tiene que decidir que solución es mejor para tu caso, personalmente me iria por un if ya que parece ser la solución más simple, pero también hay que tomar en cuenta que cambios es probable que ocurran a futuro en tu juego para determinar que es más útil y adaptable.
58
En el código que pones en ningún momento estas agregando elementos a la lista. Cuando tratas de tomar el valor de una posición en una lista y la posición está vacía el GM regresa el valor undefined.

Es por eso que el error te pone que no puede resolver la variable, estás pidiendo el valor de undefined.objet, que desde el punto de vista del programa no tiene ningún sentido.

Agrega código que se asegure de que la lista no este vacía antes de tomar elementos de ella o asegúrate de que la lista siempre tenga al menos un elemento.
59
Recuerda que los else solo se ejecutan si su if es falso, en el caso del código que pones:
[gml]
if keyboard_check (vk_up) {dir = "arriba"} ///funciona
else if  keyboard_check (vk_down) {dir = "abajo"} ///funciona
else if  keyboard_check (vk_left) {dir = "izquierda"} ///funciona
else if  keyboard_check (vk_left) + keyboard_check (vk_up) or keyboard_check (vk_down) {dir = "izquierda"} ///Error
else if keyboard_check (vk_right) { dir = "derecha"} ///funciona
else if keyboard_check (vk_right) + keyboard_check (vk_up) or keyboard_check (vk_down) {dir = "derecha"} /// error[/gml]

Desde el comienzo cuando presionas vk_up o vk_down el código ignora todas las otras comprobaciones, incluyendo las comprobaciones de si Up o Down están presionados junto a otra dirección horizontal.

Puedes solucionarlo checando las direcciones horizontales primero de manera que sean ellas las que tengan prioridad, o checando las direcciones verticales y horizontales en diferentes ifs anidados de manera que la última comprobación sobreescriba la primera. Por cierto, ya que el resultado de vk_left  es el mismo que el de vk_left + vk_up or vk_down puedes quitar la comprobación más compleja, lo mismo para vk_right.

Al final yo lo dejaria así:

[gml]if keyboard_check (vk_up) {dir = "arriba"}
else if  keyboard_check (vk_down) {dir = "abajo"}

if  keyboard_check (vk_left) {dir = "izquierda"}
else if keyboard_check (vk_right) { dir = "derecha"}[/gml]
60
Al principio iba a decirte que usaras el reset cuando adquieras un mensaje nuevo, al inicio del código en step, pero decidí replicar tu código y note que eso solo hacia que funcionara de vez en cuando, hice varias pruebas por mi cuenta y sinceramente no encuentro donde esta el problema, podría ser un fallo en el engine Scribble, en cuyo caso tocaría ponerse en contacto con su creador y mostrarle tu código, entonces el podrá decirte si efectivamente es un fallo en Scribble o si simplemente no lo estamos usando correctamente.

En todo caso, si prefieres una solución que no requiera comunicarte con el creador, puedes usar .flush en lugar de .typewriter_reset al principio del evento step.

[gml]if (string_length(mensaje) < string_length(referencia.msg[indice])){
    mensaje += referencia.msg[indice]
   scribble(mensaje).flush()
}[/gml]

flush elimina el elemento, de manera que la próxima vez que sea usado no tiene otra opción mas que crearlo de 0.