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

Páginas: 1 2
1
Preguntas y respuestas / Re:¡MODELOS 3D MUY PESADOS!
« en: Septiembre 24, 2019, 08:12:13 pm »
Anim8tor? .d3d? ¿Qué año es este xD?

Fuera de broma, no vale la pena que uses .d3d el formato es muy malo, es mejor que lo exportes a .obj y crees un script para importar .obj que no son muy complejos de entender
Los siguientes usuarios dieron las gracias a este tema: Product_Indepen_HQ

2
Noticias / Re:¡Discord test!
« en: Septiembre 03, 2019, 06:16:08 pm »
A mi me ha salido bastante útil para tener la notificación de cuando responde a un tema que me interesa.
Los siguientes usuarios dieron las gracias a este tema: Johann

3
Preguntas y respuestas / Re:Optimización del dibujado en 3D
« en: Septiembre 03, 2019, 05:55:51 pm »
Me refiero al orden de dibujo, como te decía lo mas costoso es enviar cosas a la GPU, por eso debes minimizar ese número de llamados lo más que puedas... En general hablando de GMS no hay mucho que puedas hacer en ese sentido pero igual debes tratar de agrupar los objetos antes de dibujarlo de la siguiente forma:

Para todos los objetos opacos:

* textura -> modelo -> otras propiedades

Luego de dibujar todos los objetos opacos dibujas los objetos semitransparentes agrupándolos así:

* profundidad -> textura -> modelo -> otras propiedades

Eso quiere decir, que si tienes la siguiente lista de objetos:

Código: [Seleccionar]
1. ModeloA -> TexturaA
2. ModeloB -> TexturaA
3. ModeloB -> TexturaB
4. ModeloA -> TexturaA
5. ModeloA -> TexturaA
6. ModeloA -> TexturaA
7. ModeloA -> TexturaB
8. ModeloC -> TexturaA

En vez de dibujarlos en el orden en el que los creaste, deberías agruparlos y ordenarlos para que al momento de dibujarlos queden así:

Código: [Seleccionar]
1. ModeloA -> TexturaA
4. ModeloA -> TexturaA
5. ModeloA -> TexturaA
6. ModeloA -> TexturaA
2. ModeloB -> TexturaA
8. ModeloC -> TexturaA
7. ModeloA -> TexturaB
3. ModeloB -> TexturaB

Como puedes ver ahí: primero dibujamos todos los modelosA que tengan texturaA luego dibujamos todos los modelosB con texturaA y los modelosC con texturaA... luego pasamos a la texturaB y dibujamos todos los modelosA con texturaB luegos los modelosB, etc...

Con esto lo que logramos es: mandar a la GPU la texturaA, luego mandar a la GPU el modeloA, cuando ya no necesitemos el modeloA pero si la texturaA entonces enviamos el modeloB pero conservamos la texturaA hasta que ya no necesitemos el modeloB y luego hasta que no necesitemos la texturaA en ese caso enviamos la texturaB y de ese modo solo enviamos cosas a la GPU cuando necesitemos hacerlo.

No se si me expliqué bien.

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

4
Preguntas y respuestas / Re:Optimización del dibujado en 3D
« en: Septiembre 03, 2019, 04:57:05 pm »
Hay varias razones por las cuales te estan bajando los FPS.

Cuando usas d3d_draw_block, en cada frame estas creando un modelo para cada cubo y luego dibujándolo, eso toma mucho tiempo no solo en crearlo sino en enviarlo a la GPU (Que es un proceso bastante lento), lo que tienes que hacer es crear en el evento create el modelo de los cubos (o de un solo cubo si es que lo estas dibujando muchas veces) y luego dibujarlo con d3d_model_draw

Ahora, no es solo eso, en general cada vez que haces un cambio de alguna información a la GPU es un proceso que se toma bastante tiempo, por ejemplo si tienes 100 cubos diferentes con 100 texturas diferentes entonces por cada cubo que trates de dibujar tienes que enviar nueva información a la GPU no solo para el modelo (vertices, coordenadas de texturas, normales, etc) sino también para la textura de cada uno de esos objetos.

Para trabajar con esto puedes hacer:

* Usar un atlas de texturas: En vez de tener una imagen por cada edifico por ejemplo, ten una imagen que contenga todas las texturas de todos los edificios, así estos pueden compartir esa textura y no necesitas reenviar esa data a la GPU (esto lo debes hacer manualmente igualmente) pero para que esto funcione todos los edificios tienen que dibujarse continuamente, es decir: si tienes 2 edificios y una esfera entonces es mas optimo dibujarlos así: edificio->edificio->esfera, ya que si los dibujas así: edificio->esfera->edificio entonces entras en el mismo problema de volver a mandar la data de las texturas multiples veces.

Por otro lado, es mucho más optimo tener todos los edificios en un solo modelo y enviarlo así sea que se dibujen todos en cada frame, que tener cada edificio individualmente.. por la misma razón, cuando los tienes todos en un solo modelo, solo necesitas enviar esa data a la GPU una vez por frame, incluso si estas dibujando 100 edificios.

Por ejemplo, en este pequeño ejemplo que hice, todo el nivel se dibuja en un solo objeto, a pesar de que el suelo y los muros tienen texturas diferentes:


Ahí te copié unos pensamientos de modo desordenado, la verdad es que esto es un tema bastante complejo y deberías dedicarle un tiempo a aprender como funciona el rendering pipeline en openGL para que entiendas cuales son los mejores procedimientos.

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

5
Preguntas y respuestas / Re:Berkshire Swash
« en: Junio 17, 2019, 04:35:53 pm »
Tienes que instalarla en tu carpeta de fuentes, por lo general lo que puedes hacer es bajarte la fuente, abrirla y te debe aparecer una ventana con una visualización de la fuente y un botón que dice "Instalar".

O de forma manual, debes verificar que la fuente este en la carpeta: "C:\Windows\Fonts" (Ahí puedes encontrar Arial y el resto)

Luego que de la coloques ahí reinicia GM y la próxima vez que lo abras te debe aparecer en la lista de fuentes

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

6
Preguntas y respuestas / Re:variable global
« en: Marzo 15, 2019, 08:47:10 pm »
Puedes utilizar las funciones variable_global_exists(nombre) para saber si existe, variable_global_get(nombre) para obtener su valor y variable_global_set(nombre, valor) para colocarle un valor.

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

7
si, se puede con el keyword "with"

with (all) {
    // Aquí pones el código
}
Los siguientes usuarios dieron las gracias a este tema: StephanRocket

8
Juegos en desarrollo / Re:Gun.smoke fangame
« en: Diciembre 30, 2018, 02:33:20 am »
Las imágenes si se ven normal, son 3... el juego esta muy bien hecho, siempre me gustó mucho guns.smoke, en cuestión de programación veo que lo has replicado bastante bien, cada enemigo se comporta como debería y el jefe también fue interesante.

Como tal no vi errores en el juego así que de resto queda ver que tan bien avanzas el proyecto.

muchos ánimos
Los siguientes usuarios dieron las gracias a este tema: LuciaHedgehog

9
Preguntas y respuestas / Re:Problema en colisión con la nada
« en: Diciembre 29, 2018, 06:17:52 pm »
Esto sucede porque necesitas re ubicar a tu personaje una vez detecte que va a estar por fuera del área.

Por decir algo, si tu jugador ya estaba a medio traspasar el área y simplemente le dices que deje de caer, pues el se va a quedar ahí donde estaba...

Para solucionarlo no sabría como decirte específicamente ya que no se como es el objeto del área como tal, pero la solución se vería algo así (Te dejo los cambios documentados):

if(!place_meeting(x,y+19,obj_area)){
    gravity=0;
    vspeed=0;
    gravity_direction=270;

    // Aquí debes re ubicar al personaje, esto depende de tu juego
    y = bordeInferiorDelArea - offsetDelTamanoDelPersonaje;
}else{
    gravity=2;
}

if(!place_meeting(x,y-19,obj_area)){
    vspeed=0;

    // Aquí debes re ubicar al personaje, esto depende de tu juego
    y = borderSuperiorDelArea + offsetDelTamanoDelPersonaje;
}
   
if(keyboard_check(vk_left)) {
    if(place_meeting(x-19,y,obj_area)) {
        hspeed=-3
    } else {
        hspeed=0;
    }
}

if(keyboard_check(vk_right)){
    if(place_meeting(x+19,y,obj_area)) {
        hspeed=3
    }else{
        hspeed=0;
    }  
}

if(keyboard_check_pressed(vk_up) and vspeed=0){
    vspeed=-20;
}
   
if(keyboard_check_released(vk_up)){vspeed=vspeed/2;}
if(keyboard_check_released(vk_left)){hspeed=0;}
if(keyboard_check_released(vk_right)){hspeed=0;}

No te va a funcionar así obviamente porque depende de la posición del area y también del tamaño del jugador y su punto de rotación, entre otros...

Pero esa es básicamente la solución

Saludos
Los siguientes usuarios dieron las gracias a este tema: elmmeronw, elmmertonw

10
Preguntas y respuestas / Re:Error visual con distance_to_object
« en: Diciembre 29, 2018, 06:08:08 pm »
Si tuviera que adivinar tiene que ver con tus condiciones en el if/else:

Supongamos que la posición del enemigo es enemigo.x+7.
por lo tanto la condición if enemigo.x+5 < x se cumple.
así que el enemigo se mueve x -= 2.5; y su nueva posición es enemigo.x+4.5

ahora en el próximo frame, se prueba de nuevo la condición:

if enemigo.x+5 < x? no, en este caso x  = enemigo.x+4.5
por lo tanto entra en la condición del else
así que el enemigo se mueve x += 2.5; y su nueva posición es enemigo.x+7 nuevamente,

En el próximo frame vuelve a moverse a 4.5, luego a 7 y así, ese es el efecto que te esta sucediendo.

Este es tu problema, para solucionarlo de forma rápida podrías probar:

if distance_to_object(enemigo) < 400  and enemigo.image_alpha = 1
{
if enemigo.x+5 < x
{
    sprite_index = spr_enemigo_craneo_camin_izq
    x -= 2.5
    image_speed = 0.16
}
else if enemigo.x-5 > x // Esta linea de código es el cambio
{
    sprite_index = spr_enemigo_craneo_camin_der
    x += 2.5
    image_speed = 0.16
}
}

Saludos
Los siguientes usuarios dieron las gracias a este tema: Taki-A

11
Preguntas y respuestas / Re:bala multi objetivos que sigue a enemigos
« en: Diciembre 23, 2018, 06:41:29 am »
Puedes obtener la instancia mas cerca utilizando la funcion instance_nearest(x, y, obj) luego le asignas esa instancia a la bala que creas para que esta solo siga a ese enemigo:

Esto lo pondrías cuando crees la bala:

//Primero obtenemos la posición del enemigo mas cercano
var enemigo = instance_nearest(x, y, objEnemigo);

//Ahora creamos la bala
var bala = instance_create(x, y, objBala);

//Le decimos a la bala a que enemigo debe seguir
bala.enemigoObjetivo = enemigo;

Ahora en el objeto de la bala, en el evento step, depende de como tengas el sistema de movimiento esto puede cambiar. Yo lo voy a mover utilizando un método facil

//Necesitas una velocidad para la bala
var velocidad = 3;

//Obtenemos la dirección hacia el enemigo
direction = point_direction(x, y, enemigoObjetivo.x, enemigoObjetivo.y);

//Ahora movemos la bala en esa direccion con una velocidad
x += lengthdir_x(velocidad, direction);
y += lengthdir_y(velocidad, direction);

Esto debería funcionar, al menos de forma básica, ya a partir de esto puedes adaptarlo a tus necesidades.

Saludos
Los siguientes usuarios dieron las gracias a este tema: LuciaHedgehog, AzTaki-De

12
Preguntas y respuestas / Re:Shaders- negativo y distorcion de sprite
« en: Diciembre 21, 2018, 07:49:16 pm »
Hola, no puedo escribirte un shader y que lo puedas utilizar porque la verdad es un efecto complejo que requiere de temas específicos de tu juego, sin embargo el modo en el  que funcionaría es el siguiente:

Dices que los objetos deben quedar de color negativo cuando están detrás de un circulo. Los pasos entonces serían los siguientes:

Primero: Dibuja el circulo en un surface

Segundo: Crea un shader y dibuja los objetos a ser afectados por el utilizándolo
    * Este shader recibirá no solamente el objeto a dibujar sino también el circulo que dibujaste en la surface
    * En el fragment shader debes detectar si el pixel que estas dibujando esta dentro del pixel del circulo ya dibujado
    * Si es así, inviertes los colores haciendo algo como
            colorInvertido = vec4(1.0, 1.0, 1.0, 1.0) - elColorDelPixelNormal;

hasta es punto es relativamente sencillo, si bien no te puedo copiar un shader ahora mismo, hace unos años hice un video tutorial sobre como dibujar la siueta de personajes detras de otros objetos, es básicamente la misma teoría solo que en vez de dibujar el color de la silueta dibujas el color invertido, este es el video:

https://www.youtube.com/watch?v=uMDteIbgY64

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

13
por lo que entiendo, este es tu script para generar una serie de obstaculos:

instance_create(room_width+(8*32) , 692 , obj_box); // obstáculo
instance_create(room_width+(8*32) , 618 , obj_box);
instance_create(room_width+(12*32) , 525 , obj_coin); // moneda
instance_create(room_width+(20*32) , 525 , obj_box);
instance_create(room_width+(20*32) , 618 , obj_coin);

ahí es donde debes decirle en que carril estan:

var obstaculo;

obstaculo = instance_create(room_width+(8*32) , 692 , obj_box); // obstáculo
obstaculo.carril = 3; //por decir algo

obstaculo = instance_create(room_width+(8*32) , 618 , obj_box);
obstaculo.carril = 2;

instance_create(room_width+(12*32) , 525 , obj_coin); // moneda

obstaculo = instance_create(room_width+(20*32) , 525 , obj_box);
obstaculo.carril = 1;

instance_create(room_width+(20*32) , 618 , obj_coin);

Si el jugador inicia en el medio por ejemplo, entonces en el evento create puedes poner que esta en el carril 2

carril = 2;

Y luego cuando presiones arriba para cambiar de carril, le restas 1 y cuando baje de carril le sumas 1
Los siguientes usuarios dieron las gracias a este tema: wilmerroa

14
hmm depende de varios factores, pero digamos que la regla general es que si no ves que sea necesario (que se ponga lento el juego) entonces no hace falta que lo implementes, obviamente hay un limite, si tienes 100 instancias puede que no lo notes, pero si tienes 1000 puede que sea mas notable (o no)

así que primero puedes probar rapidamente colocando el maximo numero de unidades que crees que puedan existir (deberia existir un limite incluso siendo un rts) y mira si se pone lento (en varios pcs si puedes hacerlo)

saludos.
Los siguientes usuarios dieron las gracias a este tema: Seirlord_Games

15
Preguntas y respuestas / Re:Problemas con Alarmas
« en: Diciembre 19, 2018, 08:48:45 pm »
es porque lo tienes en el evento step.

el evento step se ejecuta una vez por frame, es decir que en cada frame lo estas colocando en room_speed(30) y por eso no llega a 0, por eso mismo cuando lo pones en 1 funciona, porque  al final del frame llega a 0.

Para solucionarlo, incia la alarma de la siguiente forma:

// Revisamos si la alarma esta desactivada
if (alarm[0] == -1)  {
  // activamos la alarma
  alarm[0] = room_speed;
}

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

Páginas: 1 2