Marzo 04, 2011, 09:27:21 PM Ultima modificación: Marzo 04, 2011, 09:34:14 PM por soccer2008
Bueno explicar? de la siguiente manera: Tengo una imagen (en formato jpg x ejemplo) y quisiera que en el game maker le reconozca los puntos en el plano X y Y, por ejemplo:



Y todos su puntos ser?an x ejemplo.

global.X[1]=12,global.Y[1]=13
global.X[2]=13,global.Y[2]=13
global.X[3]=14,global.Y[3]=13
global.X[4]=14,global.Y[4]=14
.
.
.
.
global.X[200]=200,global.Y[200]=120;


de tal forma que si junto todos esos puntos en un for me dibuje la imagen con draw_line

Espero que me entiendan, gracias de antemano...saludos  XD
Un foro donde hay de todo: http://fileceru.foroactivo.net (se necesitan moderadores para el foro)

#1 Marzo 04, 2011, 09:35:43 PM Ultima modificación: Marzo 04, 2011, 10:12:57 PM por Texic
No entend?, podr?as explicarlo mejor??
EDITO: Ahh, ya, si se puede pero es costos?simo, sin embargo me interesa porq es complicado as? q te voy a ayudar
Logr? un avance muy importante, en cuanto termine te lo paso, pero m?s tarde porq ahora me tengo q ir a comprar anan?s y ron =f




Pues en lo que texic termina su script  :P te pasare este que la verdad no se de donde lo saque pero lo use para hacer un sistema de auto-creaci?n de pol?gonos en gmphysics hace much?simo.

[gml]
ID = surface_create(sprite_get_width(argument0) + 2 , sprite_get_height(argument0) + 2);
surface_set_target(ID);
draw_clear(c_green);
draw_sprite_ext(argument0 , 0 , sprite_get_width(argument0) / 2 + 1 , sprite_get_height(argument0) / 2 + 1 , 1 , 1 , 0 , c_black , 1);
surface_reset_target();
trans = surface_getpixel(ID,0,surface_get_height(ID)-1);
Return = surface_create(surface_get_width(ID) , surface_get_height(ID));
surface_set_target(Return);
draw_clear(c_white);
draw_set_color(c_black);
xx = sprite_get_width(argument0) / 2 + 1;
yy = sprite_get_height(argument0) / 2 + 1;
dir = 0;
dist = 0;
maxdist = point_distance(0 , 0 , xx , yy);
draw_primitive_begin(pr_linestrip);
for(i = 0; i <= 360; i += 4)
{
  dist = 0;
  do{dist += 1}
  until(
  surface_getpixel(ID , floor(xx + lengthdir_x(dist , i)) , floor(yy + lengthdir_y(dist , i))) == trans || dist > maxdist);
  draw_vertex(floor(xx + lengthdir_x(dist , i)) , floor(yy + lengthdir_y(dist , i)));
}
draw_primitive_end();
surface_reset_target();
return(Return);[/gml]

el script devuelve una surface con el pol?gono echo con lineas ya dibujado en ella, es muy muy lento y con una imagen del tama?o de ese auto tardar?a demaciado. Puedes modificar la presicion para que tarde menos, se hace modificandoe estas partes del script
[gml]for(i = 0; i <= 360; i += 4)
//cambia el 4 por un numero mayor para menos precisi?n, el numero debe de ser divisible entre 360[/gml]
[gml]do{dist += 1}//Cambia el 1 por un numero mayor para menos precisi?n[/gml]

#3 Marzo 04, 2011, 11:54:30 PM Ultima modificación: Marzo 05, 2011, 09:08:47 PM por WillyDeLeon
En el ejemplo que pones:

global.X[1]=12,global.Y[1]=13
global.X[2]=13,global.Y[2]=13
global.X[3]=14,global.Y[3]=13
global.X[4]=14,global.Y[4]=14
.
.
.
.
global.X[200]=200,global.Y[200]=120;

Lo que est?s almacenando en esto arrays son valores num?ricos que no contienen informaci?n de los  p?xeles de la imagen, pienso que estos valores no expresan nada, lo ideal fuera que estos valores contuvieran informaci?n acerca del color de cada p?xel de la imagen pero tendr?a que ser tal vez una cadena de caracteres para expresar el color en hexadecimal.

Por ejemplo un rojo: #DF0101
Este es un tono de lila: #5F04B4

Mira esto: http://html-color-codes.info/codigos-de-colores-hexadecimales/


Podr?as utilizar estas funciones:
draw_pixel(x,y) Dibuja un pixel en la posici?n (x,y) con el color establecido en el brush
draw_getpixel(x,y) Devuelve el color del pixel en (x,y).

Si lo que quieres es que Game Maker te de la informaci?n del color de cada pixel de la imagen jpg, yo no sabr?a c?mo hacerlo, pero buscar?a un programa que me d? esa informaci?n y as? podr?a ingresarla en una array de dos dimensiones (Como el ejemplo que pones).

En lo particular yo utilizar?a draw_pixel(x,y) en lugar de draw_line.

No se qu? intentas hacer pero se ve interesante!

Ya casi lo tengo soccer, dejame darle unos ajustes y sale =3




#5 Marzo 06, 2011, 05:00:06 AM Ultima modificación: Marzo 06, 2011, 05:02:29 AM por Wadk
?No bastar?a con esto?
[gml]var w, h;
w = sprite_get_width(sprite);
h = sprite_get_height(sprite);
draw_sprite(sprite, 0, 0, 0);
screen_refresh();

for (i = 0; i < w; i += 1){
    for (j = 0; j < h; j += 1){
        pixel[i, j] = draw_getpixel(i, j);
    }
}[/gml]
Si va muy lento podr?as usar esto http://gmc.yoyogames.com/index.php?showtopic=347620&pid=2488627&mode=threaded&show=&st=0 para reemplazar el draw_getpixel.

Pero no entiendo por qu? quer?s dibujar la imagen pixel por pixel. Te voy avisando que seguramente sea lent?simo.
Vim.

Creo que lo que el quiere hacer es generar varios puntos en la imagen y luego unirlos con lineas algo as? como esos juegos de ni?os peque?os en los que tienes que unir los puntos y se forma una figura, o al menos eso es lo que yo entend?.

Cita de: brunoxzx en Marzo 06, 2011, 05:57:14 AM
Creo que lo que el quiere hacer es generar varios puntos en la imagen y luego unirlos con lineas algo as? como esos juegos de ni?os peque?os en los que tienes que unir los puntos y se forma una figura, o al menos eso es lo que yo entend?.
Ahhh, s?, creo que ten?s raz?n.
Ignoren mi anterior post :P.
Vim.

Cita de: brunoxzx en Marzo 04, 2011, 10:38:51 PM
Pues en lo que texic termina su script  :P te pasare este que la verdad no se de donde lo saque pero lo use para hacer un sistema de auto-creaci?n de pol?gonos en gmphysics hace much?simo.

[gml]
ID = surface_create(sprite_get_width(argument0) + 2 , sprite_get_height(argument0) + 2);
surface_set_target(ID);
draw_clear(c_green);
draw_sprite_ext(argument0 , 0 , sprite_get_width(argument0) / 2 + 1 , sprite_get_height(argument0) / 2 + 1 , 1 , 1 , 0 , c_black , 1);
surface_reset_target();
trans = surface_getpixel(ID,0,surface_get_height(ID)-1);
Return = surface_create(surface_get_width(ID) , surface_get_height(ID));
surface_set_target(Return);
draw_clear(c_white);
draw_set_color(c_black);
xx = sprite_get_width(argument0) / 2 + 1;
yy = sprite_get_height(argument0) / 2 + 1;
dir = 0;
dist = 0;
maxdist = point_distance(0 , 0 , xx , yy);
draw_primitive_begin(pr_linestrip);
for(i = 0; i <= 360; i += 4)
{
  dist = 0;
  do{dist += 1}
  until(
  surface_getpixel(ID , floor(xx + lengthdir_x(dist , i)) , floor(yy + lengthdir_y(dist , i))) == trans || dist > maxdist);
  draw_vertex(floor(xx + lengthdir_x(dist , i)) , floor(yy + lengthdir_y(dist , i)));
}
draw_primitive_end();
surface_reset_target();
return(Return);[/gml]

el script devuelve una surface con el pol?gono echo con lineas ya dibujado en ella, es muy muy lento y con una imagen del tama?o de ese auto tardar?a demaciado. Puedes modificar la presicion para que tarde menos, se hace modificandoe estas partes del script
[gml]for(i = 0; i <= 360; i += 4)
//cambia el 4 por un numero mayor para menos precisi?n, el numero debe de ser divisible entre 360[/gml]
[gml]do{dist += 1}//Cambia el 1 por un numero mayor para menos precisi?n[/gml]


gracias brunoxzx por el aporte, voy a esperar con ansias el ejemplo de Texic y gracias a todos por sus aportes...saludos XD XD XD
Un foro donde hay de todo: http://fileceru.foroactivo.net (se necesitan moderadores para el foro)

De nada que bueno que te sirvi? el c?digo, aun as? espera el c?digo de texic y para matar el tiempo puedes ignorar el anterior post de wadk.

Ya, la bas? est?, de ahi agarr? para donde quieras, el problema es q los puntos no pueden ser unidos con for porq rellenan la figura, pero bueno, fijate