0

我正在创建一个改变主角精灵的角色选择。

为此,我有一个箭头对象,用户单击它可以更改主角的精灵。

global.Mario = true;
global.PrincessPeach = false;
global.Luigi = false;
global.Bowser = false;

if (mouse_check_button_pressed(mb_left)) {
    if (global.Mario = true) {
        Mario = false;
        PrincessPeach= true;
    }

    if (global.PrincessPeach= true) {
        PrincessPeach = true;
        Mario = false;
    }

    if (global.Luigi = true) {
        Luigi = false;
        Bowser = true;
    }

    if (global.Bowser = true) {
        Bowser = false;
        Mario = true;
    }
}

然后,在我的主角上,我创建了一个事件执行代码,类似于以下内容:

if (global.Mario = true) {
    sprite_index = Mario_NotJumping;
}

if (global.Luigi = true) {
    sprite_index = Luigispr;
}

但是,当我运行我的游戏进行测试时,我收到以下错误:

FATAL ERROR in
action number 1
of Create Event
for object Mario_selection:

Push :: Execution Error - Variable Get -5.Mario(100000, -1)
at gml_Object_Mario_selection_Create_0 (line 1) - if (global.Mario = true) {

该对象Mario_selection具有与主角完全相同的创建事件和相同的代码。向用户显示更改。

如果有人可以帮助我,我对 GameMaker 还很陌生,所以我觉得我只是误解了全局变量。

4

3 回答 3

0

如果我是你,我会将用户选择的“图像”保存在 1 个简单变量中。

添加一些常量;

PLAYER_MARIO = 0;
PLAYER_PEACH = 1;
PLAYER_LUIGI = 2;
PLAYER_BOWSER = 3;

然后您可以使用这些常量并将它们保存在全局变量中;

global.player_image = PLAYER_LUIGI;

然后你可以像这样在你的对象中使用它们;

switch (global.player_image) {
    case PLAYER_MARIO:
        sprite_index = Mario_NotJumping;
        break;
    case PLAYER_PEACH:
        sprite_index = Peach_NotJumping;
        break;
    case PLAYER_LUIGI:
        sprite_index = Luigi_NotJumping;
        break;
    case PLAYER_BOWSER:
        sprite_index = Bowser_NotJumping;
        break;
}

您遇到的具体错误是因为在使用时未定义全局变量。

顺便说一句,更好的方法是这样的 - 将所有精灵句柄保存到特定变量中,然后使用它们。

为可读性定义一些常量;

P_LEFT = 0;
P_RIGHT = 1;
P_JUMP = 2;

然后每当玩家切换角色时;

//When the user switches to peach;
global.player_sprite[P_LEFT] = spr_Peach_Left;
global.player_sprite[P_RIGHT] = spr_Peach_Right;
global.player_sprite[P_JUMPING] = spr_Peach_Jumping;

并覆盖;

//When the user switches to Luigi;
global.player_sprite[P_LEFT] = spr_Luigi_Left;
global.player_sprite[P_RIGHT] = spr_Luigi_Right;
global.player_sprite[P_JUMPING] = spr_Luigi_Jumping;

然后你可以像这样编写所有代码;

if (jumping) {
    sprite_index = global.player_sprite[P_JUMPING];
} else {
    sprite_index = global.player_sprite[P_LEFT];
}

你明白我的意思吗?这样你就不需要到处都使用 switch 语句了,只需在游戏开始时将选定的精灵存储在 1 个单个数组中。

然后,您可以对游戏进行编码,而无需检查玩家选择的玩家图像。

此外,始终在游戏开始时定义全局变量。全局变量将始终存在于游戏中,在每个房间中,在任何给定时刻。

于 2014-04-07T10:09:18.683 回答
0

看起来 var global.Mario 尚未声明。在箭头对象中创建事件放置,

global.Mario = true;
global.PrincessPeach = false;
global.Luigi = false;
global.Bowser = false;
于 2014-03-13T18:40:35.430 回答
-1

你应该var mario=true;改用。

于 2016-04-26T14:13:48.807 回答