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
事件将在 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
是您的虚拟按钮的坐标。
有很多方法可以改进它,但都取决于你的code/architecture(对象的深度,实例的创建顺序等),所以我无法给出一个完美的解决方案。如果您遇到修复问题,请分享您的项目,我会提供帮助。
我有以下问题:
当我按下暂停键时,我的角色同时跳跃,暂停键是一个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
事件将在 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
是您的虚拟按钮的坐标。
有很多方法可以改进它,但都取决于你的code/architecture(对象的深度,实例的创建顺序等),所以我无法给出一个完美的解决方案。如果您遇到修复问题,请分享您的项目,我会提供帮助。