Device Input Problem

  • Android

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Device Input Problem

    Hallo,

    In meinem Spiel gibt es 4 Behälter, in die man verschieden farbige Bomben tun muss:

    Mit der normalen Maus Funktion von WIndows hat das ganze prima funktioniert. Doch wollte ich, dass man gleichzeitig 2 Bomben bewegen kann (also mit dem linken und rechten Daumen).
    Deshalb habe ich folgenden Code geschrieben:
    obj_bombe :event_step:

    GML-Quellcode

    1. for(i = 0;i<=4;i+=1)
    2. {
    3. if(snap == true)
    4. {
    5. x = device_mouse_x(i);
    6. y = device_mouse_y(i);
    7. }
    8. if(device_mouse_check_button_pressed(i,mb_left) && device_mouse_x(i) > x && device_mouse_x(i) < x+sprite_get_width(spr_bomb) && device_mouse_y(i) > y && device_mouse_y(i) < y+sprite_get_height(spr_bomb))
    9. {
    10. snap = true;
    11. }
    12. if(device_mouse_check_button_released(i,mb_left))
    13. {
    14. snap = false;
    15. }
    16. }
    Alles anzeigen

    Leider passiert absolut garnichts, wenn ich auf eine Bombe drücke, man kann sie nicht bewegen.
    Hat jemand ne Idee, wo der Fehler liegen könnte?

    Gruß, derkimba
  • Hi,
    ich bin mir noch nicht ganz sicher, aber ein paar Sachen sind schon mal nicht so optimal.
    1. Ist snap denn auch initial auf false gesetzt (besser -1)?
    2. Kannst du snap nicht einfach auf true setzen, denn du musst dir ja auch merken, welches Device es war. Also empfehle ich snap = i; zu setzen (und sonst snap = -1; statt false). Dann musst du natürlich auch entsprechend prüfen snap == i...
    3. Wenn du aber wie du sagst sogar mehrere Finger gleichzeitig benutzen können willst, brauchst du sogar für jedes Device eine eigene Variable, dann empfehle ich sogar ein Array der Form snap[0 ... 4] zu benutzen (da reichen natürlich wieder true und false).
    4. Nur eine Empfehlung am Rande, da gml sehr ineffizient ist, wird im allgemeinen ein möglichst verschachteltes Scoping empfohlen. Also dass die ganzen Bedingungen immer in ein weiter verschachteltes if setzt.
    5. Auch nur ein Tipp: Benutze sprite_index, statt direkt spr_bomb, wenn der Instanz eh diesen Sprite zugeordnet haben solltest.
  • Ja, snap wird im Create auf esetzt.
    Könntest du eventuell nen Beispielcode für mich schreiben?
    Hab noch nie mit den device Funktionen gearbeitet und verstehe auch nicht ganz was man beim Device-Parameter eingeben soll.

    Gruß, derkimba
  • Sorry, dazu komme ich erstmal nicht.
    Aber du hast das doch schon ganz richtig verstanden, denke ich. Die Device-Funktionen brauchen halt die ID der "Maus" (0-4).
    Mach erstmal in deinen Create noch ein snap[0 ... 4] = false; und benutze es wie ich beschrieben habe, damit nicht etwa das unbenutzte Device 1 die Koordinaten überschreibt, obwohl du evtl. nur Device 0 benutzt (nur einen statt zwei Finger auf dem Bildschirm).
    Sofern alles andere korrekt ist, sollte es dann zumindest schon mal mit nur einem Finger funktionieren.
    Was dann noch fehlen würde, wäre sich zu merken, welcher Finger, also welche Device-ID, für welche Bombe verwendet wurde...

    Du schaffst das schon ;)
  • Ich verstehe nicht so recht wofür du in diesem Fall "snap" überhaupt verwendest. Und ein Array würde das ganze nur noch mehr übertreiben...

    GML-Quellcode

    1. for(i = 0; i <= 4; i += 1) {
    2. if(device_mouse_check_button_pressed(i,mb_left) && device_mouse_x(i) > x && device_mouse_x(i) < x+sprite_get_width(spr_bomb) && device_mouse_y(i) > y && device_mouse_y(i) < y+sprite_get_height(spr_bomb)) {
    3. x = device_mouse_x(i);
    4. y = device_mouse_y(i);
    5. }
    6. }


    Wenn du verhindern willst, dass mehrere Devices gleichzeitig bei der selben Instanz verwendet werden, oder snap noch für eine Anzeige oder so brauchst, würde ich sie so verwenden...

    GML-Quellcode

    1. snap = false;
    2. for(i = 0; i <= 4; i += 1) {
    3. if(device_mouse_check_button_pressed(i,mb_left) && device_mouse_x(i) > x && device_mouse_x(i) < x+sprite_get_width(spr_bomb) && device_mouse_y(i) > y && device_mouse_y(i) < y+sprite_get_height(spr_bomb) && !snap) {
    4. x = device_mouse_x(i);
    5. y = device_mouse_y(i);
    6. snap = true;
    7. }
    8. }
  • Vielen Dank an euch beide :)
    Hab es nun so gelöst (funktioniert auch mit mehreren Fingern gleichzeitig):

    GML-Quellcode

    1. for(i = 0; i <= 4; i += 1)
    2. {
    3. if(device_mouse_check_button_pressed(i,mb_left) && device_mouse_x(i) > x && device_mouse_x(i) < x+sprite_get_width(spr_bomb) && device_mouse_y(i) > y && device_mouse_y(i) < y+sprite_get_height(spr_bomb) && snap == -1)
    4. {
    5. snap = i;
    6. }
    7. }
    8. if(snap != -1 && device_mouse_check_button_released(snap,mb_left))
    9. {
    10. snap = -1
    11. }
    12. if(snap != -1)
    13. {
    14. x = device_mouse_x(snap)-(sprite_get_width(spr_bomb)/2);
    15. y = device_mouse_y(snap)-(sprite_get_height(spr_bomb)/2);
    16. }
    Alles anzeigen

    Gruß, derkimba
  • ghost schrieb:

    Ich verstehe nicht so recht wofür du in diesem Fall "snap" überhaupt verwendest. Und ein Array würde das ganze nur noch mehr übertreiben...
    Wie du an derkimba's Lösung siehst, ist snap nötig, weil dein Code nur in dem einen Frame reagieren würde, in dem du "klickst". Außerdem ginge dein Code nur, solange der Finger auf der Bombe bliebe. Würdest du die Bombe so schnell verschieben wollen, dass dein Finger innerhalb eines Frames die Bombe verlässt, würde es also nicht mehr klappen.

    Und als Array ist es nur nötig, wenn der Code außerhalb des Objektes läge, welches man verschieben möchte. In derkimba's Lösung hat nun jede Bombe eine snap Variable, daher funktioniert das auch.