Wählbare Tastenbelegung?

  • genau, anstatt bei den key, press key und release key events eine bestimmte taste zu wählen, wählst du any key aus, und machst dann immer ne abfrage, ob die zuletztgedrückte taste (gibt ne variable dafür) die gewünschte taste ist.
    in eine ini schreibst du rein, welche aktion auf welcher taste liegt, mit einem optionsmenü lässt du diese ini bearbeiten, und bei spielstart liest du diese ini, und weist jeder variable den wert zu, der dafür in der ini steht. z.b. die variable sprung enthält den knopf, auf dem du springst, dann muss der code etwa so aussehen:

    GML-Quellcode

    1. ini_open(config.ini);
    2. sprung=ini_read_string(bewegung,sprung,0);
    3. //hier alle anderen tasten...
    4. ini_close();


    und in key press any event dann:

    GML-Quellcode

    1. if(keyboard_lastkey==sprung)
    2. {
    3. //springen
    4. }


    alle aktionen müssen dann is dieses eine event.

    noch ein verbesserungsvorschlag: benutz lieber

    GML-Quellcode

    1. switch(keyboard_lastkey)
    2. {
    3. case sprung:/*springen*/;break;
    4. case laufen:/*laufen*/;break;
    5. }
  • dann schau dir mal den code im objekt optionen an:
    dort habe ich nur die buchstaben, die ziffern über den buchstaben, die ziffern im numpad sowie die pfeiltasten zugelassen. weitere tasten müsstest du selbst hinzufügen. grund: ich wollte nich so viel schreiben. bei den buchstaben und den zahlen darüber ging die wiedergabe (also dort, wo bei optionen angezeigt wird, welche taste für die jeweilige option verwendet wird) durch chr(keycode). (chr ist ne funktion des gm, und keycode ist der tastencode der belegten taste.) ich muss mit keycodes arbeiten, und dort haben nur diese tasten (mehr oder weniger zufällig) den selben code, wie ihre nummer in der ascii-tabelle ist. alle anderen müssen im switch einzeln aufgelistet werden, und das war mir zu viel arbeit für ein beispiel. um weitere tasten hinzuzufügen gehst du zuerst in den debugmode, und gibst in der tabelle des zweiten fensters keyboard_lastkey ein, und drückst dann im spiel die taste, deren code du brauchst. diese setzt du dann einmal ins draw_event bei obj_optionen, bei dem switch(xxx) rein, und schreibst dann in die neue zeile, welcher text für diese taste angezeigt werden soll, und einmal in das press any key event, in diese sehr lange if zeile, da fügst du einfach ganz rechts, ein zeichen links von der geschlossenen klammer "||" ein (ohne "") und dann keyboard_key==<die nummer, die du einbaust>. sollte eigentlich funktionieren...
  • Bei mir hat das nicht geklappt. Also ich habs mal mit dem buchstaben A versucht noch welche rannzuhänge. Im debug zeigte er mir dann 65 an dann hab ich jetzt vollgende sachen geändert:

    GML-Quellcode

    1. // bei press any key
    2. switch(wahl)
    3. {
    4. case 0:switch(keyboard_lastchar)
    5. {
    6. case '1':wahl=1;break;
    7. case '2':wahl=2;break;
    8. case '3':wahl=3;break;
    9. case '4':wahl=4;break;
    10. case '5':script1();room_goto(room0);break;
    11. };break;
    12. case 1:if((37<=keyboard_lastkey && keyboard_lastkey<=40) || (96<=keyboard_lastkey && keyboard_lastkey<=105) || (48<=keyboard_lastkey && keyboard_lastkey<=57) || (65<=keyboard_lastkey && keyboard_lastkey<=90)) || keyboard_key==<65> // das hab ich angehängt(auch bei case 2,3 und 4)
    13. {
    14. global.left=keyboard_lastkey;
    15. };wahl=0;break;
    16. case 2:if((37<=keyboard_lastkey && keyboard_lastkey<=40) || (96<=keyboard_lastkey && keyboard_lastkey<=105) || (48<=keyboard_lastkey && keyboard_lastkey<=57) || (65<=keyboard_lastkey && keyboard_lastkey<=90)) || keyboard_key==<65>
    17. {
    18. global.up=keyboard_lastkey;
    19. };wahl=0;break;
    20. case 3:if((37<=keyboard_lastkey && keyboard_lastkey<=40) || (96<=keyboard_lastkey && keyboard_lastkey<=105) || (48<=keyboard_lastkey && keyboard_lastkey<=57) || (65<=keyboard_lastkey && keyboard_lastkey<=90)) || keyboard_key==<65>
    21. {
    22. global.right=keyboard_lastkey;
    23. };wahl=0;break;
    24. case 4:if((37<=keyboard_lastkey && keyboard_lastkey<=40) || (96<=keyboard_lastkey && keyboard_lastkey<=105) || (48<=keyboard_lastkey && keyboard_lastkey<=57) || (65<=keyboard_lastkey && keyboard_lastkey<=90)) || keyboard_key==<65>
    25. {
    26. global.down=keyboard_lastkey;
    27. };wahl=0;break;
    28. }
    Alles anzeigen

    und dann hab ich noch das Andere gemacht:

    GML-Quellcode

    1. // bei draw
    2. draw_text(50,50,'1.: Links');
    3. draw_text(50,70,'2.: Hoch');
    4. draw_text(50,90,'3.: Rechts');
    5. draw_text(50,110,'4.: Runter');
    6. draw_text(50,150,'5.: Zurück');
    7. for(i=1; i<=4; i+=1)
    8. {
    9. switch(i)
    10. {
    11. case 1:xxx=global.left;break;
    12. case 2:xxx=global.up;break;
    13. case 3:xxx=global.right;break;
    14. case 4:xxx=global.down;break;
    15. }
    16. switch(xxx)
    17. {
    18. case 37:yyy='arrow_left';break;
    19. case 38:yyy='arrow_up';break;
    20. case 39:yyy='arrow_right';break;
    21. case 40:yyy='arrow_down';break;
    22. case 96:yyy='num_0';break;
    23. case 97:yyy='num_1';break;
    24. case 98:yyy='num_2';break;
    25. case 99:yyy='num_3';break;
    26. case 100:yyy='num_4';break;
    27. case 101:yyy='num_5';break;
    28. case 102:yyy='num_6';break;
    29. case 103:yyy='num_7';break;
    30. case 104:yyy='num_8';break;
    31. case 105:yyy='num_9';break;
    32. case 65:yyy='A';break; // das hier hab ich dann noch reingesetzt
    33. default:if((48<=xxx && xxx<=57) || (65<=xxx && xxx<=90))
    34. {
    35. yyy=chr(xxx);
    36. }
    37. else yyy='';break;
    38. }
    Alles anzeigen

    Dann kommt aber ne Fehlermeldung. Was hab ich falsch gemacht?
  • 1.: wenn du die fehlermeldung nich auch noch hin schreibst, hab ich keine ahnung, was da nicht stimmt
    2.: a ist schon drinne ( im bereich von 65 bis 90) also ist dieser zusätzliche code überflüssig.
    3.: der fehler liegt bei dir im syntax:

    GML-Quellcode

    1. case 1:if((37<=keyboard_lastkey && keyboard_lastkey<=40) || (96<=keyboard_lastkey && keyboard_lastkey<=105) || (48<=keyboard_lastkey && keyboard_lastkey<=57) || (65<=keyboard_lastkey && keyboard_lastkey<=90)) || keyboard_key==<65> //blödfug!
    2. case 1:if((37<=keyboard_lastkey && keyboard_lastkey<=40) || (96<=keyboard_lastkey && keyboard_lastkey<=105) || (48<=keyboard_lastkey && keyboard_lastkey<=57) || (65<=keyboard_lastkey && keyboard_lastkey<=90) || keyboard_lastkey==65)


    das anknüpfen der neuen taste mit hilfe des oders erfolgt gefällisgst in der abfrage, also vor der letzten klammer, und die spitzen klammern haben bei der zahl auch nix verloren...
    außerdem würde ich bei keyboard_lastkey bleiben, weil es dann einheitlich ist...
  • Benutzer online 1

    1 Besucher