【问题标题】:GM:S Keymap conflict code BUGGM:S Keymap 冲突代码BUG
【发布时间】:2014-01-19 00:28:48
【问题描述】:

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

生成代码:

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

【问题讨论】:

  • 一开始我尝试使用switch(argument0),最后没有添加break,但没有区别。好吧,我会继续尝试,也许我会得出一个结论。顺便说一句,我有工作室,所以你的文件可能无法正常工作,而且我已经有了自己的密钥重新定义脚本(我花了大约 2 天的时间来制作)
  • 是否有不同的方法来检查具有相同变量的对象?我的意思类似于instance_number(obj),但更像instance_variable(obj,var),如果更多这些obj 实例具有相同的值var 变量,则返回true
  • 你可以导入项目。如果您想获取所有具有true 变量的对象,您可以创建列表并向其中添加所需的对象。像这样:global.list = ds_list_create(); with (obj_enemy) { if (aaa=true and bbb=true) { ds_list_add(global.list, id) } }

标签: keyboard keymapping game-maker


【解决方案1】:

您的脚本仅在 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),而不是使用函数 instance_variable(obj,var) 时的 O(n^2)

【讨论】:

  • 一些奇怪的事情开始发生o.O我试过你的代码,但没有成功。所以我把它反过来了。现在完全没有理由,每当我按下“选项”按钮进入选项菜单以重新分配键时,它就会开始滞后,fps 迅速下降,控制对象只是跳过if (room == rm_options) 而是触发两者 - if (room == rm_menu) { scr_menu_init(); } else { scr_othermenu_init(); }
  • 在一个房间里制作来自主菜单和选项屏幕的对话按钮。我无法想象这怎么会发生 o.O
  • 大声笑,当我重新安装配置时它得到了修复(删除了我游戏的 *.ini 文件)
  • 我将使用循环试验 instance_number 和 instance_find :/
猜你喜欢
  • 1970-01-01
  • 2016-05-26
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
相关资源
最近更新 更多