0

我已经为自定义键映射创建了一个控制室。我有一个想法 - 如果键被分配给多个控件,那么它会显示为红色。但它只是部分起作用。

生成代码:

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并不重要。有人知道如何解决这个问题吗?

4

1 回答 1

0

您的脚本仅在 ii 等于或大于 1 的情况下返回一个值。当 GM 结束没有返回值的脚本(或简单地调用“return”)时,返回的值只是随机的,它可能是“true”或“ false”或“hello world”字符串。

(通常是前一个函数的结果)。

这是第一个错误,但是当您修复它时,您会注意到键永远不会变红。这是因为从语义上讲,您正在检查一个键是否绑定到两个“函数”。如果两个“功能”绑定到 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);
...

如果您在分配列表中添加/删除键(用户输入),控制器的步骤事件可能会被删除。这样,列表就不必重新构建每个步骤。还有一个明显的改进是将所有这些“键”存储在地图中,而不是简单的变量。

此方法的时间为 O(n),而不是使用函数时的 O(n^2)instance_variable(obj,var)

于 2014-01-20T02:09:53.423 回答