我为自定义键盘映射设置了控制室。我有一个想法 - 如果将密钥分配给多个控件,则它会显示为红色。但它只是部分有效。
产卵代码:
with(instance_create(64,64,obj_button_key)) {
mytext="UP: ";
myKEY=global.keyUP;
mytype=1;
}
with(...
scr_keymap_conflict(argument0):
var ii;
ii = 0;
if (argument0 == global.keyUP) ii+=1;
if (argument0 == global.keyDOWN) ii+=1;
if (argument0 == global.keyLEFT) ii+=1;
if (argument0 == global.keyRIGHT) ii+=1;
if (argument0 == global.keySPRINT) ii+=1;
if (argument0 == global.keyCROUCH) ii+=1;
if (argument0 == global.keyGRENADE) ii+=1;
if (argument0 == global.keyACTION) ii+=1;
if (argument0 == global.keyCHAT) ii+=1;
if (argument0 == global.keyMELEE) ii+=1;
if (argument0 == global.keyDROP) ii+=1;
if (ii > 1) {
return true;
}
绘制:
if (active) {draw_set_color(c_yellow)}
else if (scr_keymap_conflict(myKEY)) {draw_set_color(c_red)}
else draw_set_color(c_gray);
...
好像scr_keymap_conflict(argument0)
提供无效信息有问题,所以有些按钮会变为红色,但有些按钮会变为红色,例如,如果有两个vk_space
控件,那么第一个按钮会变成红色,但第二个不会(我感觉draw_set_color
在随机时刻覆盖了不同的对象)。无论如何,global.key...
保持ASCII实际值(键盘快捷键)。在这种情况下,active
和mytype
并不重要。任何人都知道如何解决这个问题?
答案 0 :(得分:0)
你的脚本只在ii等于或大于1的情况下返回一个值。当GM结束没有返回值的脚本(或简单地调用“return”)时,返回的值只是随机的,它可能是“真的” “或”假“,或”你好世界“字符串。
(通常是前一个函数的结果)。
这是第一个错误,但是当你修复它时你会注意到键永远不会变成红色。这是因为在语义上你正在检查一个键是否绑定到两个“函数”。如果两个“功能”绑定到2个键,则不是。
你需要一个不同的系统,我能想到的最简单的事情是使用一个控制器(下面的代码没有经过测试,只是为了表明这个想法):
创建事件控制对象
keyUP = ds_list_create();
keyDown = ds_list_create();
keyLEFT = ds_list_create();
keyRIGHT = ds_list_create();
keySPRINT = ds_list_create();
keyCROUCH = ds_list_create();
keyGRENADE = ds_list_create();
keyACTION = ds_list_create();
keyCHAT = ds_list_create();
keyMELEE = ds_list_create();
keyDROP = ds_list_create();
步骤事件控制对象
ds_list_clear(keyUP);
ds_list_clear(keyDOWN);
//... etc for all keys
with (objKeys) {
ds_list_add(myKEY, id);
}
产生objKeys的代码
with(instance_create(64,64,obj_button_key)) {
mytext="UP: ";
myKEY=objKeyController.keyUP;
//notice that it refers to the controller's list
mytype=1;
}
绘制活动
if (active) {draw_set_color(c_yellow)}
else if (ds_list_size(myKEY) > 1) {draw_set_color(c_red)}
else draw_set_color(c_gray);
...
如果在分配时向列表添加/删除键(用户输入),则可能会删除控制器的步骤事件。这样,列表不必重建每个步骤。 另一个显而易见的改进是将所有这些“键”存储在地图中而不是简单的变量中。
使用函数instance_variable(obj,var)