Buenash! Alguien sabe cómo "deformar la realidad"? Un ejemplo simple: un pequeño agujero negro que atraería todo lo que hay alrededor, verías como todo se deforma acercándose a él. Ya sean las tiles o los backgrounds o los objetos, todo se deformaría. Lo mismo que esto para todo tipo de efectos. Cómo pueden hacerse? Leí algo de surfaces pero no lo tengo claro... la idea es capturar un trozo de lo que se muestra en pantalla y ahí modificarlo, pero no sé por dónde empezar para saber cómo hacerlo

Buena pregunta DARK mira yo tengo un n prototipo que Hizo PENUMBRA  pero es como de atraer imanes es algo parecido no se si te ayudara .

Quizás, no sé, si es un ejemplo del cual puedo aprender algo... debería verlo.

Hmmm... se me ocurre dibujar la pantalla a una superficie, adquirir la textura de la superficie y dibujarla en una primitiva con forma de malla, entonces para distorsionar la imagen se moverían los vértices de la primitiva en el área que necesita cambiar... aunque mientras mayor sea la imagen y mayor el detalle deseado más lento será el efecto... Un concepto interesante sin duda.

Más tarde cuando tenga tiempo veré que tan simple o que tan complejo sería, si tengo suerte haré en un ejemplo.


Sep, algo así me sonaba, usar surfaces... aunque a partir de ahí me he perdido, no tengo mucha idea xD

y estoy planeando hacer mi juego en 3D. Funcionaría también? lo que el juego haría es coger, no sé, una porción 200x200 de lo que se ve por pantalla y deformarlo, daría igual si es 2D o 3D? Aunque leí que el 3D tiene problemas con las surfaces... gracias :)

EDIT: eams, lo que yo busco es un efecto VISUAL, donde la imagen se deforme, lo del agujero negro era un ejemplo :)

Cosas como éstas:

http://gmc.yoyogames.com/index.php?showtopic=579591

con el ejemplo que hay ahí he logrado hacer que un sprite ondee como una bandera. Mola, pero molará más si logro entender cómo lo hace y extrapolarlo a más efectos xD

Uff, un tanto más complejo de lo que me esperaba, y ciertamente no le tiene ningún cariño a los fps, pero acá esta la idea base.

Me quito el sombrero killer es mucha programacion ya me gustaria hacer todo eso a mi me volveria loco..

espero te sirve DArk

De hecho acabo de ver que cometí un error, como está ahora el script de dibujo está usando casi el doble de vértices de lo que es realmente necesario, no hace una diferencia masiva, pero con efectos como este cada poquito cuenta.

El script actual es este:

var T,width,height,Tposx,Tposy,i,j;

T = surface_get_texture(application_surface);
width = array_height_2d(Xcoor);
height = array_length_2d(Xcoor,0);
Tposx = (1/(width-1));
Tposy = (1/(height-1));

for (j = 0; j < height-1 ; j++){
  draw_primitive_begin_texture(pr_trianglestrip, T);
  for (i=0;i < width-1; i++){
    draw_vertex_texture_colour(Xcoor[i,j],Ycoor[i,j],Tposx * i,Tposy * j,c_white,1);
    draw_vertex_texture_colour(Xcoor[i,j+1],Ycoor[i,j+1],Tposx * i,Tposy * (j+1),c_white,1);
    draw_vertex_texture_colour(Xcoor[i+1,j],Ycoor[i+1,j],Tposx * (i+1),Tposy * j,c_white,1);
    draw_vertex_texture_colour(Xcoor[i+1,j+1],Ycoor[i+1,j+1],Tposx * (i+1),Tposy * (j+1),c_white,1);
   }
  draw_primitive_end();
}

/*Dibuja la grilla a la pantalla por tiras horizontales


Solo habría que quitar los últimos dos vértices en el script y quitar el -1 en el width-1 del segundo for:

var T,width,height,Tposx,Tposy,i,j;

T = surface_get_texture(application_surface);
width = array_height_2d(Xcoor);
height = array_length_2d(Xcoor,0);
Tposx = (1/(width-1));
Tposy = (1/(height-1));

for (j = 0; j < height-1 ; j++){
  draw_primitive_begin_texture(pr_trianglestrip, T);
  for (i=0;i < width; i++){
    draw_vertex_texture_colour(Xcoor[i,j],Ycoor[i,j],Tposx * i,Tposy * j,c_white,1);
    draw_vertex_texture_colour(Xcoor[i,j+1],Ycoor[i,j+1],Tposx * i,Tposy * (j+1),c_white,1);
   }
  draw_primitive_end();
}

/*Dibuja la grilla a la pantalla por tiras horizontales

Hmmm... GM Studio no reconoce draw_vertex_texture_colour, lo he sustituido por color, parece aceptarlo pero me sale:

Push :: Execution Error - Variable Get -1.application_surface(100016, -1)
at gml_Script_draw_grid (line 3) - T = surface_get_texture(application_surface);

es de GM8.1 por lo que veo D: parece un efecto increíble y no puedo ejecutarlo...



Eams se refiere al número de la versión, el ejemplo fue hecho usando GMS 1.3.1336, la versión actual del canal beta, la variable application_surface fue introducida en 1.3.

Si por qué yo lo abrí y me corrió bien el ejemplo es AWESOME .

DISFRUTALO .