Noticias

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

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

Mensajes recientes

1
Preguntas y respuestas / Re: Inventario Items Apilables
« Último mensaje por Void en Ayer a las 11:03:59 pm »
Ok, primero creamos nuevas variables para mantener la cantidad de objetos por casilla:

///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

Como puedes ver tenemos dos variables nuevas, un nuevo array llamado slot_n, que contendrá la cantidad de objetos que las casillas del inventario tienen, y una variable llamada mouse_n que contendrá la cantidad de objetos que el mouse tiene.

Ahora cambiamos la función scr_agregar, en la función original se buscaba en las casillas del inventario hasta encontrar un espacio vacío y se ponía ahí el ítem. Con los cambios que le hacemos:

function scr_agregar(){
    //scsr_agregar(item)
   
    var _item = argument0;
   
    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]++
                return(1);
            }
        }//Busca si hay un espacio vació para poner el ítem
        for ( i = 1; i <= slotT; i++;) {
            if slot[i] = 0{
                slot[i] = _item;
                slot_n[i] = 1
                return(1);
            }
        }
        return(0);
    }
}

Ahora hace dos búsquedas, una para ver si el ítem ya existe dentro del inventario y es apilable, y si esa falla entonces una para buscar un espacio vacío donde poner el objeto. Nota como cuando el ítem ya existe dentro del inventario le sumamos 1 a slot_n en lugar de ponerle un valor predeterminado.

También notaras que llamamos una función nueva, scr_stackable, esta es la función que determinara que ítems se pueden apilar:

function scr_stackable(i,item){
    //Busca si el item es uno de los apilables
    if item == 1 || item == 2 {
        //Busca si la casilla actual tiene el mismo tipo de ítem
        if slot[i] == item{
            return 1;
        }
        else return 0;
    }
    else return 0;
}

Ahora hay que cambiar las interacciones con el mouse, con un par de excepciones esta parte es simple, simplemente hay que asegurarse de que los valores de las variables que contienen la cantidad de ítems en la casilla también se cambien.

//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_colour(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_colour(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;
    }
}

Podrás notar que por ejemplo, en mouse vacio y slot lleno también movemos el valor de slot_n a mouse_n, para así asegurarnos de que la cantidad de objetos que había en ese slot sea la misma que cuando esta en el mouse, igualmente en cada interacción con el mouse deben tenerse en cuenta esas variables.

Las excepciones que mencione son en mouse lleno y slot lleno, donde agregamos una condición para que combine la cantidad de ítems si el ítem en la casilla y el que esta en el mouse son del mismo tipo, de lo contrario hace su comportamiento normal de cambiar ítems.

La otra excepción es en soltar ítem, ya que ahora es posible tener más de un ítem en el mouse se agrego un código para que suelte los ítems de uno en uno. Cada vez que suelta un ítem mouse_n se reduce en 1 y cuando llega a 0 es cuando se limpia el ítem del mouse.

También se agrego un dibujo de texto para mostrar la cantidad de ítems en una casilla si dicha cantidad es mayor a uno.

Dejo el editable para que veas los cambios.
2
Preguntas y respuestas / Re: coordenadas normales a isométricas
« Último mensaje por cristopher2545 en Ayer a las 10:31:04 pm »
Los scripts get_ortho_* no estan regresando nada, tenias que agregar un return para px y py respectivamente.

Dejo el editable arreglado.


maestro!, muchas gracias compañero me sacaste de este apuro!,  te lo agradezco muchísimo!
3
Preguntas y respuestas / Re: coordenadas normales a isométricas
« Último mensaje por Void en Ayer a las 10:18:57 pm »
Los scripts get_ortho_* no estan regresando nada, tenias que agregar un return para px y py respectivamente.

Dejo el editable arreglado.
4
Preguntas y respuestas / Re: coordenadas normales a isométricas
« Último mensaje por cristopher2545 en Ayer a las 10:09:37 pm »
hola! gracias por responder!, añadí los códigos para probarlo y algo super extraño ocurrió, no funcionaba para nada, cambie las variables "iso_mouse_x" por "mouse_x" y empezo a funcionar parcialmente, el cursor se ve no centrado es decir que aunque no este sobre las tiles este funciona y es extraño trate de modificar variables y distancias pero nada, al menos ahora funciona parcialmente y eso esta genial!

te dejo el proyecto para que veas a lo que me refiero! y de nuevo gracias!
5
Preguntas y respuestas / Re: coordenadas normales a isométricas
« Último mensaje por Void en Ayer a las 08:20:43 pm »
No necesitas cambiar de coordenadas cartesianas a isometricas, eso ya lo estas haciendo con el código que pusiste, necesitas cambiar las coordenadas del mouse de isometricas a cartesianas y realizar las comprobaciones con esas nuevas coordenadas.

Puedes cambiar de coordenadas isometricas a cartesianas con este código:

var xx,yy,px,py;
xx=(argument0 - room_width/2)/global.width_iso
yy=(argument1 - room_height/2)/global.height_iso

px=(yy+xx)*2*(global.width_ortho/2) + room_width/2
py=(yy-xx)*2*(global.height_ortho/2) + room_height/2


Lo pones en un par de scripts, uno para x y otro para y, y cuando quieres usar el mouse para interactuar conviertes sus coordenadas y usas los nuevos valores en lugar de las coordenadas normales, por ejemplo, en el projecto que dejaste se puede poner en el draw de los tiles:

var isox= get_iso_x(x,y)
var isoy= get_iso_y(x,y)

var iso_mouse_x = get_ortho_x(mouse_x,mouse_y)
var iso_mouse_y = get_ortho_y(mouse_x,mouse_y)

if collision_point(iso_mouse_x,iso_mouse_y,self,1,0)
    draw_sprite_ext(spr_iso_tile,0,isox,isoy,1,1,0,c_red,1)
else
    draw_sprite(spr_iso_tile,0,isox,isoy)

Eso hará que el tile sobre el que este el mouse cambia a color rojo.
6
Preguntas y respuestas / Re: camara estilo mario bros
« Último mensaje por somnus en Ayer a las 09:46:36 am »
1.- pues basicamente crear una variable en tu objeto donde manejas la view,
2.- esta variable va a guardar el valor de la view en la coordenada X cuando vayas avanzando,
3.- asi mismo en el evento STEP cuando la view se va a regresar, checas si la view en la coordenada X es menor al valor de tu variable, si lo es, entonces
view_xview[0] = TU_VARIABLE, de esta manera la "camara" siempre se quedara en ese valor de tu variable y no podra ser menor ( osea una vez avanzada la view no se podra regresar )

espero haberte dado la idea. ya como tu lo hagas depende de ti
7
Preguntas y respuestas / Inventario Items Apilables
« Último mensaje por Bangaran en Junio 13, 2021, 06:31:08 pm »
Hola amigos

tengo un inventario echo por un tutorial de youtube que pertenece a Woynert:

-Se puede abrir y cerrar el inventario
-Se pueden agregar los items
-Se pueden intercambiar los items
-Se pueden sacar los items del inventario

Pero quisiera que algunos items como por ejemplo las pociones se apilen
pero las espadas o las hachas no se apilen
los items en el create code de la room tiene su ID

no se si alguno me puede ayudar con eso
dejare el codigo

dejo el exportable por si acaso lo necesitan

sirve para GSM1 y para GSM2


ObjInventario

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
}

//variables del mouse
mouse = 0;

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];
                    slot[i] = 0;
                }
                //mouse lleno y slot vacio
                else if mouse != 0 and slot[i] = 0 {
                    slot[i] = mouse;
                    mouse = 0;
                }
                //mouse lleno y slot lleno
                else if mouse != 0 and slot[i] != 0 {
                    //variable de respaldo
                    var _item = slot[i];
                   
                    slot[i] = mouse;
                    mouse = _item;
                }
            }
            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);
        }
       
        //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);
   
    //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 = 0;
    }
}

KEY-PRESS-E
//Abrir y Cerrar

if open {
    open = false;
} else {
    open = true;
}


ObjItem

DRAW
//Dibuja inventario

image_index = item;
draw_self();

LEFT PRESSED
//Agarra item

if scr_agregar(item) {
    instance_destroy();
}

SCRIPTS
    var _item = argument0;
   
    with obj_inventario {
        for ( i = 1; i <= slotT; i++;) {
            if slot[i] = 0 {
                slot[i] = _item;
                return(1);
                exit;
            }
        }
        return(0);
    }


Aca esta el link del video
8
Preguntas y respuestas / coordenadas normales a isométricas [solucionado]
« Último mensaje por cristopher2545 en Junio 13, 2021, 06:28:43 am »
hola a todos! estoy creando un juego estilo restauran city con vista isométrica, y todo iba bastante bien hasta que me tope con una pared la cual no puedo cruzar por mi propia cuenta espero ustedes puedan darme una mano!


estoy proyectando los sprites "normales" para que se vean como isométricos usando el código a continuación, y todo perfecto pero cuando quiero interactuar con los objetos estos usan las coordenadas de los sprites "normales" en vez de las nuevas coordenadas isométricas por ende no esta funcionando como debería, entiendo que debo usar una formula para convertir las coordenadas cartesianas en coordenadas isométricas pero honestamente no logro entenderlo.

aquí esta el código para proyectar


variables del objeto control muestra los tamaños de los sprites normales y los isometricos
global.isoview=false

global.width_ortho=32
global.height_ortho=32
global.width_iso=78
global.height_iso=40


si aprietas espacio la vista cambia a isométrico y se ejecuta este código que esta dentro del objeto "vista cartesiana"

if global.isoview=true
{
var isox,isoy;
isox=get_iso_x(x,y)
isoy=get_iso_y(x,y)

draw_sprite(s_iso_tile,0,isox,isoy)


los scrips "get_iso_x" y "get_iso_y" contienen lo siguiente respectivamente

var xx,yy,px,py;
xx=(x - room_width/2)/global.width_ortho
yy=(y - room_height/2)/global.height_ortho

px=(xx-yy)*(global.width_iso/2) + room_width/2
py=(yy+xx)*(global.height_iso/2) + room_height/2

return px


var xx,yy,px,py;
xx=(x - room_width/2)/global.width_ortho
yy=(y - room_height/2)/global.height_ortho

px=(xx-yy)*(global.width_iso/2) + room_width/2
py=(yy+xx)*(global.height_iso/2) + room_height/2

return py

usando ese codigo proyectas la vista y creas la ilusión de que es isométrico pero las coordenadas del mouse siguen estando igual, alguna idea de como arreglarlo?, adjunto el proyecto por si es mas sencillo verlo , estando abierto el juego aprieta la tecla arriba para cambiar al modo isométrico de antemano gracias!
9
Juegos completos / Re: Golden Axe One
« Último mensaje por Jachuferas en Junio 10, 2021, 10:30:33 pm »
Juegazo de mi época!! Te ha quedado genial. Un poco complicado para Android o que yo estaba acostumbrado a jugarlo en las recreativas  XD XD
10
Juegos completos / Re: Falcon Heavy - Mi primer juego
« Último mensaje por Jachuferas en Junio 10, 2021, 09:58:39 pm »
Muchas gracias!! Como bien dices faltan partículas (aún no me he metido de lleno con ellas) pero iré corrigiendo los fallos que vea y mejorando, dentro de mis posibilidades, lo que ya está hecho. Muchas gracias por tu aporte!! Se agradece un montón!! Saludos!!!