Noticias

Importante: ¡Si quieres publicar tu juego no olvides leer este tema!

* 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: Items con descripcion[Solucionado]  (Leído 658 veces)

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

Desconectado Bangaran

  • Habitual
  • *
  • Puntos: 48
  • Mensajes: 25
  • Sexo: Masculino
    • Ver Perfil
en: Junio 23, 2021, 06:27:51 pm
Hola amigos

Tengo una consulta
ya solucionado el tema del inventario quisiera que cuando ya tenga los items en el inventario
en el cuadro de al lado al poner el mouse en el ítem salga la descripción del articulo.

alguien me pude ayudar guiarme

« Última modificación: Junio 27, 2021, 06:19:09 pm por Bangaran »

 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado 3dgeminis

Respuesta #1 en: Junio 25, 2021, 02:53:04 am
Como seleccionas los items en el inventario?

 


Desconectado Bangaran

  • Habitual
  • *
  • Puntos: 48
  • Mensajes: 25
  • Sexo: Masculino
    • Ver Perfil
Respuesta #2 en: Junio 25, 2021, 03:00:02 am
Tengo un objeto Inventario
 En el create
///Variables
open = true;

L = 18; //Distancia entre dos slots
slotT = 16; //Total de slots

for (i = 1; i <= slotT; i++;) {
    slot[i] = 0; //Item que almacena el slot i
    slot_n[i] = 0; //Cantidad de ítems en el slot
}

//variables del mouse
mouse = 0;
mouse_n = 0; //Cantidad de ítems en el mouse

en el Evento Draw
//Dibujar Inventario


if open {
    var h = 0,
        k = 0,
        vx = view_xport,
        vy = view_yport,
        color = c_ltgray;
       
    for (i=1; i<=slotT; i++;) {
        //coordenadas individuales
        var sx = vx + L*k, sy = vy + L*h;
       
        //interaccion
        if point_in_rectangle(mouse_x, mouse_y, sx, sy, sx+16, sy+16) {
            //click
            if mouse_check_button_pressed(mb_left){
                //mouse vacio y slot lleno
                if mouse = 0 and slot [i] != 0 {
                    mouse = slot[i];
                    mouse_n = slot_n[i];
                    slot[i] = 0;
                    slot_n[i] = 0;
                }
                //mouse lleno y slot vacio
                else if mouse != 0 and slot[i] = 0 {
                    slot[i] = mouse;
                    slot_n[i] = mouse_n;
                    mouse = 0;
                    mouse_n = 0;
                }
                //mouse lleno y slot lleno
                else if mouse != 0 and slot[i] != 0 {
                    //variable de respaldo
                    var _item = slot[i];
                    var _item_n = slot_n[i];
                   
                    //si ambos items son iguales
                    if slot[i] == mouse {
                        slot_n[i] += mouse_n;
                        mouse = 0;
                        mouse_n = 0;
                    }
                    //si los items son diferentes
                    else{
                        slot[i] = mouse;
                        slot_n[i] = mouse_n;
                        mouse = _item;
                        mouse_n = _item_n;
                    }
                }
            }
            color = c_yellow;
        } else {
            color = c_white;
        }
       
        //fondo
        draw_sprite_ext(spr_borde, 1, sx, sy, 1, 1, 0, color, 1);
       
        //borde
        draw_sprite_ext(spr_borde, 0, sx, sy, 1, 1, 0, c_white, 1);
       
        //item
        if slot[i] != 0 {
            draw_sprite(spr_items, slot[i], sx, sy);
           
            //Dibuja la cantidad de items si es mayor que 1
            if slot_n[i]>1 {
                draw_set_color(c_black);
                draw_text_transformed(sx+12, sy+12, "x"+string(slot_n[i]), 0.25, 0.25, 0);
                draw_set_color(c_white);
            }
        }
       
        //aumentar coordenadas
        k++;
        if frac(i/4) = 0 {
            h += 1;
            k = 0;
        }
    }
}

//Dibujar item del mouse
if mouse != 0 {
    //Dibujar item
    draw_sprite(spr_items, mouse, mouse_x-8, mouse_y-8);
    //dibuja la cantidad de items si es mayor que 1
    if mouse_n > 1{
        draw_set_color(c_black);
        draw_text_transformed(mouse_x+4, mouse_y+4, "x"+string(mouse_n), 0.25, 0.25, 0);
        draw_set_color(c_white);
    }
   
    //Soltar item
    if mouse_check_button_pressed(mb_right) {
        with(instance_create_depth(obj_player.x-8, obj_player.y-8, 0, obj_item)){
            item = other.mouse;
        }
        mouse_n--;
        if mouse_n == 0 mouse = 0;
    }
}

Y tengo este script para agregar
function scr_agregar(){
   
    var _item = argument0;
    var _number = argument1;
   
    with obj_inventario {
        //Busca si el ítem ya existe en el inventario y es apilable
        for ( i = 1; i <= slotT; i++;) {
            if scr_stackable(i, _item){
                slot[i] = _item;
                slot_n[i] += _number;
                return(1);
            }
        }
        //Busca si hay un espacio vacio para poner el item
        for ( i = 1; i <= slotT; i++;) {
            if slot[i] = 0 {
                slot[i] = _item;
                slot_n[i] = _number;
                return(1);
            }
        }
        return(0);
    }
}

 


Desconectado Void

Respuesta #3 en: Junio 26, 2021, 07:43:25 am
Veamos, primero necesitamos "ver" sobre que esta el mouse, afortunadamente tu código ya tiene una parte que hace eso, la sección interaccion de tu código en el Draw del objeto obj_inventario, en esa parte vamos a agregar un if para determinar si el slot sobre el que esta el mouse esta vacio:

if slot[i] != 0 {
    //Acá el resto del código
    }

Vamos a necesitar dos nuevas funciones, una para adquirir el nombre del item, otra para adquirir su descripcion, las llamaremos apropiadamente scr_get_item_name y scr_get_item_description, y lo que harán es simple, se les pasa el número de item y las funciones devuelven una string dependiendo de dicho valor:

function scr_get_item_name(item){
   
    switch(item){
        case(1): return "Poción de Salud";
        case(2): return "Poción de Maná";
        case(3): return "Espada de Hierro";
        case(4): return "Pico de Hierro";
    }

}

function scr_get_item_description(item){
   
    switch(item){
        case(1): return "Brebaje que sana la salud de quien lo bebá";
        case(2): return "Brebaje que recupera la energía mágica de quien lo bebá";
        case(3): return "Espada común hecha de hierro";
        case(4): return "Pico común hecho de hierro";
    }

}

La string se puede cambiar por lo que tu quieras, y para agregar nuevos items se debe seguir el patrón que ves en la función, por ejemplo "case(5): return "Manzana";".

Por cierto, necesitarás agregar una nueva fuente para poder dibujar acentos, la fuente que usa el GM por defecto no los tiene, simplemente crea una fuente nueva, abajo veras una opción llamada "Add" (si estas usando la IDE en inglés), le daz click allí, seleccionas "ASCII" y "Add Range" y listo.

Volviendo al tema, ahora que tienes las funciones que regresan el texto a dibujar, ahora solo es cuestión de dibujarlo. Empezamos por cambiar la fuente a la que acabamos de crear con la función draw_set_font, adquirimos el nombre del item y la descripción y calculamos la altura de estas strings usando string_height y string_height_ext:

if slot[i] != 0 {
    draw_set_font(Font1)
    var _name = scr_get_item_name(slot[i]),
        _description = scr_get_item_description(slot[i]),
        _height = (string_height(_name)+string_height_ext(_description,-1,200))*0.25+6;
       
    //Acá el resto del código
}

Usamos string_height_ext porque esa función calcula la altura de strings que han sido divididas en varios reglones debido a su largo, en este caso la división ocurre cuando la string supera 200 pixeles de largo. También notaras que estamos multiplicando por 0.25 y sumando 6, 0.25 es la escala a la que dibujaremos las strings, y el 6 es simplemente un poco de espacio extra.

Ahora que tenemos todas las variables necesarias podemos finalmente dibujar, empezamos por dibujar el cuadro donde aparece el texto:

draw_set_color(c_white)
draw_rectangle(vx+80,vy+2,vx+150,vy+_height,0)
draw_set_colour(c_black)
draw_rectangle(vx+80,vy+2,vx+150,vy+_height,1)

Esta parte es simple, se dibujan dos rectángulos, primero uno blanco relleno, luego otro negro sin rellenar, es decir solo la silueta. Notarás que usamos la variable _height donde guardamos la altura de las strings a dibujar, esto hará que el tamaño final del cuadro cambie según el tamaño de las strings, el resto de los valores se consiguieron con un poco de prueba y error, se podrían conseguir matemáticamente pero mejor no complicarnos por el momento.

Ahora que tenemos el cuadro solo falta dibujar el texto, usamos draw_text_transformed que permite cambiar la escala del texto, que para este caso sera 0.25, primero ponemos el nombre del item y luego la descripción, para la descripcion usamos draw_text_ext_transformed que tambíen nos permitira separar la string a un nuevo reglon si supera un largo especifico, en este caso 200 pixeles:

draw_text_transformed(vx+90,vy+4,_name,0.25,0.25,0)
draw_text_ext_transformed(vx+90,vy+10,_description,-1,200,0.25,0.25,0)

Y eso es todo, todo junto queda así:

if slot[i] != 0 {
    draw_set_font(Font1)
    var _name = scr_get_item_name(slot[i]),
        _description = scr_get_item_description(slot[i]),
        _height = (string_height(_name)+string_height_ext(_description,-1,200))*0.25+6;

    draw_set_color(c_white)
    draw_rectangle(vx+80,vy+2,vx+150,vy+_height,0)
    draw_set_colour(c_black)
    draw_rectangle(vx+80,vy+2,vx+150,vy+_height,1)
    draw_text_transformed(vx+90,vy+4,_name,0.25,0.25,0)
    draw_text_ext_transformed(vx+90,vy+10,_description,-1,200,0.25,0.25,0)
}


Como nota final, muchos de los valores estaticos que vez en el código se consiguieron a punta de prueba y error hasta que se consiguio una apariencia aceptable, así que si prefieres otra apariencia puedes ponerte a probar cambiandolos hasta que este a tu preferencia.

Dejo el editable del otro tema con los cambios de este:

 
Los siguientes usuarios dieron las gracias a este tema: Bangaran


Desconectado Bangaran

  • Habitual
  • *
  • Puntos: 48
  • Mensajes: 25
  • Sexo: Masculino
    • Ver Perfil
Respuesta #4 en: Junio 27, 2021, 06:18:36 pm
Muchas gracias amigo void

me has sido como siempre de mucha ayuda