Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Alesxanderk en Mayo 08, 2016, 03:24:31 AM

Título: Ayuda conocedores de GML - Sistema de busqueda/visión
Publicado por: Alesxanderk en Mayo 08, 2016, 03:24:31 AM
Espero que los ya un poco experimentados en GM:S me ayuden a optimizar o rehacer de mejor forma un script de niebla de guerra y que al mismo tiempo uso para la IA de mi juego RogueLike Project.

El problema es que el script es muy pesado para ejecutarlo en varias instancias, aunque no lo hago en todas al mismo tiempo ni en los eventos steps.

Les explico como lo uso:
- Es un sistema de micro turnos en los cuales, el objeto controlador va activando una alarma de las distintas instancias enemigas, una a una. En esa alarma se ejecuta el script en cuestión para buscar al heroe y así determinar si estoy en su rango visible o no, para perseguirme o en caso de estar a su lado atacarme.

Dejo acá el codigo para quien quiera verlo, en los adjuntos dejo un ejecutable para que vean como funciona, con el boton derecho del ratón creas "Paredes", con el izquierdo creas "Suelos" y con WASD el personaje se mueve. Tengo intensión de publicar el script en su apartado correspondiente una vez logre optimizarlo.

NOTA: Procuren no acercarse demasiado al borde o les saltara error por que uso un array para saber que hay en cada tile de 32x32 del mapa.

[spoiler]

Rep=0;ObZ1=false;ObZ2=false;ObZ3=false;ObZ4=false;Vuelta=0;
zx = x/32;
zy = y/32;
repeat(8){
    switch(Vuelta){
        case 0: Rep=5;Ext=4; break;case 1: Rep=5;Ext=3; break;
        case 2: Rep=4;Ext=3; break;case 3: Rep=4;Ext=2; break;
        case 4: Rep=3;Ext=1; break;
        case 5: Rep=2;Ext=0; break;case 6: Rep=2;Ext=0; break;
        case 7: Rep=1;Ext=0; break;
    }
    if Mundo[zx,zy+Vuelta]==1{
        if ObZ1==false{
            draw_sprite(spr_blanco,0,zx*32,(zy+Vuelta)*32);
            Ob1=false;j=0;k=0;Int=1;
            repeat(Rep){
                if Mundo[zx+j,zy+(Vuelta+k)]==1{
                    if Ob1==false{
                        draw_sprite(spr_blanco,0,(zx+j)*32,(zy+Vuelta+k)*32);
                        if Int<=Ext{
                            if Mundo[zx+j,zy+(Vuelta+k)+1]==1{
                                draw_sprite(spr_blanco,0,(zx+j)*32,(zy+Vuelta+k+1)*32);
                            }
                        }
                    }
                }
                else if Ob1==false{Ob1=true;}
                j++;k++;Int++;
            }
            Ob1=false;j=0;k=0;Int=0;
            repeat(Rep){
                if Mundo[zx+j,zy+(Vuelta+k)]==1{
                    if Ob1==false{
                        draw_sprite(spr_blanco,0,(zx+j)*32,(zy+Vuelta+k)*32);
                        if Int<=Ext{
                            if Mundo[zx+j,zy+(Vuelta+k)+1]==1{
                                draw_sprite(spr_blanco,0,(zx+j)*32,(zy+Vuelta+k+1)*32);
                            }
                        }
                    }
                }
                else if Ob1==false{Ob1=true;}
                j--;k++;Int++
            }
        }
    }
    else if ObZ1==false{ObZ1=true;}
    if Mundo[zx,zy-Vuelta]==1{
        if ObZ2==false{
            draw_sprite(spr_blanco,0,zx*32,(zy-Vuelta)*32);
            Ob1=false;j=0;k=0;Int=0;
            repeat(Rep){
                if Mundo[zx+j,zy-(Vuelta+k)]==1{
                    if Ob1==false{
                        draw_sprite(spr_blanco,0,(zx+j)*32,(zy-(Vuelta+k))*32);
                        if Int<=Ext{
                            if Mundo[zx+j,zy-(Vuelta+k)-1]==1{
                                draw_sprite(spr_blanco,0,(zx+j)*32,(zy-(Vuelta+k)-1)*32);
                            }
                        }
                    }
                }
                else if Ob1==false{Ob1=true;}
                j++;k++;Int++;
            }
            Ob1=false;j=0;k=0;Int=0;
            repeat(Rep){
                if Mundo[zx+j,zy-(Vuelta+k)]==1{
                    if Ob1==false{
                        draw_sprite(spr_blanco,0,(zx+j)*32,(zy-(Vuelta+k))*32);
                        if Int<=Ext{
                            if Mundo[zx+j,zy-(Vuelta+k)-1]==1{
                                draw_sprite(spr_blanco,0,(zx+j)*32,(zy-(Vuelta+k)-1)*32);
                            }
                        }
                    }
                }
                else if Ob1==false{Ob1=true;}
                j--;k++;Int++;
            }
        }
    }
    else if ObZ2==false{ObZ2=true;}
    if Mundo[zx+Vuelta,zy]==1{
        if ObZ3==false{
            draw_sprite(spr_blanco,0,(zx+Vuelta)*32,zy*32);
            Ob1=false;k=0;i=0;Int=0;
            repeat(Rep){
                if Mundo[zx+(Vuelta+k),zy+i]==1{
                    if Ob1==false{
                        draw_sprite(spr_blanco,0,(zx+Vuelta+k)*32,(zy+i)*32);
                        if Int<=Ext{
                            if Mundo[zx+(Vuelta+k)+1,zy+i]==1{
                                draw_sprite(spr_blanco,0,(zx+Vuelta+k+1)*32,(zy+i)*32);
                            }
                        }
                    }
                }
                else if Ob1==false{Ob1=true;}
                k++;i++;Int++
            }
            Ob1=false;k=0;i=0;Int=0;
            repeat(Rep){
                if Mundo[zx+(Vuelta+k),zy+i]==1{
                    if Ob1==false{
                        draw_sprite(spr_blanco,0,(zx+Vuelta+k)*32,(zy+i)*32);
                        if Int<=Ext{
                            if Mundo[zx+(Vuelta+k)+1,zy+i]==1{
                                draw_sprite(spr_blanco,0,(zx+Vuelta+k+1)*32,(zy+i)*32);
                            }
                        }
                    }
                }
                else if Ob1==false{Ob1=true;}
                k++;i--;Int++;
            }
        }
    }
    else if ObZ3==false{ObZ3=true;}
    if Mundo[zx-Vuelta,zy]==1{
        if ObZ4==false{
            draw_sprite(spr_blanco,0,(zx-Vuelta)*32,zy*32);
            Ob1=false;i=0;k=0;Int=0;
            repeat(Rep){
                if Mundo[zx-(Vuelta+k),zy+i]==1{
                    if Ob1==false{
                        draw_sprite(spr_blanco,0,(zx-(Vuelta+k))*32,(zy+i)*32);
                        if Int<=Ext{
                            if Mundo[zx-(Vuelta+k)-1,zy+i]==1{
                                draw_sprite(spr_blanco,0,(zx-(Vuelta+k)-1)*32,(zy+i)*32);
                            }
                        }
                    }
                }
                else if Ob1==false{Ob1=true;}
                k++;i++;Int++;
            }
            Ob1=false;k=0;i=0;Int=0;
            repeat(Rep){
                if Mundo[zx-(Vuelta+k),zy+i]==1{
                    if Ob1==false{
                        draw_sprite(spr_blanco,0,(zx-(Vuelta+k))*32,(zy+i)*32);
                        if Int<=Ext{
                            if Mundo[zx-(Vuelta+k)-1,zy+i]==1{
                                draw_sprite(spr_blanco,0,(zx-(Vuelta+k)-1)*32,(zy+i)*32);
                            }
                        }
                    }
                }
                else if Ob1==false{Ob1=true;}
                k++;i--;Int++;
            }
        }
    }
    else if ObZ4==false{ObZ4=true;}
    Vuelta++;
}

[/spoiler]