GameMaker Studio:处理虚拟键时如何忽略全局左键?

GameMaker Studio: How to ignore global left button when dealing with virtual keys?

我有以下问题:

当我按下暂停键时,我的角色同时跳跃,暂停键是一个VIRTUAL KEY,跳跃键是keyboard_mouse_button_check(mb_left) .

我正在尝试:

可以在不让角色同时跳跃的情况下按下暂停键

Obj_pause

创建活动

global.pause = 0;

步骤事件

if keyboard_check_pressed(vk_space) and !global.death and !global.stop
    global.pause = !global.pause

Obj_player

创建活动

// Initialize Variables
global.stop = 0;
previously_paused = false;
global.bigscore = 0;
global.col = true;
global.cartof = 0;
grav = 0.2;
hsp = 0;
vsp = 0;
jumpspeed = 4;
movespeed = 4;
antigrav = true;
jumps = 0;

jumpsmax = 2;

delay = 3;
alarm[3] = delay;

步骤事件

if (global.pause) or (global.death) exit;   // Pause

// Get the player's input

key_jump = mouse_check_button(mb_left);

// React to inputs
hsp = 0;
if vsp < 10
    vsp += grav;

if place_meeting(x, y + 1, obj_wall)
    jumps = jumpsmax;

// Double jump
if (key_jump) && (jumps > 0) && (!previously_paused)
{
    jumps -= 1;
    vsp = -jumpspeed;
    previously_paused = global.pause;
}
// Fly
else if (jumps == 0)
{
    key_jump = mouse_check_button(mb_left);
    if key_jump
        vsp -= 0.4
}

if global.col
{
    // Horizontal Collision
    if (place_meeting(x+hsp, y, obj_wall))
    {
        while (!place_meeting(x + sign(hsp), y, obj_wall))
        {
            x += sign(hsp);
        }
        hsp = 0;     
    }
    x += hsp;
}

// Vertical Collision
if (place_meeting(x, y + vsp, obj_wall))
{
    while (!place_meeting(x, y + sign(vsp), obj_wall))
    {
        y += sign(vsp);
    }
    vsp = 0;     
}
y += vsp;   

// Exit the game or restart
if keyboard_check(ord("P"))
    game_restart();

if keyboard_check(vk_space)
    alarm[1] = room_speed;

// Score
if background_hspeed[0] < 0
    global.cartof += 10;

我试过:

检查我是否按下暂停按钮不执行跳转当我单击暂停按钮时将key_jump更改为等于0。当鼠标悬停在暂停按钮上时取消激活鼠标 ArchbishopDave 方法

我正在使用:

GM:S 1.4

GameMaker 语言 (GML) 或拖放 (DnD)

你读过event order了吗? Step 事件将在 KeyboardMouse 事件(以及虚拟按钮)之前运行。所以如果你在Step事件中勾选了跳跃按钮,并且只有在按下虚拟键之后,你的角色才会一直跳跃。 您需要更改支票顺序。例如,你可以在跳转之前手动检查是否按下了虚拟键(检查鼠标是否在虚拟键的坐标内),像这样:

key_jump = mouse_check_button(mb_left);
if point_in_rectangle(device_mouse_x_to_gui(0), device_mouse_y_to_gui(0), virt_left, virt_top, virt_right, virt_bottom)
    key_jump = false;

其中 virt_leftvirt_topvirt_rightvirt_bottom 是您的虚拟按钮的坐标。

有很多方法可以改进它,但都取决于你的code/architecture(对象的深度,实例的创建顺序等),所以我无法给出一个完美的解决方案。如果您遇到修复问题,请分享您的项目,我会提供帮助。