0

カスタム キーマッピング用のコントロール ルームを作成しました。キーが複数のコントロールに割り当てられている場合、赤く表示されるという考えがありました。しかし、それは部分的にしか機能しません。

スポーン コード:

with(instance_create(64,64,obj_button_key)) {
    mytext="UP: ";
    myKEY=global.keyUP;
    mytype=1;
}
with(...

scr_keymap_conflict(引数0):

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)無効な情報を与えることに問題があるようです。そのため、一部のボタンは赤くなりますが、一部のボタンは赤くなりません。たとえば、2 つのvk_spaceコントロールがある場合、最初のコントロールは赤くなりますが、2 つ目は赤くなりません (私はdraw_set_colorランダムな瞬間に別々のオブジェクトを上書きしているような感覚)。とにかく、global.key...ASCII の実数値 (キーボード ショートカット) を保持します。この場合は重要ではありませんactivemytype誰でもこれを修正する方法を知っていますか?

4

1 に答える 1

0

スクリプトは、ii が 1 以上の場合にのみ値を返します。GM が戻り値なしでスクリプトを終了する (または単に「return」を呼び出す) 場合、返される値はランダムであり、「true」または「」の可能性があります。 false」、または「hello world」文字列。

(通常、これは前の関数の結果です)。

これは最初のバグですが、修正すると、キーが赤くなることはありません。これは、キーが 2 つの「関数」にバインドされているかどうかを意味的にチェックしているためです。2 つの「関数」が 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^2) ではなく O(n) 時間がありますinstance_variable(obj,var)

于 2014-01-20T02:09:53.423 に答える