GM:S Keymap冲突代码BUG

时间:2014-01-19 00:28:49

标签: keyboard keymapping game-maker

我为自定义键盘映射设置了控制室。我有一个想法 - 如果将密钥分配给多个控件,则它会显示为红色。但它只是部分有效。

产卵代码:

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实际值(键盘快捷键)。在这种情况下,activemytype并不重要。任何人都知道如何解决这个问题?

1 个答案:

答案 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)

时,此方法有O(n)时间而不是O(n ^ 2)