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
事件将在 Keyboard
和 Mouse
事件(以及虚拟按钮)之前运行。因此,如果您在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_left
、virt_top
、virt_right
、virt_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 中跟随我