Buenash! Pues tengo que hacer, para un boss serpiente, varias colas, pero no tengo mucha idea de cómo hacer una cola de serpiente para que parezca casi real.. es decir, no simplemente X sprites conectados que se ve a simple vista (haciendo una escalera), sino que se vea fluido, como si no estuvieran conectados... que pueda mover la cola y cada una de sus "uniones" en cualquier dirección, pero que gráficamente se vea algo constante entre ellas. En 2D con sprites.
Ideas? Algo similar que ya se haya hecho para ver qué tal es e inspirarme? Ideas para código?
Para hacer esa animación con eslabones y que no se noten tanto, los eslabones tendrían que ser cortos, pero al final sí se llegarían a notar. Otra método que se me ocurre es hacer la forma de la serpiente con primitivas y ponerle una textura, así no se notarían los eslabones, pero puede ser más difícil de hacer. Voy a intentar hacer un ejemplo del segundo método, espero no tardar demasiado.
Cita de: Clamud en Mayo 14, 2015, 03:41:46 PM
Para hacer esa animación con eslabones y que no se noten tanto, los eslabones tendrían que ser cortos, pero al final sí se llegarían a notar. Otra método que se me ocurre es hacer la forma de la serpiente con primitivas y ponerle una textura, así no se notarían los eslabones, pero puede ser más difícil de hacer. Voy a intentar hacer un ejemplo del segundo método, espero no tardar demasiado.
En programación no suele existir lo más difícil, sino el "trabajar un poco más para obtener resultados exajeradamente mejores", estaré esperando tu idea, porque así de entrada no veo a qué te refieres :D
Me refiero a hacer algo como esto: http://martincrownover.com/path-outta-space-gamemakerstudio-example-updated/ (http://martincrownover.com/path-outta-space-gamemakerstudio-example-updated/)
Ya lo estuve analizando un poco, y si requiere bastante trabajo, sobre todo porque hay que restringir ciertas dimensiones; como la longitud total de la serpiente y tal vez el ancho del cuerpo en cada posición, es probable que se aplique algo de Calculus.
Mientras tanto voy a estudiar el ejemplo que puse arriba. Si se me ocurre otra cosa te comento.
Ok, muchas gracias por el ejemplo. Ya lo he destripado y lo he logrado
(http://fotos.subefotos.com/dfe0255500cc5d85d7b0d08887bfc055o.png)
para quién le interese, tengo esto en el evento create:
// Posición de la cola y los ángulos de las conexiones
xCola = 400;
yCola = 500;
conexiones = 6;
aCola[0] = 90;
aCola[1] = 80;
aCola[2] = 70;
aCola[3] = 60;
aCola[4] = 50;
aCola[5] = 40;
// El path que define el camino de la cola
path = path_add();
path_set_closed(path,false);
path_set_kind(path,1);
path_set_precision(path,8);
var xC, yC; xC = xCola; yC = yCola;
for (i = 0; i <= conexiones; ++i) {
path_add_point(path, xC, yC, 0);
if (i < conexiones) {
xC = xC + 100*cos(degtorad(aCola[i]));
yC = yC - 100*sin(degtorad(aCola[i]));
}
}
// Con path_change_point cambio la posición de los puntos para mover la cola
// Textura a dibujar
tex = sprite_get_texture(spr_bands,-1);
// Número de conexiones a dibujar, y el ancho de cada una
chunks = 20; //40
width = 100; //120
Y en Draw:
//make sure drawing is reset
draw_set_color(c_white);
draw_set_alpha(1);
//enable texture repeating so we can adjust UV coordinates past the 0-1 range to make the scrolling repeat
texture_set_repeat(true);
//draw the path as a primitive triangle strip using a for loop to iterate through each piece
for (i=0; i<chunks; i+=1){
//set up some temp vars
var bx1,by1,bx2,by2,bd,bd2,tx1,ty1,tx2,ty2,tx3,ty3,tx4,ty4;
//get initial x,y coordinates from path
bx1 = path_get_x(path,i*(1/chunks));
by1 = path_get_y(path,i*(1/chunks));
bx2 = path_get_x(path,(i+1)*(1/chunks));
by2 = path_get_y(path,(i+1)*(1/chunks));
bx3 = path_get_x(path,(i+2)*(1/chunks));
by3 = path_get_y(path,(i+2)*(1/chunks));
//create directions from the path x,y coordinates above
bd = point_direction(bx1,by1,bx2,by2);
bd2 = point_direction(bx2,by2,bx3,by3);
//x,y coordinates for current piece
tx1 = bx1 + lengthdir_x(width+(i*1),bd+90);
ty1 = by1 + lengthdir_y(width+(i*1),bd+90);
tx2 = bx1 + lengthdir_x(width+(i*1),bd-90);
ty2 = by1 + lengthdir_y(width+(i*1),bd-90);
//x,y coordinates for next piece
tx3 = bx2 + lengthdir_x(width+((i+1)*1),bd2+90);
ty3 = by2 + lengthdir_y(width+((i+1)*1),bd2+90);
tx4 = bx2 + lengthdir_x(width+((i+1)*1),bd2-90);
ty4 = by2 + lengthdir_y(width+((i+1)*1),bd2-90);
//start the primitive piece
draw_primitive_begin_texture(pr_trianglestrip,tex);
//vertex point 1
draw_vertex_texture(tx1,ty1,((i*(1/chunks))*1),0);
draw_vertex_texture(tx3,ty3,(((i+1)*(1/chunks))*1),0);
//vertex point 2
draw_vertex_texture(bx1,by1,((i*(1/chunks))*1),.5);
draw_vertex_texture(bx2,by2,(((i+1)*(1/chunks))*1),.5);
//vertex point 3
draw_vertex_texture(tx2,ty2,((i*(1/chunks))*1),1);
draw_vertex_texture(tx4,ty4,(((i+1)*(1/chunks))*1),1);
draw_primitive_end();
}
Arriba del todo véis la imagen, y al lado el SPRITE ORIGINAL, la cola apuntando a la derecha con fondo transparente. Nadamás, sólo esto, todo lo demás lo he borrado (si lo usáis dad créditos al link original, que esto es un curre del bueno). Sólo defines una série de puntos, y ya se hace a lo largo de éstos, y en mi caso puse un sistema para no dar puntos, sino definir un número imaginario de conexiones, y dar los ángulos de cada conexión. Fantástico :D Supongo que chunks es la calidad, número de conexiones, pero esto no cambia el largo total de la cola.