Menú

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.

Menú Mostrar Mensajes

Mensajes - BssString

#1
Hola Bird Sick Games

El código de T789 está correcto a mí parecer, pero el error está en que si vas a la derecha, el giro debe ser en sentido horario en vez de anti-horario.

Cambia esta línea:
[gml]dir = (dir+90) mod (360); //Giro anti-horario[/gml]

Por esta línea:
[gml]dir = (dir-90) mod (360); //Giro horario[/gml]

Saludos
#2
Hola juantrix666

En GM8 se podía usar una "string" para acceder a la variable creo, pero en GM Studio ya no se puede hacer.

Deberías pensar en un sistema diferente, tal vez utilizando arrays en el objeto original y pasarle el array y la posición que vas a editar al script (en vez del nombre de la variable) y que el script edite el array en el objeto original. Un script sólo puede modificar el array original usando el accesor de los arrays que es el signo "@".
Aquí puedes encontrar más información sobre eso:
https://docs2.yoyogames.com/source/_build/3_scripting/3_gml_overview/13_accessors.html

También los scripts pueden operar como "funciones" si usas el comando "return", así que otra opción es que tu script sea un cálculo, pero no modifique ninguna variable, sino que retorne un nuevo valor para usarlo después.

Ejemplo, si creo un script llamado "doble" que me duplica el valor del número que le paso como argumento:

[gml]///doble(numero)
return argument0 * 2[/gml]

Y luego en mi objeto uso:
[gml]var num = 1
num = doble(num)[/gml]

Ahora mi variable "num" alojará el número 2 porque aplicó el cálculo del script y el script retornó un nuevo valor que luego se lo asigné a la variable.

Saludos
#3
Hola kostra

Tu código de generación de terreno no es nada eficiente, falla en el Step event, en esta parte específicamente:
[gml]if procesos {
    //mover plantilla
    x = floor( irandom_range(2048,room_width-2048)/16 )*16;
    y = floor( irandom_range(2048,room_height-2048)/16 )*16;[/gml]
Mueves la planitlla a una zona aleatoria del mapa 100 veces y si cae en una zona repetida, la volverá a analizar y perderá tiempo ahí, aunque no modifique las tiles, sí hace los loops y ejecuta los IFs.

Además usas la función:
[gml]if collision_point(i,j,oterraingen,true,false)[/gml]
Esa función es bastante lenta, se debería usar en partes específicas. Tu for loop analiza 2048 pixeles de 16 en 16 (128 cálculos) tanto para X como para Y, lo que da como resultado que usas la función lenta 128 x 128 = 16.384 veces durante los primeros 100 step del juego.

Mi recomendación es que sigas un sistema como el que sugiere marco13rpg que no te haga repetir los cálculos en una zona que ya calculaste previamente o cambies el collision_point por un cálculo más rápido (que no sé la utilidad que cumple esa función en tu juego, no sé qué tan crítica sea para el código porque no lo entendí bien, sorry).

Saludos
#4
Hola El bananita

Para conectar el juego en la misma computadora, el cliente debe conectarse a la IP "127.0.0.1" que es el localhost.
Para conectar el juego de forma local entre 2 dispositivos conectados al mismo router, puedes usar la IP que te da el IP config: "192.168.x.x" (no es necesaria la apertura de puertos)
Para conectar el juego de forma online, entre 2 dispositivos conectados a diferente router, tendrás que usar la IP pública del server, puedes consultar en google cuál es tu IP pública, y para este método sí es necesaria la apertura de puertos, o tu router rechazará las conexiones entrantes.

Saludos.
#5
Hola Momoni

El código dependerá de cómo creaste la cuadrícula, si usaste ojetos en la room o algún sistema de datos como la ds_grid o los arrays.

Para empezar, el código que calcula la cantidad de minas al rededor del bloque no debería ir en el Step Event porque eso hará que se ejecute en cada frame de tu juego, si corres el juego a 30fps, ese código se ejecutará 30 veces por segundo.
Basta con que se ejecute al inicio y ya, en el create event o en algún evento posterior (pero sólo 1 vez)

No hay forma de revisar múltiples colisiones sin hacer un loop, ya sea un "While", un "With" o un "For".

Pero como en tu caso sólo hay 8 bloques al rededor, lo puedes escribir a mano de la siguiente manera:
[gml]cminas = position_meeting(x-32,y-32,obj_mina) + position_meeting(x,y-32,obj_mina) + position_meeting(x+32,y-32,obj_mina) //Detecta la cantidad de minas de la fila de arriba
+ position_meeting(x-32,y,obj_mina) + position_meeting(x+32,y,obj_mina) //detecta colisión con minas en la fila del medio, a la izquierda y derecha del bloque
+ position_meeting(x-32,y+32,obj_mina) + position_meeting(x,y+32,obj_mina) + position_meeting(x+32,y+32,obj_mina) //detecta colisión en la fila de abajo[/gml]

Desconozco realmente si el código funciona separado por enter, pero tú lo pones todo en 1 misma línea en tu GM.

favor notar que estoy usando "position_meeting" en vez de "place_meeting", lo que hace la función es detectar si en un punto específico de la room se encuentra el objeto indicado, la detección de colisión la hace contra la colisión que tiene asignada el sprite, asumí que tu sprite mide 32x32 y la colisión también.
En caso de detectar colisión, devuelve "true" (que para Game Maker es 1), en caso contrario, devuelve "false" (que para GM es 0)

Entonces imagina que el bloque tiene una mina a la izquierda y una mina arriba a la derecha, la fórmula hará el siguiente cálculo:
cmina = 0 + 0 + 1
 + 1 + 0
+ 0 + 0 + 0

Y como resultado tendrás que ese bloque tiene 2 minas rodeandolo.

Saludos
#6
Preguntas y respuestas / Re:Simbolos de orden numerico.
Noviembre 22, 2020, 06:10:37 PM
Hola Marth

Eso no es posible.
La diferencia es que 'º' y 'ª' no son superíndices como tal, sino que son carácteres como cualquier otra letra, la diferencia es que cuyo dibujo sólo ocupa la parte de arriba del espacio disponible y da la sensación de que son superíndices.

Puedes crear tu propia fuente a partir de un sprite y usar como "er" algún caracter que no ocupes, así sólo tienes que dibujar "er" en alguna subimagen de la fuente y ya la puedes usar como caracter.
O algo más complejo podría ser dibujar la palabra "er" con una fuente más pequeña justo después de tu texto original y así dar la sensación de que es un súper índice.

Saludos
#7
Hola DarkKRuleR

Insisto en que puede ser problema del culling, a mi no me pasa... desactivalo y manda un screenshot de cómo te anda el dibujo.
Desactivar el back face culling hace que la figura dibuje las 2 caras, sin importar el orden de los vértices, así si miras la figura desde distintos ángulos, siempre se dibujará completa.

GMS 2
[gml]gpu_set_cullmode(cull_noculling)[/gml]

GMS 1.4
[gml]d3d_set_culling(false)[/gml]

Saludos
#8
Ahhhhh
Esa opción creo que es el Face Culling. Activar el Back-Face Culling hace que NO se dibuje la parte trasera del triángulo, quizás la has activado en algún momento y la tengas que desactivar.

GMS2
[gml]gpu_set_cullmode(cullmode)[/gml]

GMS1.4
[gml]d3d_set_culling(enable)[/gml]

Saludos
#9
Hola Diego

No sé si se puede de forma masiva, pero al menos en GMS 1.4 cuando das clic secundario a la sección de "room" por ejemplo, sale la opción "add existing room" que te deja importar una room desde un archivo en tu computador, lo mismo con Scripts y Objetos.

Saludos
#10
Hola DarkKRuleR

Cada dibujo que haces, pasa por una Shader por defecto de Game Maker que hace ciertas correcciones "por si acaso" a lo que dibujas.
Puedes intentar evitar esa Shader para ver si eso tiene alguna mejora en el código o no.

Simplemente crea una nueva Shader, llámala como quieras y no le hagas ningún cambio, déjala tal como la genera Game Maker.
En el Draw_Event usas:
[gml]shader_set(tu_shader_aqui)
//tus draw events aqui
shader_reset()[/gml]

Eso hará que Game Maker en vez de usar la Default Shader, usará tu Shader que has generado que no tiene código.

Esa información se encuentra en este artículo:
https://help.yoyogames.com/hc/en-us/articles/216754868-Optimising-The-Draw-Pipeline

Otra cosa que puedes hacer es obviamente NO dibujar a los personajes que se encuentren fuera de cámara.

Saludos
#11
Hola Alemar5

A mi entender no, Game Maker se volvió multiplataformas y ya no tiene muchas funciones asociadas a Windows.
Quizás alguna dll de terceros lo pueda hacer, pero directamente las funciones de Game Maker no pueden.

Saludos
#12
Hola DarkKRuleR

Mejor crear el objeto (como triángulo) en un programa externo (como Blender que es gratuito) e importar el .OBJ o no?
y la textura en .PNG

Saludos
#13
Preguntas y respuestas / Re:Generación Procedural
Octubre 07, 2020, 08:09:40 PM
Hola Luis

Una idea rápida es que puedes combinar dos ciclo FOR para recorrer cada casilla de la room y crear un objeto al azar ahí.
No entiendo qué variables has usado, ni qué hace cada objeto, así que lo explicaré de forma genérica y tu lo adaptas a tus necesidades.
En el create event:

[gml]var i, j;
for (i=0; i<480; i+=16) {
for (j=0; j<640; j+=16) {
instance_create( j , i , choose(obj_bloque1,obj_bloque2,obj_bloque3) )
}
}[/gml]

Eso recorre cada casilla de la room y crea un objeto al azar entre los 3 bloques que puse de argumentos para la función "choose".
El problema de esto es que los objetos son creados al azar usando una distribución uniforme, eso significa que cada objeto tiene la misma probabilidad de ocurrencia (a menos que lo pongas dos veces dentro del choose, en ese caso el objeto tendría el doble de probabilidades de ser creado que los demás).

Un sistema mejor (pero más complejo) puede ser quizás crear un PERLIN NOISE que guarde un número de 0 a 1 en una DS_GRID y luego crear un objeto según el valor que está en la grid.
ej: si el número va de 0 a 0.2 que me cree oceano, hasta 0.7 que me cree el continente y si el número da mayor a 0.7 que me cree unas montañas, etc.

Saludos
#14
Hola T789

No pude imaginarme bien lo que intentas lograr, pero aquí va una sugerencia:
Puedes usar una DS_List para guardar las coordenadas del mouse en cada step (desde el primero al último)
Para el dibujo lo puedes hacer con un ciclo "for", que recorra la lista y dibuje los puntos en pantalla como líneas con el draw_line (para que haga la figura completa que dibujaste)
Y para la colisión, en el Step puedes hacer quizás un collision_line entre cada punto para ver si alguna parte del trazo hizo colisión con la onda o no. No sé que tan ineficiente sea ese sistema, supongo que con un montón de puntos se comenzaría a lagear.

Si sueltas el mouse, puedes limpiar la lista para eliminar los puntos y el trazo.

Al destruir el objeto o terminarse el juego, debes asegurarte de destruir la DS_List para liberar los archivos almacenados en el CACHE.

Saludos
#15
Preguntas y respuestas / Re:Sistema de PowerUps
Mayo 03, 2020, 11:25:11 PM
Hola T789!

Yo usé un sistema similar en uno de mis juegos donde mis personajes tenían habilidades pasivas, y la gracia es que a veces diferentes personajes podían tener la misma pasiva, entonces aprovechaba la misma programación.

Lo que hice fue llamar al script de la habilidad en ciertos momentos del código y modificar variables para causar diferentes efectos.

Ej, una pasiva que duplica el daño llamada "double_power" y que tiene valor true o false si la tengo o no.

En el Step
[gml]//Primero seteo el valor de las variables por defecto en el mismo Step Event

damage_modifier = 1
if (double_power = true) { scr_double_power() }
damage = 100*damage_modifier[/gml]

En la programación del scr_double_power
[gml]damage_modifier = 2 //Esto duplicará el daño de todos los personajes que tenan activa esa pasiva[/gml]

Lo que hace es que si NO tienes la pasiva, pegas 100 * 1.
En cambio si tienes la pasiva, corre el script y cambia el valor del modificador de daño a 2, entonces ahora pegas 100 * 2. Es un hechizo simple pero inquebrantable.

Supongo que a tu juego le podría servir un sistema similar, sólo debes elegir dónde llamar la habilidad, y qué variables usar/modificar.

Saludos