Im if noch 2 mal if!

  • Im if noch 2 mal if!

    Es passiert mir ständig. Ich mach nen Code der so aus sieht:

    GML-Quellcode

    1. if keyboard_check_pressed(vk_space) or keyboard_check_pressed(vk_enter) {
    2. if global.schalter01 == 1 {
    3. sprite_index=spr_schalter_on
    4. global.schalter01 = 2
    5. }
    6. if global.schalter01 == 2 {
    7. sprite_index=spr_schalter_off
    8. global.schalter01 = 1
    9. }
    10. }

    und nie funktioniert auch nicht aber das:

    GML-Quellcode

    1. if keyboard_check_pressed(vk_space) or keyboard_check_pressed(vk_enter) {
    2. if global.schalter01 == 1 {
    3. sprite_index=spr_schalter_on
    4. global.schalter01 = 2
    5. } else {
    6. sprite_index=spr_schalter_off
    7. global.schalter01 = 1
    8. }
    9. }

    Funktioniert. Wieso?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von lucky90 ()

  • Also beim ersten ist es ganz easy. Ich spiel jetzt mal den Interpretor okay?

    - Hmm... da drückt jemand die Enter Taste. Okay gehn wir in die erste If Bedingung.
    - Ja Hallo! Global.schalter01 ist ja 1. Gleich in die nächste If bedingung. Heute ist ein guter Tag!
    - Stellen wir jetzt global.schalter01 auf 2.
    - Ja Hölle! Schon wieder eine If bedingung war. global.schalter01 ist ja jetzt 2.
    - Und schon wird global.schalter01 wieder auf 1 gesetzt.

    Beim zweiten würde ich einfach drauf setzen das Keyboard Event fröhlich jeden Step ausgelöst wird. Probier mal ob ein Keyboard_clear oder wie auch immer der Befehl genau heißt das Problem lößt.
    ...
  • Es ist so wie Shoba sagt, das zweite If wird gleich nach dem ersten ausgeführt.

    Das mit else ist in dem Falle mit ner Variable ein Behelf, bei solchen Sachen sind Switch Konstruktionen aber effizienter.

    Würde dann so aussehen:

    GML-Quellcode

    1. if keyboard_check_pressed(vk_space) or keyboard_check_pressed(vk_enter) {
    2. switch (global.schalter01){
    3. case 1: {sprite_index=spr_schalter_on;
    4. global.schalter01 = 2;
    5. break;}
    6. case 2:{sprite_index=spr_schalter_off;
    7. global.schalter01 = 1;
    8. break;}
    9. }
    10. }
    Alles anzeigen
    "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
    - Joseph Weizenbaum
  • Hmm... aber wenn man genau 2 verschiedene Stadien bei einer Variable hat sollte man doch bei If bleiben. Soweit ich weiß braucht das auch weniger resourcen bei der ausführung, weil es weniger komplex als switch ist. Übrigens ~ eher kosmetischer Natur, switch Statements muß man nicht in blöcke unterteilen (mit "{" und "}" ).
    ...
  • Die einfachere Lösung hat Blank ja schon selber geschrieben: if und else. Wenn man die beiden Wörtchen hernimmt wird nur beim ersten if die Bedingung überprüft und je nach Ergebnis in die geschweiften Klammern bei if oder bei else gesprungen und nach den Anweisungen in diesen Klammern ans Ende (also nach die geschweifte Klammer zu von else). Beim ersten Beispiel wird zweimal nach der Bedingung gefragt und die ändert sich natürlich, nachdem die erste Klammer ausgeführt wird. Ist eine Falle über die wahrscheinlich jeder Programmierer mal stolpert. Mich eingeschlossen.
    Am besten ist es dann wirklich, wie Shoba das vormacht, selber den Interpreter zu spielen und im Kopf alle Zeilen abzuarbeiten.

    switch wird erst ab 3 Möglichkeiten wirklich interessant...
    Einige meiner Spiele:
  • der mr.andy hat wieder mal ne lösung^^ :P :D :P :D
    mach es einfach so

    GML-Quellcode

    1. an=true
    2. if keyboard_check_pressed(vk_space) or keyboard_check_pressed(vk_enter) {
    3. if global.schalter01 == 1 {
    4. if an=true {
    5. sprite_index=spr_schalter_on
    6. global.schalter01 = 2
    7. an = false
    8. }
    9. }
    10. if global.schalter01 == 2 {
    11. if an=true {
    12. sprite_index=spr_schalter_off
    13. global.schalter01 = 1
    14. an=false
    15. }
    16. }
    17. }
    18. }
    Alles anzeigen
    Die Schönheit liegt im Auge des Betrachters :D
  • Original von Andyworld
    der mr.andy hat wieder mal ne lösung^^ :P :D :P :D
    mach es einfach so

    GML-Quellcode

    1. an=true
    2. if keyboard_check_pressed(vk_space) or keyboard_check_pressed(vk_enter) {
    3. if global.schalter01 == 1 {
    4. if an=true {
    5. sprite_index=spr_schalter_on
    6. global.schalter01 = 2
    7. an = false
    8. }
    9. }
    10. if global.schalter01 == 2 {
    11. if an=true {
    12. sprite_index=spr_schalter_off
    13. global.schalter01 = 1
    14. an=false
    15. }
    16. }
    17. }
    18. }
    Alles anzeigen



    Also, ich bevorzuge das break-System.
    Ist viel einfacher.


    So mal nebenbei:
    Wenn man die Funktion break einsetzt beendet es den ganzen Script oder nur ein block?

    Also zb so ein Script:

    GML-Quellcode

    1. {
    2. // SCRIPT ANFANG
    3. {//Block 1
    4. if blabla = "?"
    5. {
    6. ...
    7. break
    8. }
    9. else
    10. {
    11. ...
    12. break
    13. }
    14. }
    15. {// Block2
    16. ...
    17. }
    18. //SCRIPT ENDE
    19. }
    Alles anzeigen



    Würde er trotz dem break im 1. Block auf den 2. Block rübergehen oder nicht?
    Meine Homepage:
    www.eafoods.tk
    ---------
    Sachma!
    Ich werd noch bekloppt ( wenn ich es jetzt noch nicht bin )! :O
    Braucht ihr ein Dolmetscher für die Fäkalsprache, oda was?
  • 1.: break beendet nur den block. beispiel:

    GML-Quellcode

    1. switch (<abfrage1>)
    2. {
    3. case_1_1:switch(<abfrage2>)
    4. {
    5. case_2_1:switch(<abfrage3>)
    6. {
    7. case_3_1;break;
    8. case_3_2;break;
    9. case_3_3;break;
    10. };break;
    11. case_2_2:switch(<abfrage3>)
    12. {
    13. case_3_1;break;
    14. case_3_2;break;
    15. case_3_3;break;
    16. };break;
    17. case_2_3:switch(<abfrage3>)
    18. {
    19. case_3_1;break;
    20. case_3_2;break;
    21. case_3_3;break;
    22. };break;
    23. };break;
    24. case_1_2:switch(<abfrage2>)
    25. {
    26. case_2_1:switch(<abfrage3>)
    27. {
    28. case_3_1;break;
    29. case_3_2;break;
    30. case_3_3;break;
    31. };break;
    32. case_2_2:switch(<abfrage3>)
    33. {
    34. case_3_1;break;
    35. case_3_2;break;
    36. case_3_3;break;
    37. };break;
    38. case_2_3:switch(<abfrage3>)
    39. {
    40. case_3_1;break;
    41. case_3_2;break;
    42. case_3_3;break;
    43. };break;
    44. };break;
    45. case_1_2:switch(<abfrage2>)
    46. {
    47. case_2_1:switch(<abfrage3>)
    48. {
    49. case_3_1;break;
    50. case_3_2;break;
    51. case_3_3;break;
    52. };break;
    53. case_2_2:switch(<abfrage3>)
    54. {
    55. case_3_1;break;
    56. case_3_2;break;
    57. case_3_3;break;
    58. };break;
    59. case_2_3:switch(<abfrage3>)
    60. {
    61. case_3_1;break;
    62. case_3_2;break;
    63. case_3_3;break;
    64. };break;
    65. };break;
    66. }
    Alles anzeigen


    wie man hier deutlich sehen kann ist nach jedem switch, das wiederum in einem switch liegt, ein break, da sonst alle weiteren befehle ausgführt würden...

    2.: bei deinem beispelscript, dieses mit dem if blabla, wird nachdem der erste block durchlaufen wurde, der zweite sowieso nicht benutzt werden, da es sich beim ersten block um eine if-condition handlt, und beim 2. um den zugehörigen else-block.
  • Benutzer online 1

    1 Besucher