2D-массив неправильно обращается к globalvar (GameMaker)

У меня есть магазин, который я пытаюсь настроить, который по всем учетным записям внутри отладчика срабатывает, но абсолютно ничего не делает.

Это установка, которая у меня есть:

o_Shop - Игрок взаимодействует, чтобы создать слой внутри room0

o_Shop_setup - Создание массива, создание события:

global.inventory[1, 1] = "Mines";               //Item Name
global.inventory[1, 2] = sp_Blue_mine_UI;       //Item Sprite
global.inventory[1, 3] = 50;                    //Cost
global.inventory[1, 4] = MINE_NUMBER;           //Current Inventory
global.inventory[1, 5] = MINE_NUMBER_MAXIMUM;   //Maximum amount

//HE Ammo
global.inventory[2, 1] = "HE Ammo";             //Item Name
global.inventory[2, 2] = sp_ammoHE;             //Item Sprite
global.inventory[2, 3] = 5;                     //Cost
global.inventory[2, 4] = AMMO_AMOUNT;           //Current Inventory
global.inventory[2, 5] = AMMO_AMOUNT_MAXIMUM;   //Maximum amount

Затем я использую следующие объекты, которые обращаются к этому массиву:

o_item_parent — Родитель o_shop_Mines/o_shop_AmmoHE — Внутри события розыгрыша o_item_parent:

draw_set_font(fnt_small);
draw_set_halign(fa_center);
draw_set_valign(fa_middle);
draw_set_color(c_white);
draw_text(x, y - 100, global.inventory[myid, 1]);
draw_sprite(global.inventory[myid, 2], 0, x, y - 30);
draw_set_color(c_yellow);
draw_text(x, y + 32, string(global.inventory[myid, 3]) + " Coins");
draw_set_color(c_white);
draw_text(x, y + 64, string(global.inventory[myid, 4]) + " / " + string(global.inventory[myid, 5]));

o_shop_Mines — наследует событие розыгрыша без изменений.

o_shop_Mines Создать событие:

myid = 1;

o_shop_AmmoHE — наследует событие розыгрыша без изменений. o_shop_AmmoHe Создать событие:

 myid = 2;

o_buy_parent — Родитель o_buy_Mines/o_buy_ammoHE o_buy_parent — Создать событие:

image_speed = 0;
image_index = 0;

o_buy_parent Шаговое событие:

if (COINS >= global.inventory[myid, 3])
{
    image_index = 0;    
}
else
{
    image_index = 1;    
}

if (global.inventory[myid, 4] == global.inventory[myid, 5])
{
    image_index = 1;    
}

o_buy_parent Событие левого нажатия:

if (global.inventory[myid, 4] == global.inventory[myid, 5])
{
    audio_play_sound(snd_gunReload, 1, false);
}
else if (COINS < global.inventory[myid, 3])
{
    audio_play_sound(snd_game_over, 1, false);  
}
else
{
    //audio play sound snd_purchase_complete
    COINS -= global.inventory[myid, 3];
    global.inventory[myid,4]++;
}

o_buy_Mines — Наследует шаговое событие/событие левого нажатия от o_buy_parent

Внутри o_buy_Mines Создать событие:

myid = 1;
event_inherited();

o_buy_ammoHE — Наследует шаговое событие/событие левого нажатия от o_buy_parent

Внутри o_buy_ammoHE Создать событие:

myid = 2;
event_inherited();

Внутри o_buy_ammoHE Создать событие:

myid = 2;
event_inherited();

Внутри события o_buy_ammoHE левого нажатия:

if (global.inventory[myid, 4] == global.inventory[myid, 5])
{
    audio_play_sound(snd_gunReload, 1, false);
}
else if (COINS < global.inventory[myid, 3])
{
    audio_play_sound(snd_game_over, 1, false);  
}
else
{
    //audio play sound snd_purchase_complete
    COINS -= global.inventory[myid, 3];
    global.inventory[myid,4]++; //breakpoint triggers fine, does nothing.
    //Have also tried the below line, doesn't work, but commented out    currently:
    //AMMO_AMOUNT += 5;
}

Все переменные, написанные ЗАГЛАВНЫМИ БУКВАМИ, являются глобальными переменными, созданными с использованием метода globalvar внутри o_init o_initis inside of room ->rm_LoadingScreen`

rm_LoadingScreen не делает ничего, кроме удержания этого объекта, который не является постоянным, этот объект содержит оператор переключения, который может изменить STATE = GameState (перечисление)

`STATE = GameState.menu` is called by default which calls
scr_menuLoader();
break;

Все работает, кроме магазина. Это действительно работало вчера, но я не могу отследить, что я сломал. В настоящее время код увеличивает число, которое отображается на экране с помощью

draw_text(x, y + 64, string(global.inventory[myid, 4]) + " / " + string    (global.inventory[myid, 5]));

но глобальная переменная AMMO_AMOUNT не меняется. Отладчик показывает, что он никогда не меняется.

Может ли кто-нибудь предоставить некоторую обратную связь или второй набор глаз? Я смотрел на это в течение нескольких часов, и я просто не вижу проблемы.


person Shamus Locke    schedule 01.11.2018    source источник


Ответы (1)


Использование, которое вы делаете для AMMO_AMOUNT и других имен с заглавными буквами, эквивалентно константе, используемой в качестве начального значения. Во всяком случае, кажется, что значение в global.inventory[myid,4] уже увеличилось. Поэтому, если вы хотите изменить значение AMMO_AMOUNT, вы должны сделать это явно, как в строке с комментариями: //AMMO_AMOUNT += 5; Надеюсь, вы не прокомментировали это по ошибке XD

В итоге ваш код должен выглядеть так: Внутри события o_buy_ammoHE Left Pressed, последний блок else:

else
{
    //audio play sound snd_purchase_complete
    COINS -= global.inventory[myid, 3];
    global.inventory[myid,4]++; 
    AMMO_AMOUNT = global.inventory[myid,4];
}

если это не поможет, я бы подумал, что все работает как положено, и вам просто нужно использовать global.inventory[myid, 4]) там, где это необходимо.

person Juanpa    schedule 12.04.2019