Noticias

Se ha publicado un nuevo servicio, el Portal de Juegos Online

* Sponsor

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!.

Autor Tema: draw_cube( x, y, width, height, length, anglex, angley)  (Leído 452 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado dixon

Nombre del autor : Reyes Dávila.
Breve descripción de su función : Dibuja un cubo 3d, sin activar funciones 3d.
Versión GM utilizada : Game maker 3.3 (April 3, 2001)  y teóricamente funciona en todos los game maker superiores

En el siguiente enlace podrás ver el código funcionando en html5
Draw_cube


Código del script:

Código sin color ni giro para todas las versiones superiores a game maker 3
Spoiler
///draw_cube(x,y,width,height,length,anglex,angley);
//Obteniendo argumentos.
posx00=argument0;
posy00=argument1;
width00=argument2/2;
height00=argument3;
length00=argument4;
anglex00=argument5;
angley00=argument6;

//Determinando los cuatro puntos del cuadrado
//Punto A
pax00=posx00;
pay00=posy00;
//Punto B
pbx00=pax00+length00;
pby00=pay00;
//Punto C
pcx00=pbx00;
pcy00=pby00+height00;
//Punto D
pdx00=pax00;
pdy00=pay00+height00;

//Ubicando el punto de fuga
//Determinando el centro del cubo
pcenx00=pax00+length00/2;
pceny00=pay00+height00/2;
//Punto de fuga
lengthmax00=length00*5;
heightmax00=height00*5;
widthmax00=width00*5;

pfugax00=pcenx00+(lengthmax00/45)*anglex00;
pfugay00=pceny00+(heightmax00/45)*angley00;

if(pfugax00>pcenx00+lengthmax00){pfugax00=pcenx00+lengthmax00}
if(pfugay00>pceny00+heightmax00){pfugay00=pceny00+heightmax00}
if(pfugax00<pcenx00-lengthmax00){pfugax00=pcenx00-lengthmax00}
if(pfugay00<pceny00-heightmax00){pfugay00=pceny00-heightmax00}


//Determinando puntos finales
distancia_ab=point_distance(pax00,pay00,pfugax00,pfugay00);
if(distancia_ab>widthmax00){distancia_ab=widthmax00}
porcentajex02=abs(abs(distancia_ab-widthmax00)*100/widthmax00);
width200=(porcentajex02*width00)/100;
i=width00-width200;
directionf=point_direction(pax00,pay00,pfugax00,pfugay00);
distancia_ab=point_distance(pfugax00,pfugay00,pax00,pay00);
distancia_ab+=0.0000001;
distancia_ax=(distancia_ab-i);
porcentaje100=(distancia_ax*100)/distancia_ab;
length200=(porcentaje100*length00)/100;
x1=pax00+i*cos(directionf*pi/180);
y1=pay00-i*sin(directionf*pi/180);
x2=x1+length200*cos(0*pi/180);
y2=y1-length200*sin(0*pi/180);

pex00=x1;
pey00=y1;
pfx00=x2;
pfy00=y2;


//Determinando puntos finales
distancia_ab=point_distance(pdx00,pdy00,pfugax00,pfugay00);
if(abs(distancia_ab)>widthmax00){distancia_ab=widthmax00}
porcentajex02=abs(abs(distancia_ab-widthmax00)*100/widthmax00);
width200=(porcentajex02*width00)/100;
i=width00-width200;
directionf=point_direction(pdx00,pdy00,pfugax00,pfugay00);
distancia_ab=point_distance(pfugax00,pfugay00,pdx00,pdy00);
distancia_ab+=0.0000001;
distancia_ax=(distancia_ab-i);
porcentaje100=(distancia_ax*100)/distancia_ab;
height200=(porcentaje100*height00)/100;

pgx00=pfx00+height200*cos(270*pi/180);
pgy00=pfy00-height200*sin(270*pi/180);
phx00=pgx00+length200*cos(180*pi/180);
phy00=pgy00-length200*sin(180*pi/180);

//Dibujando líneas
//Línea A-B
x1=pax00;y1=pay00;x2=pbx00;y2=pby00;
draw_line(x1,y1,x2,y2);
//Línea B-C
x1=pbx00;y1=pby00;x2=pcx00;y2=pcy00;
draw_line(x1,y1,x2,y2);
//Línea C-D
x1=pcx00;y1=pcy00;x2=pdx00;y2=pdy00;
draw_line(x1,y1,x2,y2);
//Línea D-A
x1=pdx00;y1=pdy00;x2=pax00;y2=pay00;
draw_line(x1,y1,x2,y2);

//Línea E-F
x1=pex00;y1=pey00;x2=pfx00;y2=pfy00;
draw_line(x1,y1,x2,y2);
//Línea F-G
x1=pfx00;y1=pfy00;x2=pgx00;y2=pgy00;
draw_line(x1,y1,x2,y2);
//Línea G-H
x1=pgx00;y1=pgy00;x2=phx00;y2=phy00;
draw_line(x1,y1,x2,y2);
//Línea H-E
x1=phx00;y1=phy00;x2=pex00;y2=pey00;
draw_line(x1,y1,x2,y2);

//Línea A-E
x1=pax00;y1=pay00;x2=pex00;y2=pey00;
draw_line(x1,y1,x2,y2);
//Línea B-F
x1=pbx00;y1=pby00;x2=pfx00;y2=pfy00;
draw_line(x1,y1,x2,y2);
//Línea C-G
x1=pcx00;y1=pcy00;x2=pgx00;y2=pgy00;
draw_line(x1,y1,x2,y2);
//Línea D-H
x1=pdx00;y1=pdy00;x2=phx00;y2=phy00;
draw_line(x1,y1,x2,y2);


Version 2 del codigo sin color pero con rotación, para todos los game maker superiores a game maker 3.
Spoiler
//draw_cube( x, y, width, height, length, rotation, fugax, fugay);

//Obteniendo argumentos
posx00=argument0;
posy00=argument1;
width00=argument2;
height00=argument3;
length00=argument4;
rotation00=argument5;
pfugax00=argument6;
pfugay00=argument7;

//Determinado punto central de la primera cara
pcenx00=posx00+length00/2;
pceny00=posy00+height00/2;
direction_center00=360-point_direction(posx00,posy00,pcenx00,pceny00);
distance_center00=point_distance(posx00,posy00,pcenx00,pceny00);

//Hallando los primeros cuatro puntos que conforman la primera cara
for(i=1;i<=4;i+=1)
{
direction_ram00=direction_center00;
if(i=2){direction_ram00=180-direction_center00}
if(i=3){direction_ram00=180+direction_center00}
if(i=4){direction_ram00=-direction_center00}
puntox00[i]=pcenx00+distance_center00*cos((direction_ram00+rotation00)*pi/180);
puntoy00[i]=pceny00-distance_center00*sin((direction_ram00+rotation00)*pi/180);
}

//hallando punto de fuga 2
direction_fuga00=point_direction(pcenx00,pceny00,pfugax00,pfugay00);
pfuga2x00=pcenx00+width00*2*cos(direction_fuga00*pi/180);
pfuga2y00=pceny00-width00*2*sin(direction_fuga00*pi/180);

//Hallando al punto central 2
direction_fuga00=point_direction(pcenx00,pceny00,pfugax00,pfugay00);
pcen2x00=pcenx00+(width00/2)*cos(direction_fuga00*pi/180);
pcen2y00=pceny00-(width00/2)*sin(direction_fuga00*pi/180);

//Hallando al punto central 3
direction_fuga00=point_direction(pcenx00,pceny00,pfuga2x00,pfuga2y00);
pcen3x00=pcenx00+(width00/2)*cos(direction_fuga00*pi/180);
pcen3y00=pceny00-(width00/2)*sin(direction_fuga00*pi/180);

//Ajuste de punto central 2
distance_fuga00=point_distance(pcenx00,pceny00,pfugax00,pfugay00)+0.00001;
if(distance_fuga00<width00/2){pcen2x00=pfugax00;pcen2y00=pfugay00}

//Hallando cuatro ultimos puntos
distance_fuga00=point_distance(pcenx00,pceny00,pfuga2x00,pfuga2y00)+0.00001;
distance_fuga200=point_distance(pcen3x00,pcen3y00,pfuga2x00,pfuga2y00)+0.00001;
porcentaje200=distance_fuga200*100/distance_fuga00;
distance_center200=porcentaje200*distance_center00/100;

for(i=5;i<=8;i+=1)
{
direction_ram00=direction_center00;
if(i=6){direction_ram00=180-direction_center00}
if(i=7){direction_ram00=180+direction_center00}
if(i=8){direction_ram00=-direction_center00}
puntox00[i]=pcen2x00+distance_center200*cos((direction_ram00+rotation00)*pi/180);
puntoy00[i]=pcen2y00-distance_center200*sin((direction_ram00+rotation00)*pi/180);
}

//Dibujando lineas cara final
for(i=5;i<=8;i+=1)
{
x1=puntox00[i];
y1=puntoy00[i];
if(i=8){x2=puntox00[5];y2=puntoy00[5]}else{
x2=puntox00[i+1];
y2=puntoy00[i+1];}
draw_line(x1,y1,x2,y2);
}

bloquear=''
//Dibujando lineas de union
for(i=1;i<=4;i+=1)
{
x1=puntox00[i];
y1=puntoy00[i];
x2=puntox00[i+4];
y2=puntoy00[i+4];
draw_line(x1,y1,x2,y2);
}
//'

//Dibujando lineas cara frontal
for(i=1;i<=4;i+=1)
{
x1=puntox00[i];
y1=puntoy00[i];
if(i=4){x2=puntox00[1];y2=puntoy00[1]}else{
x2=puntox00[i+1];
y2=puntoy00[i+1];}
draw_line(x1,y1,x2,y2);
}




bloquear='
//dibujando lineas al punto de fuga
for(i=1;i<=4;i+=1)
{
x1=puntox00[i];
y1=puntoy00[i];
x2=pfuga2x00;
y2=pfuga2y00;
draw_line(x1,y1,x2,y2)
}

draw_line(pcenx00,pceny00,pfugax00,pfugay00);
draw_circle(pcenx00,pceny00,5);
draw_circle(pcen2x00,pcen2y00,5);
//'


Version ligera donde solo se dibujan las lineas del cubo, solo para game maker 4 y 5
Spoiler
///draw_cube( x, y, length, rotation, color_line);
//Ejemplo: draw_cube(x,y,50,direction,c_fuchsia);

posx00=argument0;
posy00=argument1;
width00=argument2/2;
height00=argument2;
length00=argument2;
rotation00=argument3;
color00=argument4;

//Asignando el punto de fuga
pfugax00=xstart+length00*3;
pfugay00=ystart+height00*-3;

//Diagonal
diagonal00=sqrt(power(length00,2)+power(height00,2));

//Punto central
pcenx00=posx00+(diagonal00/2)*cos(315*pi/180);
pceny00=posy00-(diagonal00/2)*sin(315*pi/180);

//Puntos del rectangulo
direction00=rotation00;
distancia00=diagonal00/2;
puntox00=pcenx00;
puntoy00=pceny00;
pax00=puntox00+distancia00*cos((direction00+45)*pi/180);
pay00=puntoy00-distancia00*sin((direction00+45)*pi/180);
pbx00=puntox00+distancia00*cos((direction00+45*3)*pi/180);
pby00=puntoy00-distancia00*sin((direction00+45*3)*pi/180);
pcx00=puntox00+distancia00*cos((direction00+45*5)*pi/180);
pcy00=puntoy00-distancia00*sin((direction00+45*5)*pi/180);
pdx00=puntox00+distancia00*cos((direction00+45*7)*pi/180);
pdy00=puntoy00-distancia00*sin((direction00+45*7)*pi/180);


i=width00;
direction00=point_direction(pcenx00,pceny00,pfugax00,pfugay00);
distanciax00=point_distance(pcenx00,pceny00,pfugax00,pfugay00)+0.00001;
pcenx200=pcenx00+i*cos(direction00*pi/180);
pceny200=pceny00-i*sin(direction00*pi/180);

distancia100=point_distance(pcenx00,pceny00,pfugax00,pfugay00);
if(distancia100<=i){pcenx200=pfugax00;pceny200=pfugay00}

porcentaje000=i*100/distanciax00;
diagonal000=(diagonal00/2)-porcentaje000*(diagonal00/2)/100;

widthmin=(width00);
if(distancia100<=i){diagonal000=widthmin}
if(diagonal000<widthmin){diagonal000=widthmin}

pex00=pcenx200+diagonal000*cos((rotation00+45)*pi/180);
pey00=pceny200-diagonal000*sin((rotation00+45)*pi/180);
pfx00=pcenx200+diagonal000*cos((rotation00+45*3)*pi/180);
pfy00=pceny200-diagonal000*sin((rotation00+45*3)*pi/180);
pgx00=pcenx200+diagonal000*cos((rotation00+45*5)*pi/180);
pgy00=pceny200-diagonal000*sin((rotation00+45*5)*pi/180);
phx00=pcenx200+diagonal000*cos((rotation00+45*7)*pi/180);
phy00=pceny200-diagonal000*sin((rotation00+45*7)*pi/180);

//dibujando lineas
pen_color=color00;
//draw_set_color(color00)

//Linea A-B
x1=pax00;y1=pay00;x2=pbx00;y2=pby00;
draw_line(x1,y1,x2,y2);
//Linea B-C
x1=pbx00;y1=pby00;x2=pcx00;y2=pcy00;
draw_line(x1,y1,x2,y2);
//Linea C-D
x1=pcx00;y1=pcy00;x2=pdx00;y2=pdy00;
draw_line(x1,y1,x2,y2);
//Linea D-A
x1=pdx00;y1=pdy00;x2=pax00;y2=pay00;
draw_line(x1,y1,x2,y2);
//'

//Linea E-F
x1=pex00;y1=pey00;x2=pfx00;y2=pfy00;
draw_line(x1,y1,x2,y2);
//Linea F-G
x1=pfx00;y1=pfy00;x2=pgx00;y2=pgy00;
draw_line(x1,y1,x2,y2);
//Linea G-H
x1=pgx00;y1=pgy00;x2=phx00;y2=phy00;
draw_line(x1,y1,x2,y2);
//Linea H-E
x1=phx00;y1=phy00;x2=pex00;y2=pey00;
draw_line(x1,y1,x2,y2);
//'

//Linea A-E
x1=pax00;y1=pay00;x2=pex00;y2=pey00;
draw_line(x1,y1,x2,y2);
//Linea B-F
x1=pbx00;y1=pby00;x2=pfx00;y2=pfy00;
draw_line(x1,y1,x2,y2);
//Linea C-G
x1=pcx00;y1=pcy00;x2=pgx00;y2=pgy00;
draw_line(x1,y1,x2,y2);
//Linea D-H
x1=pdx00;y1=pdy00;x2=phx00;y2=phy00;
draw_line(x1,y1,x2,y2);
//'

version ligera para game maker 6,7,8, html5 y mac
Spoiler
///draw_cube( x, y, length, rotation, color_line);
//Ejemplo: draw_cube(x,y,50,direction,c_fuchsia);

posx00=argument0;
posy00=argument1;
width00=argument2/2;
height00=argument2;
length00=argument2;
rotation00=argument3;
color00=argument4;

//Asignando el punto de fuga
pfugax00=xstart+length00*3;
pfugay00=ystart+height00*-3;

//Diagonal
diagonal00=sqrt(power(length00,2)+power(height00,2));

//Punto central
pcenx00=posx00+(diagonal00/2)*cos(315*pi/180);
pceny00=posy00-(diagonal00/2)*sin(315*pi/180);

//Puntos del rectangulo
direction00=rotation00;
distancia00=diagonal00/2;
puntox00=pcenx00;
puntoy00=pceny00;
pax00=puntox00+distancia00*cos((direction00+45)*pi/180);
pay00=puntoy00-distancia00*sin((direction00+45)*pi/180);
pbx00=puntox00+distancia00*cos((direction00+45*3)*pi/180);
pby00=puntoy00-distancia00*sin((direction00+45*3)*pi/180);
pcx00=puntox00+distancia00*cos((direction00+45*5)*pi/180);
pcy00=puntoy00-distancia00*sin((direction00+45*5)*pi/180);
pdx00=puntox00+distancia00*cos((direction00+45*7)*pi/180);
pdy00=puntoy00-distancia00*sin((direction00+45*7)*pi/180);


i=width00;
direction00=point_direction(pcenx00,pceny00,pfugax00,pfugay00);
distanciax00=point_distance(pcenx00,pceny00,pfugax00,pfugay00)+0.00001;
pcenx200=pcenx00+i*cos(direction00*pi/180);
pceny200=pceny00-i*sin(direction00*pi/180);

distancia100=point_distance(pcenx00,pceny00,pfugax00,pfugay00);
if(distancia100<=i){pcenx200=pfugax00;pceny200=pfugay00}

porcentaje000=i*100/distanciax00;
diagonal000=(diagonal00/2)-porcentaje000*(diagonal00/2)/100;

widthmin=(width00);
if(distancia100<=i){diagonal000=widthmin}
if(diagonal000<widthmin){diagonal000=widthmin}

pex00=pcenx200+diagonal000*cos((rotation00+45)*pi/180);
pey00=pceny200-diagonal000*sin((rotation00+45)*pi/180);
pfx00=pcenx200+diagonal000*cos((rotation00+45*3)*pi/180);
pfy00=pceny200-diagonal000*sin((rotation00+45*3)*pi/180);
pgx00=pcenx200+diagonal000*cos((rotation00+45*5)*pi/180);
pgy00=pceny200-diagonal000*sin((rotation00+45*5)*pi/180);
phx00=pcenx200+diagonal000*cos((rotation00+45*7)*pi/180);
phy00=pceny200-diagonal000*sin((rotation00+45*7)*pi/180);

//dibujando lineas
pen_color=color00;
draw_set_color(color00)

//Linea A-B
x1=pax00;y1=pay00;x2=pbx00;y2=pby00;
draw_line(x1,y1,x2,y2);
//Linea B-C
x1=pbx00;y1=pby00;x2=pcx00;y2=pcy00;
draw_line(x1,y1,x2,y2);
//Linea C-D
x1=pcx00;y1=pcy00;x2=pdx00;y2=pdy00;
draw_line(x1,y1,x2,y2);
//Linea D-A
x1=pdx00;y1=pdy00;x2=pax00;y2=pay00;
draw_line(x1,y1,x2,y2);
//'

//Linea E-F
x1=pex00;y1=pey00;x2=pfx00;y2=pfy00;
draw_line(x1,y1,x2,y2);
//Linea F-G
x1=pfx00;y1=pfy00;x2=pgx00;y2=pgy00;
draw_line(x1,y1,x2,y2);
//Linea G-H
x1=pgx00;y1=pgy00;x2=phx00;y2=phy00;
draw_line(x1,y1,x2,y2);
//Linea H-E
x1=phx00;y1=phy00;x2=pex00;y2=pey00;
draw_line(x1,y1,x2,y2);
//'

//Linea A-E
x1=pax00;y1=pay00;x2=pex00;y2=pey00;
draw_line(x1,y1,x2,y2);
//Linea B-F
x1=pbx00;y1=pby00;x2=pfx00;y2=pfy00;
draw_line(x1,y1,x2,y2);
//Linea C-G
x1=pcx00;y1=pcy00;x2=pgx00;y2=pgy00;
draw_line(x1,y1,x2,y2);
//Linea D-H
x1=pdx00;y1=pdy00;x2=phx00;y2=phy00;
draw_line(x1,y1,x2,y2);
//'

Version ligera para game maker studio 1 y 2
Spoiler
///draw_cube( x, y, length, rotation, color_line);
//Ejemplo: draw_cube(x,y,50,direction,c_fuchsia);

posx00=argument0;
posy00=argument1;
width00=argument2/2;
height00=argument2;
length00=argument2;
rotation00=argument3;
color00=argument4;

//Asignando el punto de fuga
pfugax00=xstart+length00*3;
pfugay00=ystart+height00*-3;

//Diagonal
diagonal00=sqrt(power(length00,2)+power(height00,2));

//Punto central
pcenx00=posx00+(diagonal00/2)*cos(315*pi/180);
pceny00=posy00-(diagonal00/2)*sin(315*pi/180);

//Puntos del rectangulo
direction00=rotation00;
distancia00=diagonal00/2;
puntox00=pcenx00;
puntoy00=pceny00;
pax00=puntox00+distancia00*cos((direction00+45)*pi/180);
pay00=puntoy00-distancia00*sin((direction00+45)*pi/180);
pbx00=puntox00+distancia00*cos((direction00+45*3)*pi/180);
pby00=puntoy00-distancia00*sin((direction00+45*3)*pi/180);
pcx00=puntox00+distancia00*cos((direction00+45*5)*pi/180);
pcy00=puntoy00-distancia00*sin((direction00+45*5)*pi/180);
pdx00=puntox00+distancia00*cos((direction00+45*7)*pi/180);
pdy00=puntoy00-distancia00*sin((direction00+45*7)*pi/180);


i=width00;
direction00=point_direction(pcenx00,pceny00,pfugax00,pfugay00);
distanciax00=point_distance(pcenx00,pceny00,pfugax00,pfugay00)+0.00001;
pcenx200=pcenx00+i*cos(direction00*pi/180);
pceny200=pceny00-i*sin(direction00*pi/180);

distancia100=point_distance(pcenx00,pceny00,pfugax00,pfugay00);
if(distancia100<=i){pcenx200=pfugax00;pceny200=pfugay00}

porcentaje000=i*100/distanciax00;
diagonal000=(diagonal00/2)-porcentaje000*(diagonal00/2)/100;

widthmin=(width00);
if(distancia100<=i){diagonal000=widthmin}
if(diagonal000<widthmin){diagonal000=widthmin}

pex00=pcenx200+diagonal000*cos((rotation00+45)*pi/180);
pey00=pceny200-diagonal000*sin((rotation00+45)*pi/180);
pfx00=pcenx200+diagonal000*cos((rotation00+45*3)*pi/180);
pfy00=pceny200-diagonal000*sin((rotation00+45*3)*pi/180);
pgx00=pcenx200+diagonal000*cos((rotation00+45*5)*pi/180);
pgy00=pceny200-diagonal000*sin((rotation00+45*5)*pi/180);
phx00=pcenx200+diagonal000*cos((rotation00+45*7)*pi/180);
phy00=pceny200-diagonal000*sin((rotation00+45*7)*pi/180);

//dibujando lineas
pen_color=color00;
draw_set_colour(color00)

//Linea A-B
x1=pax00;y1=pay00;x2=pbx00;y2=pby00;
draw_line(x1,y1,x2,y2);
//Linea B-C
x1=pbx00;y1=pby00;x2=pcx00;y2=pcy00;
draw_line(x1,y1,x2,y2);
//Linea C-D
x1=pcx00;y1=pcy00;x2=pdx00;y2=pdy00;
draw_line(x1,y1,x2,y2);
//Linea D-A
x1=pdx00;y1=pdy00;x2=pax00;y2=pay00;
draw_line(x1,y1,x2,y2);
//'

//Linea E-F
x1=pex00;y1=pey00;x2=pfx00;y2=pfy00;
draw_line(x1,y1,x2,y2);
//Linea F-G
x1=pfx00;y1=pfy00;x2=pgx00;y2=pgy00;
draw_line(x1,y1,x2,y2);
//Linea G-H
x1=pgx00;y1=pgy00;x2=phx00;y2=phy00;
draw_line(x1,y1,x2,y2);
//Linea H-E
x1=phx00;y1=phy00;x2=pex00;y2=pey00;
draw_line(x1,y1,x2,y2);
//'

//Linea A-E
x1=pax00;y1=pay00;x2=pex00;y2=pey00;
draw_line(x1,y1,x2,y2);
//Linea B-F
x1=pbx00;y1=pby00;x2=pfx00;y2=pfy00;
draw_line(x1,y1,x2,y2);
//Linea C-G
x1=pcx00;y1=pcy00;x2=pgx00;y2=pgy00;
draw_line(x1,y1,x2,y2);
//Linea D-H
x1=pdx00;y1=pdy00;x2=phx00;y2=phy00;
draw_line(x1,y1,x2,y2);
//'

Código con color y giro para game maker 4 y 5
Spoiler
///draw_cube( x, y, length, fugax, fugay, rotation);
//Ejemplo: draw_cube(x,y,50,256,256,direction,c_fuchsia);

posx00=argument0;
posy00=argument1;
width00=argument2/2;
height00=argument2;
length00=argument2;
pfugax00=argument3;
pfugay00=argument4;
rotation00=argument5;
color00=argument6;

c100=(color00=c_fuchsia);
c200=(color00=c_ltgray);
c300=(color00=c_purple);
c400=(color00=c_red);
c500=(color00=c_white);
c600=(color00=c_yellow);

if(!(c100 || c200 || c300 || c400 || c500 || c600))
{
color00+=25;
}

//c_aqua
//c_black
//c_blue
//c_dkgray
//c_fuchsia no+25
//c_gray
//c_green
//c_lime
//c_ltgray no+25
//c_maroon
//c_navy
//c_olive
//c_purple no+25
//c_red no+25
//c_silver
//c_teal
//c_white no+25
//c_yellow no+25


color01=color00-5;
color02=color00-5*2;
color03=color00-5*3;
color04=color00-5*4;
color05=color00-5*5;

//Diagonal
diagonal00=sqrt(power(length00,2)+power(height00,2));

//Punto central
pcenx00=posx00+(diagonal00/2)*cos(315*pi/180);
pceny00=posy00-(diagonal00/2)*sin(315*pi/180);

//Puntos del rectangulo
direction00=rotation00;
distancia00=diagonal00/2;
puntox00=pcenx00;
puntoy00=pceny00;
pax00=puntox00+distancia00*cos((direction00+45)*pi/180);
pay00=puntoy00-distancia00*sin((direction00+45)*pi/180);
pbx00=puntox00+distancia00*cos((direction00+45*3)*pi/180);
pby00=puntoy00-distancia00*sin((direction00+45*3)*pi/180);
pcx00=puntox00+distancia00*cos((direction00+45*5)*pi/180);
pcy00=puntoy00-distancia00*sin((direction00+45*5)*pi/180);
pdx00=puntox00+distancia00*cos((direction00+45*7)*pi/180);
pdy00=puntoy00-distancia00*sin((direction00+45*7)*pi/180);


i=width00;
direction00=point_direction(pcenx00,pceny00,pfugax00,pfugay00);
distanciax00=point_distance(pcenx00,pceny00,pfugax00,pfugay00)+0.00001;
pcenx200=pcenx00+i*cos(direction00*pi/180);
pceny200=pceny00-i*sin(direction00*pi/180);

distancia100=point_distance(pcenx00,pceny00,pfugax00,pfugay00);
if(distancia100<=i){pcenx200=pfugax00;pceny200=pfugay00}

porcentaje000=i*100/distanciax00;
diagonal000=(diagonal00/2)-porcentaje000*(diagonal00/2)/100;

widthmin=(width00);
if(distancia100<=i){diagonal000=widthmin}
if(diagonal000<widthmin){diagonal000=widthmin}

pex00=pcenx200+diagonal000*cos((rotation00+45)*pi/180);
pey00=pceny200-diagonal000*sin((rotation00+45)*pi/180);
pfx00=pcenx200+diagonal000*cos((rotation00+45*3)*pi/180);
pfy00=pceny200-diagonal000*sin((rotation00+45*3)*pi/180);
pgx00=pcenx200+diagonal000*cos((rotation00+45*5)*pi/180);
pgy00=pceny200-diagonal000*sin((rotation00+45*5)*pi/180);
phx00=pcenx200+diagonal000*cos((rotation00+45*7)*pi/180);
phy00=pceny200-diagonal000*sin((rotation00+45*7)*pi/180);

//distancia100=point_distance(pcenx00,pceny00,pfugax00,pfugay00);

//dibujando triangulos
pen_color=c_black;
pen_color=brush_color;
//Cara 6
brush_color=color05;
pen_color=brush_color;
draw_triangle(phx00,phy00,pgx00,pgy00,pfx00,pfy00);
draw_triangle(phx00,phy00,pex00,pey00,pfx00,pfy00);
//Cara 5
brush_color=color04;
pen_color=brush_color;
draw_triangle(pax00,pay00,pex00,pey00,phx00,phy00);
draw_triangle(pax00,pay00,pdx00,pdy00,phx00,phy00);
//Cara 4
brush_color=color03;
pen_color=brush_color;
draw_triangle(pcx00,pcy00,pgx00,pgy00,phx00,phy00);
draw_triangle(pcx00,pcy00,pdx00,pdy00,phx00,phy00);
//Cara 3
brush_color=color02;
pen_color=brush_color;
draw_triangle(pbx00,pby00,pfx00,pfy00,pgx00,pgy00);
draw_triangle(pbx00,pby00,pcx00,pcy00,pgx00,pgy00);
//Cara 2
brush_color=color01;
pen_color=brush_color;
draw_triangle(pax00,pay00,pex00,pey00,pfx00,pfy00);
draw_triangle(pax00,pay00,pbx00,pby00,pfx00,pfy00);
//Cara 1
brush_color=color00;
pen_color=brush_color;
draw_triangle(pax00,pay00,pbx00,pby00,pcx00,pcy00);
draw_triangle(pax00,pay00,pdx00,pdy00,pcx00,pcy00);

pen_color=c_black;
//dibujando lineas
//Linea A-B
x1=pax00;y1=pay00;x2=pbx00;y2=pby00;
draw_line(x1,y1,x2,y2);
//Linea B-C
x1=pbx00;y1=pby00;x2=pcx00;y2=pcy00;
draw_line(x1,y1,x2,y2);
//Linea C-D
x1=pcx00;y1=pcy00;x2=pdx00;y2=pdy00;
draw_line(x1,y1,x2,y2);
//Linea D-A
x1=pdx00;y1=pdy00;x2=pax00;y2=pay00;
draw_line(x1,y1,x2,y2);

//Linea E-F
x1=pex00;y1=pey00;x2=pfx00;y2=pfy00;
draw_line(x1,y1,x2,y2);
//Linea F-G
x1=pfx00;y1=pfy00;x2=pgx00;y2=pgy00;
draw_line(x1,y1,x2,y2);
//Linea G-H
x1=pgx00;y1=pgy00;x2=phx00;y2=phy00;
draw_line(x1,y1,x2,y2);
//Linea H-E
x1=phx00;y1=phy00;x2=pex00;y2=pey00;
draw_line(x1,y1,x2,y2);

//Linea A-E
x1=pax00;y1=pay00;x2=pex00;y2=pey00;
draw_line(x1,y1,x2,y2);
//Linea B-F
x1=pbx00;y1=pby00;x2=pfx00;y2=pfy00;
draw_line(x1,y1,x2,y2);
//Linea C-G
x1=pcx00;y1=pcy00;x2=pgx00;y2=pgy00;
draw_line(x1,y1,x2,y2);
//Linea D-H
x1=pdx00;y1=pdy00;x2=phx00;y2=phy00;
draw_line(x1,y1,x2,y2);

Código con giro y color para game maker 6, 7, 8, html5 y mac.
Spoiler
///draw_cube( x, y, length, fugax, fugay, rotation);
//Ejemplo: draw_cube(x,y,50,256,256,direction,c_fuchsia);

posx00=argument0;
posy00=argument1;
width00=argument2/2;
height00=argument2;
length00=argument2;
pfugax00=argument3;
pfugay00=argument4;
rotation00=argument5;
color00=argument6;

c100=(color00=c_fuchsia);
c200=(color00=c_ltgray);
c300=(color00=c_purple);
c400=(color00=c_red);
c500=(color00=c_white);
c600=(color00=c_yellow);

if(!(c100 || c200 || c300 || c400 || c500 || c600))
{
color00+=25;
}

//c_aqua
//c_black
//c_blue
//c_dkgray
//c_fuchsia no+25
//c_gray
//c_green
//c_lime
//c_ltgray no+25
//c_maroon
//c_navy
//c_olive
//c_purple no+25
//c_red no+25
//c_silver
//c_teal
//c_white no+25
//c_yellow no+25


color01=color00-5;
color02=color00-5*2;
color03=color00-5*3;
color04=color00-5*4;
color05=color00-5*5;

//Diagonal
diagonal00=sqrt(power(length00,2)+power(height00,2));

//Punto central
pcenx00=posx00+(diagonal00/2)*cos(315*pi/180);
pceny00=posy00-(diagonal00/2)*sin(315*pi/180);

//Puntos del rectangulo
direction00=rotation00;
distancia00=diagonal00/2;
puntox00=pcenx00;
puntoy00=pceny00;
pax00=puntox00+distancia00*cos((direction00+45)*pi/180);
pay00=puntoy00-distancia00*sin((direction00+45)*pi/180);
pbx00=puntox00+distancia00*cos((direction00+45*3)*pi/180);
pby00=puntoy00-distancia00*sin((direction00+45*3)*pi/180);
pcx00=puntox00+distancia00*cos((direction00+45*5)*pi/180);
pcy00=puntoy00-distancia00*sin((direction00+45*5)*pi/180);
pdx00=puntox00+distancia00*cos((direction00+45*7)*pi/180);
pdy00=puntoy00-distancia00*sin((direction00+45*7)*pi/180);


i=width00;
direction00=point_direction(pcenx00,pceny00,pfugax00,pfugay00);
distanciax00=point_distance(pcenx00,pceny00,pfugax00,pfugay00)+0.00001;
pcenx200=pcenx00+i*cos(direction00*pi/180);
pceny200=pceny00-i*sin(direction00*pi/180);

distancia100=point_distance(pcenx00,pceny00,pfugax00,pfugay00);
if(distancia100<=i){pcenx200=pfugax00;pceny200=pfugay00}

porcentaje000=i*100/distanciax00;
diagonal000=(diagonal00/2)-porcentaje000*(diagonal00/2)/100;

widthmin=(width00);
if(distancia100<=i){diagonal000=widthmin}
if(diagonal000<widthmin){diagonal000=widthmin}

pex00=pcenx200+diagonal000*cos((rotation00+45)*pi/180);
pey00=pceny200-diagonal000*sin((rotation00+45)*pi/180);
pfx00=pcenx200+diagonal000*cos((rotation00+45*3)*pi/180);
pfy00=pceny200-diagonal000*sin((rotation00+45*3)*pi/180);
pgx00=pcenx200+diagonal000*cos((rotation00+45*5)*pi/180);
pgy00=pceny200-diagonal000*sin((rotation00+45*5)*pi/180);
phx00=pcenx200+diagonal000*cos((rotation00+45*7)*pi/180);
phy00=pceny200-diagonal000*sin((rotation00+45*7)*pi/180);

//distancia100=point_distance(pcenx00,pceny00,pfugax00,pfugay00);

//dibujando triangulos
pen_color=c_black;
//Cara 6
brush_color=color05;
pen_color=brush_color;
draw_set_color(pen_color);
draw_triangle(phx00,phy00,pgx00,pgy00,pfx00,pfy00,0);
draw_triangle(phx00,phy00,pex00,pey00,pfx00,pfy00,0);
//Cara 5
brush_color=color04;
pen_color=brush_color;
draw_set_color(pen_color);
draw_triangle(pax00,pay00,pex00,pey00,phx00,phy00,0);
draw_triangle(pax00,pay00,pdx00,pdy00,phx00,phy00,0);
//Cara 4
brush_color=color03;
pen_color=brush_color;
draw_set_color(pen_color);
draw_triangle(pcx00,pcy00,pgx00,pgy00,phx00,phy00,0);
draw_triangle(pcx00,pcy00,pdx00,pdy00,phx00,phy00,0);
//Cara 3
brush_color=color02;
pen_color=brush_color;
draw_set_color(pen_color);
draw_triangle(pbx00,pby00,pfx00,pfy00,pgx00,pgy00,0);
draw_triangle(pbx00,pby00,pcx00,pcy00,pgx00,pgy00,0);
//Cara 2
brush_color=color01;
pen_color=brush_color;
draw_set_color(pen_color);
draw_triangle(pax00,pay00,pex00,pey00,pfx00,pfy00,0);
draw_triangle(pax00,pay00,pbx00,pby00,pfx00,pfy00,0);
//Cara 1
brush_color=color00;
pen_color=brush_color;
draw_set_color(pen_color);
draw_triangle(pax00,pay00,pbx00,pby00,pcx00,pcy00,0);
draw_triangle(pax00,pay00,pdx00,pdy00,pcx00,pcy00,0);

pen_color=c_black;
draw_set_color(pen_color);

//dibujando lineas
//Linea A-B
x1=pax00;y1=pay00;x2=pbx00;y2=pby00;
draw_line(x1,y1,x2,y2);
//Linea B-C
x1=pbx00;y1=pby00;x2=pcx00;y2=pcy00;
draw_line(x1,y1,x2,y2);
//Linea C-D
x1=pcx00;y1=pcy00;x2=pdx00;y2=pdy00;
draw_line(x1,y1,x2,y2);
//Linea D-A
x1=pdx00;y1=pdy00;x2=pax00;y2=pay00;
draw_line(x1,y1,x2,y2);

//Linea E-F
x1=pex00;y1=pey00;x2=pfx00;y2=pfy00;
draw_line(x1,y1,x2,y2);
//Linea F-G
x1=pfx00;y1=pfy00;x2=pgx00;y2=pgy00;
draw_line(x1,y1,x2,y2);
//Linea G-H
x1=pgx00;y1=pgy00;x2=phx00;y2=phy00;
draw_line(x1,y1,x2,y2);
//Linea H-E
x1=phx00;y1=phy00;x2=pex00;y2=pey00;
draw_line(x1,y1,x2,y2);

//Linea A-E
x1=pax00;y1=pay00;x2=pex00;y2=pey00;
draw_line(x1,y1,x2,y2);
//Linea B-F
x1=pbx00;y1=pby00;x2=pfx00;y2=pfy00;
draw_line(x1,y1,x2,y2);
//Linea C-G
x1=pcx00;y1=pcy00;x2=pgx00;y2=pgy00;
draw_line(x1,y1,x2,y2);
//Linea D-H
x1=pdx00;y1=pdy00;x2=phx00;y2=phy00;
draw_line(x1,y1,x2,y2);

Código con giro y color para game maker studio 1 y 2.
Spoiler
///draw_cube( x, y, length, fugax, fugay, rotation);
//Ejemplo: draw_cube(mouse_x,mouse_y,50,room_width/2,room_height/2,direction,c_fuchsia);


posx00=argument0;
posy00=argument1;
width00=argument2/2;
height00=argument2;
length00=argument2;
pfugax00=argument3;
pfugay00=argument4;
rotation00=argument5;
color00=argument6;

c100=(color00=c_fuchsia);
c200=(color00=c_ltgray);
c300=(color00=c_purple);
c400=(color00=c_red);
c500=(color00=c_white);
c600=(color00=c_yellow);

if(!(c100 || c200 || c300 || c400 || c500 || c600))
{
color00+=25;
}

//c_aqua
//c_black
//c_blue
//c_dkgray
//c_fuchsia no+25
//c_gray
//c_green
//c_lime
//c_ltgray no+25
//c_maroon
//c_navy
//c_olive
//c_purple no+25
//c_red no+25
//c_silver
//c_teal
//c_white no+25
//c_yellow no+25


color01=color00-5;
color02=color00-5*2;
color03=color00-5*3;
color04=color00-5*4;
color05=color00-5*5;

//Diagonal
diagonal00=sqrt(power(length00,2)+power(height00,2));

//Punto central
pcenx00=posx00+(diagonal00/2)*cos(315*pi/180);
pceny00=posy00-(diagonal00/2)*sin(315*pi/180);

//Puntos del rectangulo
direction00=rotation00;
distancia00=diagonal00/2;
puntox00=pcenx00;
puntoy00=pceny00;
pax00=puntox00+distancia00*cos((direction00+45)*pi/180);
pay00=puntoy00-distancia00*sin((direction00+45)*pi/180);
pbx00=puntox00+distancia00*cos((direction00+45*3)*pi/180);
pby00=puntoy00-distancia00*sin((direction00+45*3)*pi/180);
pcx00=puntox00+distancia00*cos((direction00+45*5)*pi/180);
pcy00=puntoy00-distancia00*sin((direction00+45*5)*pi/180);
pdx00=puntox00+distancia00*cos((direction00+45*7)*pi/180);
pdy00=puntoy00-distancia00*sin((direction00+45*7)*pi/180);


i=width00;
direction00=point_direction(pcenx00,pceny00,pfugax00,pfugay00);
distanciax00=point_distance(pcenx00,pceny00,pfugax00,pfugay00)+0.00001;
pcenx200=pcenx00+i*cos(direction00*pi/180);
pceny200=pceny00-i*sin(direction00*pi/180);

distancia100=point_distance(pcenx00,pceny00,pfugax00,pfugay00);
if(distancia100<=i){pcenx200=pfugax00;pceny200=pfugay00}

porcentaje000=i*100/distanciax00;
diagonal000=(diagonal00/2)-porcentaje000*(diagonal00/2)/100;

widthmin=(width00);
if(distancia100<=i){diagonal000=widthmin}
if(diagonal000<widthmin){diagonal000=widthmin}

pex00=pcenx200+diagonal000*cos((rotation00+45)*pi/180);
pey00=pceny200-diagonal000*sin((rotation00+45)*pi/180);
pfx00=pcenx200+diagonal000*cos((rotation00+45*3)*pi/180);
pfy00=pceny200-diagonal000*sin((rotation00+45*3)*pi/180);
pgx00=pcenx200+diagonal000*cos((rotation00+45*5)*pi/180);
pgy00=pceny200-diagonal000*sin((rotation00+45*5)*pi/180);
phx00=pcenx200+diagonal000*cos((rotation00+45*7)*pi/180);
phy00=pceny200-diagonal000*sin((rotation00+45*7)*pi/180);

//distancia100=point_distance(pcenx00,pceny00,pfugax00,pfugay00);

//dibujando triangulos
//Cara 6
brush_color=color05;
pen_color=brush_color;
//draw_set_color(pen_color);
draw_set_colour(pen_color);
draw_triangle(phx00,phy00,pgx00,pgy00,pfx00,pfy00);
draw_triangle(phx00,phy00,pex00,pey00,pfx00,pfy00);
//Cara 5
brush_color=color04;
pen_color=brush_color;
//draw_set_color(pen_color);
draw_set_colour(pen_color);
draw_triangle(pax00,pay00,pex00,pey00,phx00,phy00);
draw_triangle(pax00,pay00,pdx00,pdy00,phx00,phy00);
//Cara 4
brush_color=color03;
pen_color=brush_color;
//draw_set_color(pen_color);
draw_set_colour(pen_color);
draw_triangle(pcx00,pcy00,pgx00,pgy00,phx00,phy00);
draw_triangle(pcx00,pcy00,pdx00,pdy00,phx00,phy00);
//Cara 3
brush_color=color02;
pen_color=brush_color;
//draw_set_color(pen_color);
draw_set_colour(pen_color);
draw_triangle(pbx00,pby00,pfx00,pfy00,pgx00,pgy00);
draw_triangle(pbx00,pby00,pcx00,pcy00,pgx00,pgy00);
//Cara 2
brush_color=color01;
pen_color=brush_color;
//draw_set_color(pen_color);
draw_set_colour(pen_color);
draw_triangle(pax00,pay00,pex00,pey00,pfx00,pfy00);
draw_triangle(pax00,pay00,pbx00,pby00,pfx00,pfy00);
//Cara 1
brush_color=color00;
pen_color=brush_color;
//draw_set_color(pen_color);
draw_set_colour(pen_color);
draw_triangle(pax00,pay00,pbx00,pby00,pcx00,pcy00);
draw_triangle(pax00,pay00,pdx00,pdy00,pcx00,pcy00);

pen_color=c_black;
//draw_set_color(pen_color);
draw_set_colour(pen_color);

//dibujando lineas
//Linea A-B
x1=pax00;y1=pay00;x2=pbx00;y2=pby00;
draw_line(x1,y1,x2,y2);
//Linea B-C
x1=pbx00;y1=pby00;x2=pcx00;y2=pcy00;
draw_line(x1,y1,x2,y2);
//Linea C-D
x1=pcx00;y1=pcy00;x2=pdx00;y2=pdy00;
draw_line(x1,y1,x2,y2);
//Linea D-A
x1=pdx00;y1=pdy00;x2=pax00;y2=pay00;
draw_line(x1,y1,x2,y2);

//Linea E-F
x1=pex00;y1=pey00;x2=pfx00;y2=pfy00;
draw_line(x1,y1,x2,y2);
//Linea F-G
x1=pfx00;y1=pfy00;x2=pgx00;y2=pgy00;
draw_line(x1,y1,x2,y2);
//Linea G-H
x1=pgx00;y1=pgy00;x2=phx00;y2=phy00;
draw_line(x1,y1,x2,y2);
//Linea H-E
x1=phx00;y1=phy00;x2=pex00;y2=pey00;
draw_line(x1,y1,x2,y2);

//Linea A-E
x1=pax00;y1=pay00;x2=pex00;y2=pey00;
draw_line(x1,y1,x2,y2);
//Linea B-F
x1=pbx00;y1=pby00;x2=pfx00;y2=pfy00;
draw_line(x1,y1,x2,y2);
//Linea C-G
x1=pcx00;y1=pcy00;x2=pgx00;y2=pgy00;
draw_line(x1,y1,x2,y2);
//Linea D-H
x1=pdx00;y1=pdy00;x2=phx00;y2=phy00;
draw_line(x1,y1,x2,y2);
Modo de uso:
1. Copia el código.
2. Crea un nuevo script, pegas el código y colocale de nombre draw_cube.
3. En un evento draw de un objeto cualquiera coloca el siguiente código y modifícalo a tu gusto:
draw_cube(256,256,64,64,64,45,45);

Detalles de la función draw_cube
draw_cube( x, y, width, height, length, anglex, angley):
X y Y: Posición de la esquina superior izquierda del cubo, es la ubicación del cubo en la room.
Width, height y length: Coloca en estos el ancho, la altura y el largo respectivamente, guiándote por el siguiente dibujo.
Anglex y angley: son los ángulos de inclinación del cubo los cuales no deben ser menores de -45 ni mayores a 45 grados.
fugax y fugay: Es la posición del punto de fuga en el plano. (Estudiar proyección cónica).
Imagen1:


Imagen 2:


Vista previa:


Limitaciones:
1. El cubo no podrá girar 360 grados, tiene un límite de giro de 45 grados.
2. El cubo no puede adquirir textura ni color de fondo.

Importancia:
Este script contiene los fundamentos básicos de proyección cónica con un punto de fuga (estudiar sobre proyección cónica) y servirá de base para la creación de otros scripts con dos o más puntos de fugas, lo que puede permitir la formación de objetos 3d más exactos y complejos sin necesidad de emplear funciones 3d.

Orígen:
Desde hace algunos años tengo la intención de crear algún juego 3d en game makers que no empleen 3d y luego de investigar encontré el tema de proyecciones cónicas suministrado por un canal de youtube llamado .

Mejoras en proceso:
1. Giro de 360 grados.
2. Funcion para agregar color de fondo.
3. Rotación desde su punto central: lo que se quiere es que el cubo pueda girar sobre su punto central.

Dificultades de programación:
Quiero mejorar el script agregándole la posibilidad de girar el cubo a 360 grados y no encuentro tutorial de proyección cónica que explique eso, sólo encontré un tutorial de entivoo ()que indica que para lograr un giro completo es necesario pasar de “dos puntos de fuga” a “un punto de fuga” (proyecciones cónicas) pero no me explica cómo, para lograr eso es necesario comprender al 100% la transición que existe entre dos puntos de fuga a un punto de fuga.
Intenté crear un script que involucra dos puntos de fuga pero me resultó bastante malo, en el proceso logré echarle un vistazo a lo que me espera y ahora sé que para abordar ese tema será bueno mejorar el presente script (de un punto de fuga) agregándole más funciones complejas y útiles que permita un giro en 2D y agregar colores mediante triángulos.

Visión a futuro:
Bueno…, sin esperanza no hay programación. Más adelante si Dios lo permite y si recibo ayuda intelectual y quizás económica, pienso crear un script más complejo que permita la formación de figuras 3d a base de triángulos en el espacio, lo que me permitirá crear una versión de starfox de snes. Ya sé que game  maker cuenta con un avanzado sistema 3d que lo facilita todo, pero tomaré el camino difícil para encontrar en el proceso otros códigos más complejos que jamás pudiese haber imaginado.

Imágenes:
Bueno, estos son algunos juegos que quiero aprender a programar desde cero empleando proyección cónica, los cuales me mantienen motivado para seguir con este tema tan fantástico:

Clásico laberinto de Windows 95


Top Gear snes


Mario Kart Snes

Star fox snes



Cubo a cubo lograremos el objetivo



Nos vemos.


« Última modificación: Mayo 26, 2021, 04:26:30 am por dixon »

Si Dios quiere; Limpiaré la oficina, puliré el piso y les serviré café a todos, luego, me enseñarán a programar e iré a comprarles más café.
 


No Tienes Permisos Para Dar Puntos
point 10 Puntos

Usuarios que puntuaron el tema » brunoxzx (10 Pts) 


 


Warning: Parameter 1 to spoiler_buffer() expected to be a reference, value given in Unknown on line 0

Warning: Parameter 1 to custom_report_ob() expected to be a reference, value given in Unknown on line 0