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

Posted

技术标签:

【中文标题】GameMaker Studio:处理虚拟键时如何忽略全局左键?【英文标题】:GameMaker Studio: How to ignore global left button when dealing with virtual keys? 【发布时间】:2016-09-09 18:55:34 【问题描述】:

我有以下问题:

当我按下暂停按钮时,我的角色会同时跳跃,暂停按钮是虚拟键,跳跃按钮是 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)

【问题讨论】:

【参考方案1】:

你读过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 是您的虚拟按钮的坐标。

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

【讨论】:

它起作用了,只是当我与某物发生碰撞时,**无法在 gml_Object_obj_player_StepEndEvent_1(第 5 行)找到对象索引“23”名称“obj_cause”的任何实例 - 如果 point_in_rectangle(device_mouse_x_to_gui(0) , device_mouse_y_to_gui(0), obj_cause.x -10, obj_cause.y - 10, obj_cause.x + 10, obj_cause.y + 10) ** 这里是项目。对不起,我对编程还是新手,这是我迄今为止所做的复杂项目。 filedropper.com/prototype1110gmx 通过检查实例之前是否存在来修复它。非常感谢!

以上是关于GameMaker Studio:处理虚拟键时如何忽略全局左键?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 NPC 在 Gamemaker Studio 1.4 中跟随我

在 Gamemaker Studio 2 中,我如何在代码中找出平台是不是为 HTML5?

译文|GAMEMAKER STUDIO 系列:简单状态机

Gamemaker Studio 2,绘制 GUI 层冲突

在 GameMaker: Studio 中等待

GameMaker Studio2 疑难杂症