在不同的房间中切换对象的精灵

时间:2014-03-12 23:38:37

标签: game-maker

我正在创建一个字符选择,用于更改主角的精灵。

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

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来说相当新,所以我有一种感觉,我只是误解了全局变量。

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

添加一些常量;

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语句,只需在游戏开始时将选中的sprite存储在一个单独的数组中。

然后您可以编码游戏而无需检查玩家选择的玩家形象。

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

答案 2 :(得分:-1)

您应该使用existingEntity.ellipse.semiMinorAxis.setCallback( this._getRadius.bind(this, circle), isConst ); existingEntity.ellipse.semiMajorAxis.setCallback( this._getRadius.bind(this, circle, 1), isConst ); 代替。