Noticias

¡Ayuda a la Comunidad GM, haz una donación!

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: Ayuda con Código de minimapa de Kakashinga (o algo así)  (Leído 454 veces)

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

Desconectado WolfIng Entertainment

  • Habitual
  • *
  • Puntos: 64
  • Mensajes: 40
  • Sexo: Masculino
    • Ver Perfil
Buenas de Nuevo!

Como vereis, me estoy volviendo asiduo de este foro xD...
buscando por aquí vi un post del 2009 de alguien llamado kakashinga o algo parecido y la verdad esque su código me ha sido muy útil es este:

// Tyranic-Moron's Minimap Script

// Supports up to 3 teams.
// Just credit me if you use it, and I'll be happy :)
// PM me for more help if you need it (my username is tyranic-moron)

// To use, put the following code in the draw event of the minimap object:
// scrMinimap(ratio,alpha,color,xoffset,yoffset,usesprite,usepulse,team1,team1color,team1rad,team2,team2color,team2rad,team3,team3color,team3rad)
// see below for more detailed descriptions of each section

// Example:
// scrMinimap(200/room_width, 0.5, c_black, 0, 0, false, true, parent_player, c_lime, 1, parent_enemy, c_red, 1, parent_other, c_gray, 1)

// ratio = room to minimap ratio (use desired width / room_width) (argument0)
// alpha = alpha level for drawing (transparency) (argument1)
// color = colour of map (argument2)
// xoffset = the x-offset of the minimap (argument3)
// yoffset = the y-offset of the minimap (argument4)
// usesprite = whether or not to use a sprite (true/false) (argument5)
// usepulse = whether or not to pulse the area currently being viewed (true/false) (argument6)
// team1 = player object name, or parent of (argument7)
// team1color = colour of player objects (on map) (argument8)
// team1rad = size of player 'blips' on minimap (5 is HUGE, normally 1) (argument9)
// team2 = enemy object name, or parent of (argument10)
// team2color = colour of enemy objects (on map) (argument11)
// team2rad = size of enemy 'blips' on minimap (5 is HUGE, normally 1) (argument12)
// team3 = other object name, or parent of (argument13)
// team3color = colour of other objects (on map) (argument14)
// team3rad = size of other 'blips' on minimap (5 is HUGE, normally 1) (argument15)

var pulsecolor, dir

draw_set_alpha(argument1)
draw_set_color(argument2)

// Draws the minimap background
if (argument5 = true) {
    if (gamemaker_registered = true) {
        draw_sprite_ext(sprMinimap, 0, view_xview[0] + argument3, view_yview[0] + argument4, argument0*room_width, argument0*room_width, 0, argument2, argument1)
    } else {
        draw_sprite(sprMinimap, 0, view_xview[0] + argument3, view_yview[0] + argument4)
    }
} else {
    draw_rectangle(view_xview[0] + argument3, view_yview[0] + argument4, view_xview[0] + argument3 + room_width * argument0, view_yview[0] + argument4 + room_height * argument0, false)
}

// Draws a rectangle on the minimap, showing the current view in the room (if argument4 = true, it will pulse as well)
if (argument6 = true) {
    if (dir = 0 or pulsecolor = 0) {
        dir = 1
        pulsecolor = 100
    }
    if (pulsecolor < 255 and dir = 1) {
        pulsecolor += 5
    } else {
        dir = 2
    }
    if (pulsecolor > 100 and dir = 2) {
        pulsecolor -= 5
    } else {
        dir = 1
    }
    if (pulsecolor = 255) {
        dir = 2
    }
    if (pulsecolor = 100) {
        dir = 1
    }
} else {
    pulsecolor = 255
}
draw_set_alpha(argument1/2)
draw_set_color(make_color_rgb(pulsecolor,pulsecolor,pulsecolor))
draw_rectangle(view_xview[0] + argument3 + view_xview[0] * argument0, view_yview[0] + argument4 + view_yview[0] * argument0, view_xview[0] + argument3 + (view_xview[0] + view_wview[0]) * argument0, view_yview[0] + argument4 + (view_yview[0] + view_hview[0]) * argument0, false)

// Draw the dots for each object
draw_set_alpha(argument1)
with(argument7) {
    draw_set_color(argument8)
    draw_circle(view_xview[0] + argument3 + x * argument0, view_yview[0] + argument4 + y * argument0, argument9, false)
}
with(argument10) {
    draw_set_color(argument11)
    draw_circle(view_xview[0] + argument3 + x * argument0, view_yview[0] + argument4 + y * argument0, argument12, false)
}
with(argument13) {
    draw_set_color(argument14)
    draw_circle(view_xview[0] + argument3 + x * argument0, view_yview[0] + argument4 + y * argument0, argument15, false)
}

// Move view to clicked point on minimap
if ((mouse_x >= view_xview[0] + argument3 and mouse_x <= view_xview[0] + argument3 + (argument0 * room_width)) and (mouse_y >= view_yview[0] + argument4 and mouse_y <= view_yview[0] + argument4 + (argument0 * room_height)) and mouse_check_button(mb_left)) {
        view_xview[0] = ((mouse_x - view_xview[0] - argument3) / argument0) - (view_wview[0] / 2)
        view_yview[0] = ((mouse_y - view_yview[0] - argument4) / argument0) - (view_hview[0] / 2)
}

// Stops the view going outside the room
if (view_xview[0] < 0) {
    view_xview[0] = 0
}
if (view_xview[0] > room_width - view_wview[0]) {
    view_xview[0] = room_width - view_wview[0]
}
if (view_yview[0] < 0) {
    view_yview[0] = 0
}
if (view_yview[0] > room_height - view_hview[0]) {
    view_yview[0] = room_height - view_hview[0]
}


pero me ha surgido una pregunta, el código soporta hasta tres puntos en el minimapa, la pregunta era ¿como puedo hacer para que soporte por lo menos otros dos puntos, es decir, cinco puntos en total?

Muchas Gracias

 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado Clamud

Respuesta #1 en: Mayo 01, 2015, 06:30:36 pm
Uno de los detalles que hay que tomar en cuenta es que el script ya ocupa el número máximo de argumentos (16 argumentos), por lo que se necesita un modo diferente de meter los datos. Una opción es usar un arreglo, pero en :GM8: los arreglos no se pueden pasar por referencia, así que la mejor opción es usar una ds_list. He modificado el script y ahora no hay límite de objetos.

Primero se debe crear una lista y agregarle los parámetros de los objetos, ejemplo:
datos = ds_list_create();

//Primer objeto
ds_list_add( datos, parent_player); //objeto
ds_list_add( datos, c_lime);        //color
ds_list_add( datos, 1 );            //radio

//Segundo objeto
ds_list_add( datos, parent_enemy ); //objeto
ds_list_add( datos, c_red );        //color
ds_list_add( datos, 1 );            //radio

//Tercer objeto
ds_list_add( datos, parent_other ); //objeto
ds_list_add( datos, c_gray );       //color
ds_list_add( datos, 1 );            //radio

Después el script se debe usar con la lista como argumento, ejemplo:
scrMinimap( 200/room_width, 0.5, c_black, 0, 0, false, true, datos );

Dentro del script he modificado la parte que dibuja los puntos
// Dibujar puntos para cada objeto
draw_set_alpha(argument1)
for( i=0; i<ds_list_size(argument7)/3; i+=1 )
{
    with ds_list_find_value(argument7,i*3)
    {
        draw_set_color( ds_list_find_value(argument7,i*3+1) );
        draw_circle( view_xview[0] + argument3 + x * argument0,
                     view_yview[0] + argument4 + y * argument0,
                     ds_list_find_value(argument7,i*3+2), false)
    }
}

El script completo está dentro del spoiler, no lo he probado, cualquier error me avisas.
Spoiler
// Tyranic-Moron's Minimap Script
// Modificado por Clamud

// No hay límite de equipos
// Just credit me if you use it, and I'll be happy :)
// PM me for more help if you need it (my username is tyranic-moron)

// Para usar primero es necesario crear una lista con tres parámetros consecutivos para cada equipo, ejemplo:
/*
   datos = ds_list_create();
   
   //Primer objeto
   ds_list_add( datos, parent_player); //objeto
   ds_list_add( datos, c_lime);        //color
   ds_list_add( datos, 1 );            //radio
   
   //Segundo objeto
   ds_list_add( datos, parent_enemy ); //objeto
   ds_list_add( datos, c_red );        //color
   ds_list_add( datos, 1 );            //radio
   
   //Tercer objeto
   ds_list_add( datos, parent_other ); //objeto
   ds_list_add( datos, c_gray );       //color
   ds_list_add( datos, 1 );            //radio
*/
// después se debe proporcionar la lista como argumento, además de otros parámetros
// scrMinimap( ratio, alpha, color, xoffset, yoffset, usesprite, usepulse, lista );

// Example:
// scrMinimap(200/room_width, 0.5, c_black, 0, 0, false, true, datos );

// ratio = room to minimap ratio (use desired width / room_width) (argument0)
// alpha = alpha level for drawing (transparency) (argument1)
// color = colour of map (argument2)
// xoffset = the x-offset of the minimap (argument3)
// yoffset = the y-offset of the minimap (argument4)
// usesprite = whether or not to use a sprite (true/false) (argument5)
// usepulse = whether or not to pulse the area currently being viewed (true/false) (argument6)
// lista = indice de la lista que contiene los parámetros para los objetos (argument7)

var pulsecolor, dir, i;

draw_set_alpha(argument1)
draw_set_color(argument2)

// Draws the minimap background
if (argument5 = true) {
    if (gamemaker_registered = true) {
        draw_sprite_ext(sprMinimap, 0, view_xview[0] + argument3, view_yview[0] + argument4, argument0*room_width, argument0*room_width, 0, argument2, argument1)
    } else {
        draw_sprite(sprMinimap, 0, view_xview[0] + argument3, view_yview[0] + argument4)
    }
} else {
    draw_rectangle(view_xview[0] + argument3, view_yview[0] + argument4, view_xview[0] + argument3 + room_width * argument0, view_yview[0] + argument4 + room_height * argument0, false)
}

// Draws a rectangle on the minimap, showing the current view in the room (if argument4 = true, it will pulse as well)
if (argument6 = true) {
    if (dir = 0 or pulsecolor = 0) {
        dir = 1
        pulsecolor = 100
    }
    if (pulsecolor < 255 and dir = 1) {
        pulsecolor += 5
    } else {
        dir = 2
    }
    if (pulsecolor > 100 and dir = 2) {
        pulsecolor -= 5
    } else {
        dir = 1
    }
    if (pulsecolor = 255) {
        dir = 2
    }
    if (pulsecolor = 100) {
        dir = 1
    }
} else {
    pulsecolor = 255
}
draw_set_alpha(argument1/2)
draw_set_color(make_color_rgb(pulsecolor,pulsecolor,pulsecolor))
draw_rectangle(view_xview[0] + argument3 + view_xview[0] * argument0, view_yview[0] + argument4 + view_yview[0] * argument0, view_xview[0] + argument3 + (view_xview[0] + view_wview[0]) * argument0, view_yview[0] + argument4 + (view_yview[0] + view_hview[0]) * argument0, false)

// Dibujar puntos para cada objeto
draw_set_alpha(argument1)
for( i=0; i<ds_list_size(argument7)/3; i+=1 )
{
    with ds_list_find_value(argument7,i*3)
    {
        draw_set_color( ds_list_find_value(argument7,i*3+1) );
        draw_circle( view_xview[0] + argument3 + x * argument0,
                     view_yview[0] + argument4 + y * argument0,
                     ds_list_find_value(argument7,i*3+2), false)
    }
}

// Move view to clicked point on minimap
if ((mouse_x >= view_xview[0] + argument3 and mouse_x <= view_xview[0] + argument3 + (argument0 * room_width)) and (mouse_y >= view_yview[0] + argument4 and mouse_y <= view_yview[0] + argument4 + (argument0 * room_height)) and mouse_check_button(mb_left)) {
        view_xview[0] = ((mouse_x - view_xview[0] - argument3) / argument0) - (view_wview[0] / 2)
        view_yview[0] = ((mouse_y - view_yview[0] - argument4) / argument0) - (view_hview[0] / 2)
}

// Stops the view going outside the room
if (view_xview[0] < 0) {
    view_xview[0] = 0
}
if (view_xview[0] > room_width - view_wview[0]) {
    view_xview[0] = room_width - view_wview[0]
}
if (view_yview[0] < 0) {
    view_yview[0] = 0
}
if (view_yview[0] > room_height - view_hview[0]) {
    view_yview[0] = room_height - view_hview[0]
}

 


Desconectado kakashigna

Respuesta #2 en: Mayo 02, 2015, 01:22:09 am
Solo espero, que algún dia... alguien escriba bien mi nick D:
Paso a saludar, sin duda es una buena idea compañero "Clamud" de pasar los datos por listas, como anécdota, en Game maker studio creo que si se pueden pasar arrays por referencia xD

Saludos!

Orgulloso veterano de CGM
El poder de hacer un buen juego esta en tus manos.
 


Desconectado WolfIng Entertainment

  • Habitual
  • *
  • Puntos: 64
  • Mensajes: 40
  • Sexo: Masculino
    • Ver Perfil
Respuesta #3 en: Mayo 02, 2015, 03:28:31 pm
Muchas gracias por modificarlo, pero en la versión lite de GM no puedo usar las ds_list, tendré que pasar el juego a 8.1  :D, otra cosilla, si creo el objeto parent de los enemigos solo necesitaría un objeto para que me saliesen todos los puntos de los enemigos en el minimapa no?? y para que el punto de mi jugador vaya cambiando cada vez que cambio de objeto, también valdría solo con hacer el objeto parent??

Muchas Gracias