Skocz do zawartości

Inventory


Rekomendowane odpowiedzi

Miałem już nie pisać, ale ta usterka niszczy mi grę.

 

Otóż, używam tego cholernego silnika inventory. Nie dość że ciężki to ogarnięcia, to jeszcze zbugowany. Na czym polega problem? Otóż na tym, że jak podnoszę przedmiot, dajmy na to "kanister" to jest okej, ale gdy podnoszę drugi przedmiot, nagle kanister znika z inwentarza i zastępuje go kabel, po kanistrze nie ma śladu, a jest potrzebny, aby móc przejść przez część etapu, podobnie sprawa się ma z innymi przedmiotami, czasem działa, czasem nie, co więcej, zdarza się, że przedmiot pozostaje w plecaku, nawet po użyciu go na obiekcie, nie mam pojęcia o co chodzi, do cholery, przykład jest pokręcony, a niestety innego takiego znaleźć nie mogę. Co może być nie tak ? Gdzie leży błąd ?

 

Przykład był nieco modyfikowany, między innymi draw był zmieniany tak, aby podążało za graczem, poza tym inna modyfikacja, aby działał tak samo przy zmianie rooma, czyli ma persistent, dodam, że przedmioty znikają na ogół z pierwszego pola.

Odnośnik do komentarza
Udostępnij na innych stronach

a nie lepiej po prostu tworzyć listę która będzie przechowywała przedmioty. Poczytaj o ds_list, na pewno wpadniesz na to jak to wykorzystać w gruncie rzeczy nie jest ciężkie coś takiego napisać.

 

A tak właściwie to w jakiej wersji robisz swoją grę. Bo jak w studio to tam wiele rzeczy zostało pozmienianych i niektóre przykłady mogą po prostu nie działać poprawnie.

Odnośnik do komentarza
Udostępnij na innych stronach

To musiałeś coś źle przekopiować z tego przykładu bo przykład działa dobrze może źle przypisujesz zmienne. Nie wiem co może być innego źle w tym przykładzie, albo po prostu źle zrozumiałeś jego działanie. Ja bym zrobił w każdym razie takie iventory na listach. (w sumie to jedna wystarczy) ;P

Odnośnik do komentarza
Udostępnij na innych stronach

Tutaj kilka przykładowych zmiennych, zacznę od Inventory:

 

Skrypt Inventory_Add:

GML
//argument0=The inventory sprite's subimage to show for this object.

////////////////////////////////////////////////////////////////////////////////////////

//This is the code responsible for adding objects to the inventory. It does this //

//through a repeating sequence of checking the inventory for an empty slot. If it //

//finds an empty slot, it will add the object that the script is called from. If it //

//does not find an empty one, it will move to the next slot. //

////////////////////////////////////////////////////////////////////////////////////////

var Fin,Current;//Temporarily declare variables.

Fin = 0;//This is used to exit the check loop.

Current = 1;//This keeps track of which slot is being checked.

//

//Start looping. It will loop through all the slots until it has found an empty slot or gone over the maximum.

//

do

{

//

//Check if the current slot is empty, and if so, add the object.

//

if(Inventory.SlotNumberItm[Current] = 0)

{

Inventory.SlotNumberItm[Current] = argument1;//object_index;//Set the item.

Inventory.SlotNumberImg[Current] = argument0;//Set the image.

Inventory.SlotNumberTitle[Current] = argument2;

Inventory.draw = false;

if argument3

instance_destroy();//Destroy the instance that it just added.

Fin = 1;//Exit the check.

}

 

//

//If it has not found an empty slot, move to the next one.

//

else

{

Current += 1;

}

 

//

//Finally, check if it has checked all the slots, and if so, exit the loop.

//

if(Current > Inventory.Slots)

{

Fin = 1;

}

 

}

until(Fin = 1)

 

Skrypt Inventory_Clear:

 

GML
var Current;

Current=1;

repeat(Slots) //Do this enough to empty all the slots

{

SlotNumberImg[Current]=0; //This sets the sprite to empty.

SlotNumberItm[Current]=0; //This sets that inventory slot to 0, empty.

SlotNumberTitle[Current]='';

Current+=1

}

 

 

Inventory_Var

 

GML
global.fajki = false;

global.wiadro = false;

global.rozpuch=false

global.kablwz=false

 

Pozostałe skrypty są nienaruszone. Teraz odnośnie przedmiotu, który zazwyczaj znika:

 

 

Create przedmiotu niepodniesionego

GML
if(global.rozpuch)=true{

instance_destroy()

}

 

Kolizja z graczem:

 

GML
if keyboard_check(vk_space){

global.rozpuch=true

sound_play(sound5)

instance_destroy()

script_execute(Inventory_Add,6,obj_rozpuch2,"Rozpuch",false)

}

 

 

 

Teraz obiekt, który znajduje się już w plecaku:

 

Create:

 

Klocek Script_Execute(init_drag,6,0,0,0,0_)

 

GML
title = '';

 

Step:

 

Script Execute (step_drag,0,0,0,0,0)

 

End Step:

Script Execute (end_step_drag,0,0,0,0,0)

 

Glob Left Pressed:

 

GML
if drop_drag(obj_tomek)

{

 

global.tomekmur=true;

script_execute(Inventory_Add,5,obj_kastet,"Kastet",true)

with obj_mur instance_change(obj_mur2,true);

global.kastet=true

 

 

 

 

add_text('Rozmowa blabla')

 

}

else

Inventory_Add(image_index,object_index,title,true);

 

 

 

 

I niektóre przedmioty zachowują się podobnie, może coś źle se skryptami poszło?

 

Jeszcze dam kod objektu Inventory:

 

 

CREATE

GML
Slots=36;

XMax=10;

XStart=0;

YStart=room_height;

XXStart=XStart;

YYStart=YStart;

XX=5;

YY=5;

yyy = 160;

xxx = 140;

color = draw_get_color();

current_title = 'Nic';

 

draw = false;

global.mouse_drag = false;

SlotNumberImg[Slots]=0//This is the array used to store the data of what is in the slot.

SlotNumberItm[Slots]=0//This is the array used to tell it what image to show.

SlotNumberTitle[Slots]='';

 

var Current;

Current=1;

repeat(Slots) //Do this enough to empty all the slots

{

SlotNumberImg[Current]=0; //This sets the sprite to empty.

SlotNumberItm[Current]=0; //This sets that inventory slot to 0, empty.

SlotNumberTitle[Current]='';

Current+=1

}

 

 

Script Execute Inventory_Var,0,0,0,0,0

 

STEP

GML
////////////////////////////////////////////////////////////////////////////////////////

//This is the code responsible for dropping objects from the inventory when the player//

//clicks on something. It does this through a repeating sequence of checking the mouse//

//position compared to the current slot. If it finds the mouse, it will drop whatever //

//is in that slot. If it does not find it, it will move to the next slot. //

////////////////////////////////////////////////////////////////////////////////////////

if no_text(){

if keyboard_check_pressed(vk_shift)

{

draw = not draw;

}

 

//

//Only perform the inventory drop object check if the player clicked.

//

if (global.mouse_drag == false)

{

if(mouse_check_button_pressed(mb_left))

{

var Fin,Current,X,Y,XCount;//Temporarily declare variables

Fin = 0;//This is used to exit the check loop.

Current = 1;//This keeps track of which slot is being checked.

X = XStart+vx

Y = YStart+vy//This is used to check where the mouse is. Note it is Y not y.

XCount = 1;//This keeps track of how many slots it has drawn in the current row.

//

//Start looping. It will loop through all the slots until it has found the mouse or gone over the maximum.

//

do

{

 

//

//Check if the current slot is the one the player clicked on.

//

if(mouse_x >= X and mouse_x <= X + sprite_width and mouse_y >= Y and mouse_y <= Y + sprite_height)

{

//

//Then check if there is an object in it, and if so, create it and clear it from the inventory.

//

if(SlotNumberItm[Current] != 0)

{

instance_create(mouse_x,mouse_y,SlotNumberItm[Current]);//Create

//SlotNumberItm[Current].object = SlotNumberItm[Current];

SlotNumberItm[Current].title = SlotNumberTitle[Current];

SlotNumberItm[Current] = 0;//Empty the slot

SlotNumberImg[Current] = 0;//Empty the sprite

SlotNumberTitle[Current] = '';

draw = false;

}

Fin = 1;//Since it has found the mouse, exit he loop.

}

 

//

//If it has not found the slot the player has clicked on, move to the next one.

//

else

{

Current += 1;//Add one to the counter.

XCount += 1;//Add one to the horizontal counter.

X += sprite_width+XX;//Move the check area to the next slot.

//

//Also, check if it has exceeded the maximum slots for the row, and if so, move to the next one.

//

if(XCount > XMax)

{

Y += sprite_height+YY;//Move the check area to the next row.

X = XStart+vx;//Move the check area to the first column.

XCount = 1;//Reset the horizontal counter.

}

}

 

//

//Finally, check if it has checked all the slots, and if so, exit the loop.

//

if(Current>Slots)

{

Fin = 1;

}

}

until(Fin = 1)

}

 

var Fin,Current,X,Y,XCount;//Temporarily declare variables

Fin = 0;//This is used to exit the check loop.

Current = 1;//This keeps track of which slot is being checked.

X = XStart+vx

Y = YStart+vy//This is used to check where the mouse is. Note it is Y not y.

XCount = 1;//This keeps track of how many slots it has drawn in the current row.

//

//Start looping. It will loop through all the slots until it has found the mouse or gone over the maximum.

//

do

{

 

//

//Check if the current slot is the one the player clicked on.

//

if(mouse_x >= X and mouse_x <= X + sprite_width and mouse_y >= Y and mouse_y <= Y + sprite_height)

{

//

//Then check if there is an object in it, and if so, create it and clear it from the inventory.

//

if(SlotNumberItm[Current] != 0)

{

current_title = SlotNumberTitle[Current];

}

Fin = 1;//Since it has found the mouse, exit he loop.

}

 

//

//If it has not found the slot the player has clicked on, move to the next one.

//

else

{

Current += 1;//Add one to the counter.

XCount += 1;//Add one to the horizontal counter.

X += sprite_width+XX;//Move the check area to the next slot.

//

//Also, check if it has exceeded the maximum slots for the row, and if so, move to the next one.

//

if(XCount > XMax)

{

Y += sprite_height+YY;//Move the check area to the next row.

X = XStart+vx;//Move the check area to the first column.

XCount = 1;//Reset the horizontal counter.

}

}

 

//

//Finally, check if it has checked all the slots, and if so, exit the loop.

//

if(Current>Slots)

{

Fin = 1;

}

}

until(Fin = 1)

 

 

}}

 

Glob left pressed:

 

GML
if no_text(){ draw = false}

 

DRAW:

 

GML
if no_text(){

vx = view_xview;

vy = view_yview;

X = XStart+vx

Y = YStart+vy //This is used to move the Y postion to the next line.

XCount=1 //Used to count the horizontal slots.

Current=1//This is used to track what slot it is checking.

 

if draw

{

YStart = yyy;

XStart = xxx;

 

color = draw_get_color();

draw_rectangle(xxx-16+vx,yyy-36+vy,xxx+378+vx,yyy+174+vy,true);

draw_set_color(c_black);

draw_set_alpha(0.4);

draw_rectangle(xxx+vx-15,yyy+vy-35,xxx+vx+378,yyy+vy+174,false);

draw_set_alpha(1);

draw_set_color(c_white);

draw_set_font(inventory_font);

draw_text(xxx+vx,yyy+vy-26,'Plecak - '+current_title);

draw_set_color(color);

 

repeat(Slots)//Repeats the drawing process until all the slots have been drawn.

{//Starting repeat block

//Draws the sprite 'Inventory' with the subimage of the current slot

draw_sprite(spr_Inventory,SlotNumberImg[Current],X,Y)

X+=sprite_width+XX; //Move to the next slot.

Current+=1; //Add one to the overall slot counter

XCount+=1; //Add one to the horizontal slots counter

if(XCount>XMax) //If enough horizontal slots have been drawn...

{

Y+=sprite_height+YY;//...move to the next line...

X=XStart+vx; //...set the X postion back to the left

XCount=1; //...and set the horizontal counter back to 0.

}

 

}//Ending repeat block

}

else

{

current_title = 'Nic';

XStart = XXStart;

YStart = YYStart;

}}

 

 

 

Niestety, niezbyt rozumiem zasadę działania owego przykładu.

Odnośnik do komentarza
Udostępnij na innych stronach

A jeżeli przedmioty mają jakieś dodatkowe dane, np. ilość przedmiotu, cena, poziom uszkodzenia? Trzeba będzie robić więcej list, a najlepiej siatkę do inventory.

Noo tak tylko że to jest przygodówka w grach tego typu rzeczy raczej nie mają parametrów co najwyżej opis który też można dodać inaczej bo do listy można dopisywać tylko id przedmiotu. Poza tym lista to nic innego jak dynamicznie alokowana tablica z reszto w GM wszystkie tablice takie są, bo nigdzie nie deklarujesz ich rozmiaru.

 

E. mógłbyś dać kod na to co dzieję się po wciśnięciu LPM na obiekcie. Ew. skrytpy end_step_drag, bądź step_drag mogę się mylić ale wydaje mi się że gdzieś w nich przypisuje się obiekt do SlotNumberItem[0] zamiast do SlotNumberItem[jakaś_zmienna]

Odnośnik do komentarza
Udostępnij na innych stronach

Sorki za doublepost.

 

Więc daję te kody:

Skrypt End_step_drag:

GML
if global.mouse_drag=false then

{

direction=point_direction(xprevious,yprevious,x,y);

speed=point_distance(xprevious,yprevious,x,y)/2;

}

if speed>25 then

{

speed=25;

}

 

Step_Drag

 

GML
if global.mouse_drag=true then

{

x=mouse_x-xpart;

y=mouse_y-ypart;

friction=0;

}

else

{

friction=0.5;

}

 

I teraz kolizja z przedmiotem, który zostaje podniesiony:

 

GML
if keyboard_check(vk_space){

global.rozpuch=true

sound_play(sound5)

instance_destroy()

script_execute(Inventory_Add,6,obj_rozpuch2,"Rozpuch",true)

}

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...