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

196
Buenas! Pues estoy haciendo un juego en equipo, de entrada no me planteaba hacerlo full 3D, pero he estado pensando que si pongo mucho trabajo en hacer modelos 3D ahorraré mucho al final... ejemplo:



Eso me ha enamorado. Modelos 3D sencillos, con pocos triángulos... algo así. El problema es, cómo hago en game maker para que no se vean los triángulos? Que se vea todo uniforme... o solo con poner las normales basta? o hay algún truco? Por ejemplo, fijáos en su pierna, se ve claramente que está separada en polígonos, pues evitar que pase eso en todo el cuerpo. A demás, en la imagen, los bordes y TODO en general se ve perfectamente uniforme, redondeado... cuando en realidad debe ser LOW POLY, por qué no se ve todo triangulizado, bordes en línea recta, etc?

A demás, qué programa me recomendáis para hacer modelos como los de la imagen, que luego pueda meter en GM y, digamos... rellenar sus coordenadas de textura. He estado tocando el Model Creator, hecho con GM para hacer modelos para GM, que incluso te exporta el código, pero no sé si es lo mejor.
197
Dios, este juego es jodidamente épico... (SPOILERS INCOMING)
-El niño, entre esa cara que tiene, el "what do we do now" constantemente (y dicho al final para rematar)...
-Las situaciones... la bengala que se cae, el pez y el pájaro roba llaves, y luego la bengala en el barco.. un tanto surrealista pero muy épico...

-Un contra, no pensásteis en aumentar la velocidad de movimiento de los personajes? Un tanto lento... (aunque si debía tener un tiempo mínimo de juego es una excusa)
-Cuál es el punto de tener dos personajes para moverse, más que "por que sí, porque mola"? Yo he ido todo el rato con el niño pero al final necesitaba al adulto para abrir la ventana... yendo todo el rato con el adulto sería suficiente. Aunque es curioso, y el sistema de intercambio de objetos mola. Aún así, si hubiérais hecho una zona sólo accesible para el niño, igual que lo de la ventana sólo puede hacerlo el adulto, hubiera sido un puntazo, igual de guay eso de que necesitabas un item que el adulto tenía. (o hay alguna zona sólo accesible para el niño y lo hice sin darme cuenta?)

Me costó bastante descubrir que debía usar conmigo mismo el pan y la goma de mascar (esta última tres veces), aunque lo decía el tutorial supongo que me salté la parte de "usar objetos contigo mismo" xDD
198
Tiene sentido.. o sea, que surface_get_texture no devuelve la textura en sí, sino un puntero a la textura DE LA SURFACE... lo cual a su vez es malo, porque si la surface se borra daría error... pero tiene muuucho sentido...
PD: probé lo del debugger pero no me daba ninguna información (la nueva actualización del GM Studio..), a parte no sabía a qué te referías con id de textura, porque yo pensaba que el get_texture te daba literalmente la textura, no un puntero

EDIT: vale, el manual dice específicamente que devuelve un puntero (qué ganas de liar...) mi culpa, pensé que había leido el manual, se me escapó eso.

background_get_texture(background_create_from_surface(surface128, 0, 0, 128, 128, false, false));

Con esto ya funciona, muchas gracias :D tema resuelto
199
Perdona por liar tanto el problema, vengo con el testeo DEFINITIVO. SIN FUNCIONES AUXILIARES, así es más fácil

// Pruebas
if (keyP(ord('P'))) {
    d3d_end(); d3d_set_lighting(false);
    if (!surface_exists(surface128)) surface128 = surface_create(128, 128);
    surface_set_target(surface128);
   
    draw_clear_alpha(c_white, 0);
        draw_sprite(sprEliMano, 1, 64, 64);
        draw_sprite(sprEliPluma, 0, 64, 64);
    txtManoLR = surface_get_texture(surface128);
   
    draw_clear_alpha(c_white, 0);
        draw_sprite(sprEliMano, 3, 64, 64);
        draw_sprite(sprEliPluma, 1, 64, 64);
    txtManoLUR = surface_get_texture(surface128);
   
    draw_clear_alpha(c_white, 0);
        draw_sprite(sprEliMano, 3, 64, 64);
        draw_sprite(sprEliPluma, 2, 64, 64);
    txtManoLU = surface_get_texture(surface128);
   
    draw_clear_alpha(c_white, 0);
        draw_sprite(sprEliMano, 3, 64, 64);
        draw_sprite(sprEliPluma, 3, 64, 64);
    txtManoLUL = surface_get_texture(surface128);
   
    draw_clear_alpha(c_white, 0);
        draw_sprite(sprEliMano, 1, 64, 64);
        draw_sprite(sprEliPluma, 4, 64, 64);
    txtManoLL = surface_get_texture(surface128);
   
    draw_clear_alpha(c_white, 0);
        draw_sprite(sprEliMano, 1, 64, 64);
        draw_sprite(sprEliPluma, 5, 64, 64);
    txtManoLDL = surface_get_texture(surface128);
   
    draw_clear_alpha(c_white, 0);
        draw_sprite(sprEliMano, 3, 64, 64);
        draw_sprite(sprEliPluma, 6, 64, 64);
    txtManoLD = surface_get_texture(surface128);
   
    draw_clear_alpha(c_white, 0);
        draw_sprite(sprEliMano, 3, 64, 64);
        draw_sprite(sprEliPluma, 7, 64, 64);
    txtManoLDR = surface_get_texture(surface128);
   
    if (txtManoLR == txtManoLUR and txtManoLUR == txtManoLU and txtManoLU == txtManoLUL and txtManoLUL == txtManoLL and txtManoLL == txtManoLDL and txtManoLDL == txtManoLD and txtManoLD == txtManoLDR) show_message("EL MUNDO ESTA LOCO");
   
    surface_reset_target();
    d3d_start(); d3d_set_lighting(true);
}


Adivina qué... un precioso cartel mostrando EL MUNDO ESTA LOCO se muestra ^_^ La idea es que LAS OCHO TEXTURAS acaban siendo la misma, no tenía nada que ver con el draw... es MUY RARO. Y lo más raro, esque las ocho son igual a la ÚLTIMA. Este código lo tengo en step, press tecla, para cambiar la textura

Las 8 variables de textura las inicio en Create, y son diferentes (testeado al hacer draw)

NOTA: en la versión anterior, que TAMPOCO funcionaba, hacía un set_target ANTES de CADA draw, y un reset_target al final, antes de coger CADA la textura. El problema puede no ser ese
200
Olvida el 128, es para detectar si debo crear-usar-devolver una surface de 128x128 o de 64x64, depende el tamaño de los sprites. Las coordenadas son porque el centro del sprite es el origen.

No entiendo lo que dices de mirar los índices de las texturas.. si yo tengo una variable que guarda una textura, la uso para dibujar, todo correcto, y al hacer el cambio... las 8 texturas se guardan con la MISMA imagen, cuando claramente no es así, la cosa es que... se asigna una misma a las 8, es muuy raro. No acabo de entender qué hacer :(

En el ejemplo que os puse arriba:
draw_sprite(sprEliPluma, i, 64, 64);

donde 0 <= i <= 7, añado distintas subimágenes de Pluma a cada textura, pues he hecho la prueba, y se utiliza la subimagen i=7 en las OCHO texturas cuando, claramente, guardo una distinta en cada una... es decir, es como si, al acabar el código, guardara en las OCHO texturas el resultado de la ÚLTIMA, cuando claramente estoy guardando una imagen distinta en cada textura
202
Exacto
203
Demasiado código para ponerlo.. pero lo he chequeado y está bien.

Una segunda comprobación:

txtManoLR = sprite_get_texture(sprEliMano, 1);
txtManoLUR = sprite_get_texture(sprEliMano, 3);
txtManoLU = sprite_get_texture(sprEliMano, 3);
txtManoLUL = sprite_get_texture(sprEliMano, 3);
txtManoLL = sprite_get_texture(sprEliMano, 1);
txtManoLDL = sprite_get_texture(sprEliMano, 1);
txtManoLD = sprite_get_texture(sprEliMano, 3);
txtManoLDR = sprite_get_texture(sprEliMano, 3);

Esa es la textura de la mano. Hay 2 posibles valores. Al testearlo ANTES de aplicar el código anterior de la surface, SE DIBUJA CORRECTAMENTE, es decir, en 3 casos se usa la subimagen 1, y en 5 casos la subimagen 3. Es decir, que las texturas originales funcionan, y el draw es correcto. Cuando hago el código de la surface que os he puesto antes, QUE SOLO MODIFICA ESAS TEXTURAS ANTERIORMENTE CREADAS CUYO DRAW EJECUTABA BIEN, al instante pasa a dibujarse sólo la subimagen 3 para los ocho casos, es decir, el código que hago en step, al pulsar la tecla P, con las surfaces, DEBE estar mal

scrIniciaCambioTextura(128);
    draw_sprite(sprEliMano, 1, 64, 64);
    draw_sprite(sprEliPluma, 0, 64, 64);
    txtManoLR = scrAsignaCambioTextura(128);
   
    scrIniciaCambioTextura(128);
    draw_sprite(sprEliMano, 3, 64, 64);
    draw_sprite(sprEliPluma, 1, 64, 64);
    txtManoLUR = scrAsignaCambioTextura(128);
   
    scrIniciaCambioTextura(128);
    draw_sprite(sprEliMano, 3, 64, 64);
    draw_sprite(sprEliPluma, 2, 64, 64);
    txtManoLU = scrAsignaCambioTextura(128);
   
    scrIniciaCambioTextura(128);
    draw_sprite(sprEliMano, 3, 64, 64);
    draw_sprite(sprEliPluma, 3, 64, 64);
    txtManoLUL = scrAsignaCambioTextura(128);
   
    scrIniciaCambioTextura(128);
    draw_sprite(sprEliMano, 1, 64, 64);
    draw_sprite(sprEliPluma, 4, 64, 64);
    txtManoLL = scrAsignaCambioTextura(128);
   
    scrIniciaCambioTextura(128);
    draw_sprite(sprEliMano, 1, 64, 64);
    draw_sprite(sprEliPluma, 5, 64, 64);
    txtManoLDL = scrAsignaCambioTextura(128);
   
    scrIniciaCambioTextura(128);
    draw_sprite(sprEliMano, 3, 64, 64);
    draw_sprite(sprEliPluma, 6, 64, 64);
    txtManoLD = scrAsignaCambioTextura(128);
   
    scrIniciaCambioTextura(128);
    draw_sprite(sprEliMano, 3, 64, 64);
    draw_sprite(sprEliPluma, 7, 64, 64);
    txtManoLDR = scrAsignaCambioTextura(128);


Y ahí véis claramente que, igual que la textura original, yo asigno la 1 en tres casos, y la 3 en cinco casos, pero los ocho se dibujan como la 3. Igual que con la Pluma, que asigno 8 subimágenes distintas, pero a la hora de dibujar sólo se aplica la número 0 en los ocho casos. Y el draw es correcto por lo dicho anteriormente, que antes de aplicar esto el draw va bien.

Debe haber algo que se me escapa con la surface, si realmente no encontrárais error os puedo pasar el draw, pero prefiero no hacerlo si no hace falta, porque veo que funciona
204
Buenash, pues no sé qué ocurre... tengo este code

d3d_end(); d3d_set_lighting(false);
   
    scrIniciaCambioTextura();
    draw_sprite(sprEliMano, 1, 64, 64);
    draw_sprite(sprEliPluma, 0, 64, 64);
    textura1 = scrAsignaCambioTextura();

......................................
   
    scrIniciaCambioTextura();
    draw_sprite(sprEliMano, 3, 64, 64);
    draw_sprite(sprEliPluma, 1, 64, 64);
    textura8 = scrAsignaCambioTextura();
   
    d3d_start(); d3d_set_lighting(true);


Los puntos suspensivos significa que hay muchos más "fragmentos" como los dos que véis (llamada a scrInicia, dos draw sprite y scrAsigna), hago muchos en orden, os pongo sólo el primero y el último. Ahora las funciones

if (!surface_exists(surface128)) surface128 = surface_create(128, 128);
    surface_set_target(surface128);
    draw_clear_alpha(c_white, 0);


surface_reset_target();
return surface_get_texture(surface128);


Como véis, tras desactivar el 3D y la iluminación, me dispongo a MODIFICAR varias texturas que tengo previamente creadas. Para comenzar inicializo llamando a la primera función: si la surface no existe la creo, entonces le hago target, la limpio transparente y entonces puedo dibujar. Para finalizar reseteo y devuelvo la textura.

El problema? Al finalizar, TODAS LAS TEXTURAS, digamos... son la misma, o aproximadamente. Por ejemplo, el sprEliPluma tiene 8 subimagenes, en cada textura le meto una distinta, pues al finalizar... resulta que a TODAS se ha aplicado la misma subimagen... e igual con sprEliMano. ¿Qué hago mal?

También tenía antes una versión en que el SET y el RESET de la surface lo hacía SÓLo al inicio y final y, entre medio, hacía todos los get_texture y todos los draw. También fallaba.

Las texturas que modifico (textura1, textura2...) son creadas previamente en create y usadas en draw.
205
Preguntas y respuestas / Re:Normales normalizadas en 3D
Febrero 03, 2015, 11:15:31 PM
Matemática básica... gracias, me estaba haciendo un lío entre usar pitágoras (o aristóteles, ya no me sé ni el nombre) haciendo la raíz cuadrada de los cuadrados de las componentes y demás... estoy muy verde. Aunque creo que sí era eso, pero me faltaba el DIVIDIR entre el módulo, era la clave...

Y sí.. el code es ese, sí funciona :) no faltan triangulos. Y el ++i funciona en GMStudio, en las anteriores era i += 1.

Vale, lo he hecho... y el resultado es el mismo! En el caso de
d3d_vertex_normal_texture(x-50-100*cos(degtorad(i*11.25)), y-50-100*sin(degtorad(i*11.25)), 109, cos(degtorad(i*11.25))/sqrt(2), sin(degtorad(i*11.25))/sqrt(2), 1/sqrt(2), i/2.67, 1.35);

Tenemos nz=1, y nx+ny = 1 siempre, pues una es el seno y la otra el coseno. Entonces el módulo sería sqrt(2) (alternativa a tu point_distance), divido.. y no cambia. Quiere decir que d3d_vertex_normal_texture ya normaliza por él mismo? Sería algo... lógico para ahorrar trabajo, y genial
206
Preguntas y respuestas / Normales normalizadas en 3D
Febrero 03, 2015, 06:39:17 PM
Buenash! Pues veréis, estoy haciendo un muro curvo, poniendo distintas normales para cada parte... y me dijeron que si no las normalizo peta... o se ve peor de lo que debería.

for (i = 0; i < 9; ++i) {
d3d_vertex_normal_texture(x-50, y-50, 0, cos(degtorad(i*11.25)), sin(degtorad(i*11.25)), 1, 4, 0);
d3d_vertex_normal_texture(x-50-550*cos(degtorad(i*11.25)), y-50-550*sin(degtorad(i*11.25)), 600, cos(degtorad(i*11.25)), sin(degtorad(i*11.25)), 1, i, 8);
}


Con ese código se dibuja un triángulo, si os fijáis tengo cos y sin en las normales.

La idea es que primero viene la normal 1,0,1 i al final 0,1,1, es decir, apuntar a la derecha, y abajo. Entremedio hay un cono de normales. Pero ninguna de ellas está normalizada... ¿esto afectará a la calidad? Veo que esto funciona, pero quizás no todo lo bien que podría funcionar... si fuera así, cómo hago para normalizarlas?
207
Muchas gracias por tu ayuda :D Bueno, no hice eso del projection_ortho, lo veía raro y no sabía volver al original. Tengo esto en Step:

// Pruebas
if (keyP(ord('P'))) {
    if (!surface_exists(surface64)) surface64 = surface_create(64, 64);
    d3d_end(); d3d_set_lighting(false);
   
    surface_set_target(surface64);
    draw_clear_alpha(c_white, 0);
    draw_sprite(sprEliCabeza, 6, 32, 32);
    draw_sprite(sprEliCabeza, 8, 32, 32);
    surface_reset_target();
    txtCabezaD = surface_get_texture(surface64);
   
    d3d_start(); d3d_set_lighting(true);
}


No logré darme cuenta que tenía que desactivar la iluminación, aún cuando se veía todo el sprite negro pero con el borde definido (sho ser tonto) pero ya funciona a la perfección. La surface la creo en el evento Create, y nunca hago free, ya uqe no hace falta: sólo habrá ESA y la usaré constantemente. En el caso en que el usuario, digamos, se equipa una armadura o un accesorio, el sprite de la parte del cuerpo cambia por ese mismo sprite + el accesorio, eso lo hago con la surface, chequeando si existe, si no la vuelvo a crear... y todo el rollo.

txtCabezaD es la textura que uso al dibujar. Declararé todas las texturas en Create, las usaré para dibujar, y cuando haga falta las cambio de esta manera.

En este caso espero que sólo el personaje principal usará la surface, y como mucho crearé 2-3, pero si más objetos, como otros personajes, necesitaran usar las surfaces.. bueno, no habría tanto problema, qué puede pasar por tener 3- 6 o 9 surfaces activas al mismo tiempo? Todas de tamaño 64x64 y 128x128. Mientras no tenga más de 10, eso sí

Problema resuelto y gracias :D!
208
Gracias, probé todo lo que me dijiste pero nada funcionó, hasta que hice este cambio.
text = sprite_get_texture(sprBlack, 0);
srf = surface_create(64, 64);

d3d_end();

surface_set_target(srf);
draw_clear_alpha(c_white, 0);
draw_sprite(sprEliCabeza, 6, 32, 32);
draw_sprite(sprEliCabeza, 8, 32, 32);
surface_reset_target();
text = surface_get_texture(srf);
//surface_free(srf);

d3d_start();


Tengo eso en CREATE, y usando text en el evento draw FUNCIONA!! Era clave (creo) desactivar el 3D, y declarar text ANTES de crear la surface, pero no lo entiendo... si descomento el surface_free LA TEXTURA NO SE... es decir, hace como si text fuera transparente, sin nada... no suelta error, dibuja todo igual, pero no dibuja la textura.. como si fuera transparente... cuando DEBERÍA hacerle free... ya que este código es probable que lo use en otro sitio, y deberé efectivamente ir liberando las surfaces... alguna idea sobre por qué pasa?
209
Sep, sé que text es local, la uso en la MISMA pieza de código en que la declaro. El problema es que no sólo ignora todos los dibujos de esa pieza, ignora las piezas siguientes...

Ya cambié a surface_get_textura DESPUÉS del reset_target, y el d3d_set_culling está a false desde el principio (para no preocuparme por el sentido de los vértices para los personajes, ya que para ellos desactivo la iluminación, así que no se calculará iluminación en sus vértices, así que no es costoso, por lo que no necesito el culling activo, creo). Sigue sin funcionar, qué puede pasar?

Ah, el código anterior lo tengo en draw, justo antes de usar la textura. Leí que las surfaces no se guardaban en memoria al hacer game_save y nosequé rollos, así que crearla en Create podría traer problemas... afecta?
210
Muchas gracias! Lo de dibujar el muro 3D con esa forma usando primitiva y 4 vértices... era realmente fácil y se me pasó por alto, estaba demasiado enfocado en detalles >_< me abriste los ojos. Me he estado peleando unas buenas horas pero ya me funciona.

Respecto a lo otro ya tengo problemas.

var srf, text; srf = surface_create(64, 64);
surface_set_target(srf);
draw_clear_alpha(0, 0); //hacer la superficie transparente
draw_sprite(sprEliCabeza, 6, 0, 0);
draw_sprite(sprEliCabeza, 8, 0, 0);
text = surface_get_texture(srf);
surface_reset_target();


Tengo eso antes de dibujar, en teoría usando la textura text debería tener AMBOS sprites (subimagenes 6 y 8 ) a la vez, pero en su lugar no me dibuja nada ("ignora" las siguientes líneas de dibujo). Qué hago mal? Uso "text" tal cual donde debo introducir una textura.