Objekt wechselt ungewollt die Richtung

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

  • Objekt wechselt ungewollt die Richtung

    Hallo,

    folgenden Code habe ich im Space-Event eines player_objektes:

    GML-Quellcode

    1. {
    2. if keyboard_check(vk_up)=false
    3. instance_create(obj_player.x,obj_player.y,object7);
    4. if keyboard_check(vk_up)=false
    5. object7.vspeed=2;
    6. if keyboard_check(vk_left)=false
    7. instance_create(obj_player.x,obj_player.y,object7);
    8. if keyboard_check(vk_left)=false
    9. object7.hspeed=-2;
    10. if keyboard_check(vk_down)=false
    11. instance_create(obj_player.x,obj_player.y,object7);
    12. if keyboard_check(vk_down)=false
    13. object7.vspeed=-2;
    14. if keyboard_check(vk_right)=false
    15. instance_create(obj_player.x,obj_player.y,object7);
    16. if keyboard_check(vk_right)=false
    17. object7.hspeed=2;
    18. }
    Alles anzeigen


    Also wie ihr seht, soll bei einem Richtungswechsel der Schuss
    auch in die richtige Richtung gehen. Klappt ja auch soweit.
    Es ist auch klar, warum die schon abgeschossenen Kugeln
    sich mit der neuen Richtung bewegen.

    Aber wie kann ich die abgeschossene Kugel einfach ihren Weg
    gehen lassen ohne das sie bei einer neuen Kugel deren Richtung annimmt?
    Was man mit Händen baut, kann auch mit Händen zerstört werden...
  • Kann dir zwar nicht helfen aber mal nen Tip.
    Warum fragst du bei jeden check 2 mal eine taste ab?
    Das ist total sinnlos.
    Zudem wäre auch ein Switch angebracht.

    Ich würde satt dem objekt eine instance erstellen,
    da du ja beim runterdücken neu die richtung für das objekt angibst.
    ergo instance nehmen.

    also so hier:

    if ....
    {
    instance[zahl] = instance_create(CODE)
    instance[zahl].vspeed+=2
    zahl+=1
    }

    vorher zahl mit 1 initialisieren.
    Ich übernehme keine haftung auf richtigkeit des codes dürfte aber klappen.
    das natürlich bei allen abfragen.
    Face in the wind, we're riding the storm
    We'll stay our course whatever will come
    ~~ Stay (Running) Wild ~~
  • Original von Defmaster
    Kann dir zwar nicht helfen aber mal nen Tip.
    Warum fragst du bei jeden check 2 mal eine taste ab?
    Das ist total sinnlos.
    Zudem wäre auch ein Switch angebracht.

    Ich würde satt dem objekt eine instance erstellen,
    da du ja beim runterdücken neu die richtung für das objekt angibst.
    ergo instance nehmen.


    Dann nimm dir mal ein Strip-sprite vor und versuche mal image_index mit richtungswechsel auszulesen! Dann wirst du begreifen...
    Was man mit Händen baut, kann auch mit Händen zerstört werden...
  • Machs so:

    GML-Quellcode

    1. {
    2. var temp_object;
    3. if keyboard_check(vk_up)=false
    4. temp_object=instance_create(obj_player.x,obj_player.y,object7);
    5. if keyboard_check(vk_up)=false
    6. temp_object.vspeed=2;
    7. if keyboard_check(vk_left)=false
    8. temp_object=instance_create(obj_player.x,obj_player.y,object7);
    9. if keyboard_check(vk_left)=false
    10. temp_object.hspeed=-2;
    11. if keyboard_check(vk_down)=false
    12. temp_object=instance_create(obj_player.x,obj_player.y,object7);
    13. if keyboard_check(vk_down)=false
    14. temp_object.vspeed=-2;
    15. if keyboard_check(vk_right)=false
    16. temp_object=instance_create(obj_player.x,obj_player.y,object7);
    17. if keyboard_check(vk_right)=false
    18. temp_object.hspeed=2;
    19. }
    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
  • EDIT-EDIT: Hab einen Fehler entdeckt. Die Figur schiesst mit untenstehendem Code aber nur, während des Laufens. Sie soll aber auch schiessen, wenn sie nur steht...

    Das müsste ja sowas sein wie vk_nokey... aber was ist dann mit vspeed und hspeed??? Wie prüfe ich in welcher Richtung der Spieler steht?

    EDIT:

    Defmaster´s Code hat funktioniert. Hier die richtige GML:

    GML-Quellcode

    1. {
    2. var zahl;
    3. zahl=1;
    4. if keyboard_check(vk_up)=true
    5. instance[zahl]=instance_create(obj_player.x,obj_player.y,object7);
    6. if keyboard_check(vk_up)=true
    7. instance[zahl].vspeed=-2;
    8. zahl +=1;
    9. if keyboard_check(vk_down)=true
    10. instance[zahl]=instance_create(obj_player.x,obj_player.y,object7);
    11. if keyboard_check(vk_down)=true
    12. instance[zahl].vspeed=2;
    13. zahl +=1;
    14. if keyboard_check(vk_left)=true
    15. instance[zahl]=instance_create(obj_player.x,obj_player.y,object7);
    16. if keyboard_check(vk_left)=true
    17. instance[zahl].hspeed=-2;
    18. zahl +=1;
    19. if keyboard_check(vk_right)=true
    20. instance[zahl]=instance_create(obj_player.x,obj_player.y,object7);
    21. if keyboard_check(vk_right)=true
    22. instance[zahl].hspeed=2;
    23. zahl +=1;
    24. }
    Alles anzeigen


    Ich weiß... man hätte beide instance_zeilen auch mit && verbinden können. Das ist mein alter, unmodischer Stil :D

    Danke euch für die Hilfe...
    Was man mit Händen baut, kann auch mit Händen zerstört werden...

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von magic_hero ()

  • Aber später nich vergessen die instancen zu löschen ^^
    Durch den Array kannste so auch auf jede einzelne Instance zugreifen.
    Aber WA's code dürfte auch gehen also auch ohne array dann kannste sie aber net ansteuern, brauchst dann aber kein array machen.
    Musst du eindscheiden.
    Ich habs gerade mit den Array wegen mein Mapeditor XD
    Face in the wind, we're riding the storm
    We'll stay our course whatever will come
    ~~ Stay (Running) Wild ~~
  • Original von magic_hero

    GML-Quellcode

    1. {
    2. var zahl;
    3. zahl=1;
    4. if keyboard_check(vk_up)=true
    5. instance[zahl]=instance_create(obj_player.x,obj_player.y,object7);
    6. if keyboard_check(vk_up)=true
    7. instance[zahl].vspeed=-2;
    8. zahl +=1;
    9. if keyboard_check(vk_down)=true
    10. instance[zahl]=instance_create(obj_player.x,obj_player.y,object7);
    11. if keyboard_check(vk_down)=true
    12. instance[zahl].vspeed=2;
    13. zahl +=1;
    14. if keyboard_check(vk_left)=true
    15. instance[zahl]=instance_create(obj_player.x,obj_player.y,object7);
    16. if keyboard_check(vk_left)=true
    17. instance[zahl].hspeed=-2;
    18. zahl +=1;
    19. if keyboard_check(vk_right)=true
    20. instance[zahl]=instance_create(obj_player.x,obj_player.y,object7);
    21. if keyboard_check(vk_right)=true
    22. instance[zahl].hspeed=2;
    23. zahl +=1;
    24. }
    Alles anzeigen


    Jungs, wenn mein Programmier Professor tod währe würde er sich im Grab umdrehen.

    GML-Quellcode

    1. //Jedes Array beginnt bei 0, egal was ihr mal gelernt habt. Wenn ihr
    2. //bei 1 Beginnt wird trotzdem der Platz für 0 Allociert, das heißt ihr verbratet
    3. //unnötig speicher. Davon abgesehen, nachdem ihr die Objektinstanten nie
    4. //wieder brauche werdet ist es echt unnötig sie abzuspeichern....
    5. var zahl;
    6. zahl=0;
    7. //Die == ist sauberer, ihr werdes merken falls ihr jemals C programmiert
    8. //Wenn ihr = statt == bei C benutzt wird der Variable davor der Wert zugewiesen.
    9. //Da diese Aktion immer ausführbar ist, bekommt man immer True zurück.
    10. //Bei Funktionen hingegen einfach eine Fehlermeldung des Compilers
    11. if (keyboard_check(vk_up)==true)
    12. {
    13. //Wozu ein und die selbe Funktion 2 mal aufrufen, wenn man den Code auch
    14. //in einem Block lösen kann?
    15. instance=instance_create(obj_player.x,obj_player.y,object7);
    16. instance.vspeed=-2;
    17. }
    18. else
    19. //Weiter im Kontext. Ich geh davon aus das der spieler nicht gleichzeitig in 2
    20. //Richtungen schießen soll. Deshalb sollte ein Else dafür sorgen das nur
    21. //EINE Kugel loßfliegt
    22. if (keyboard_check(vk_down)==true)
    23. {
    24. instance=instance_create(obj_player.x,obj_player.y,object7);
    25. instance.vspeed=2;
    26. }
    27. else
    28. if (keyboard_check(vk_left)==true)
    29. {
    30. instance=instance_create(obj_player.x,obj_player.y,object7);
    31. instance.hspeed=2;
    32. }
    33. else
    34. if (keyboard_check(vk_right)==true)
    35. {
    36. instance=instance_create(obj_player.x,obj_player.y,object7);
    37. instance.hspeed=-2;
    38. }
    Alles anzeigen


    Und jetzt noch die Version für ganz Gewiffte. Ich geh davon aus das diese Funktion nur aufgerufen wird wenn geschossen wird.

    GML-Quellcode

    1. //Ganz am Anfang wird die Instance erstellt.
    2. instance=instance_create(obj_player.x,obj_player.y,object7);
    3. if (keyboard_check(vk_up))
    4. {
    5. instance.vspeed = -2;
    6. }
    7. else
    8. if (keyboard_check(vk_down))
    9. {
    10. instance.vspeed = 2;
    11. }
    12. if (keyboard_check(vk_left))
    13. {
    14. instance.hspeed = -2;
    15. }
    16. else
    17. if (keyboard_check(vk_right))
    18. {
    19. instance.hspeed = 2;
    20. }
    Alles anzeigen


    Wenn man jetzt links und oben drückt fliegt die Kugel schrägt. Wenn das nicht der fall sein sollte einfach noch ein else einfügen.
    ...

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

  • Danke Shoba für den kleinen Exkurs...

    Allerdings hat die Figur auch schon vorher in die entsprechende Richtung geschossen. Habe dennoch deinen Code genommen.

    Mir geht es aber darum, das die Figur auch schiesst, wenn sie nur steht. Und zwar in die Richtung in der sie gerade schaut...

    Läuft sie nach links und bleibt links stehen, so soll auch der Schuss nach links gehen.
    Was man mit Händen baut, kann auch mit Händen zerstört werden...
  • Schon klar das der Code vorher auch funktioniert hat. Mir gehts nur darum, wenn ihr GML wirklich lernen wollt, das ihr auch die Feinheiten mitbekommt. Wenn ein projekt wie meins z.b. bereits an die 100 Script dateien hat, von denen pro Step ca 20 immer ausgeführt werden (Tag Nacht Wechsel, imput kontrolle, Feind Kontrolle, etc) ist es wichtig das der Source optimiert wird, sonst wird das Spiel früher oder später unspielbar langsam.

    Wenn man jetzt ein und die Selbe Funktion mit den selben Parametern aufruft, verschwendet das unnötige Rechenzeit. Bei einer Scriptsprache wie GML ist das sogar noch schlimmer als bei Compilierten Sourcecode, da Scriptsprachen zur laufzeit interpretiert werden, und damit schon um einiges langsamer als etwas Compiliertes ist.
    ...
  • Original von Shoba
    Schon klar das der Code vorher auch funktioniert hat. Mir gehts nur darum, wenn ihr GML wirklich lernen wollt, das ihr auch die Feinheiten mitbekommt. Wenn ein projekt wie meins z.b. bereits an die 100 Script dateien hat, von denen pro Step ca 20 immer ausgeführt werden (Tag Nacht Wechsel, imput kontrolle, Feind Kontrolle, etc) ist es wichtig das der Source optimiert wird, sonst wird das Spiel früher oder später unspielbar langsam.

    Wenn man jetzt ein und die Selbe Funktion mit den selben Parametern aufruft, verschwendet das unnötige Rechenzeit. Bei einer Scriptsprache wie GML ist das sogar noch schlimmer als bei Compilierten Sourcecode, da Scriptsprachen zur laufzeit interpretiert werden, und damit schon um einiges langsamer als etwas Compiliertes ist.


    Ja und wie mache ich das nun mit dem Schuss während des Stehens?

    Wie prüfe ich also, in welche Richtung der Spieler schaut?
    Was man mit Händen baut, kann auch mit Händen zerstört werden...
  • Probiers ganz anders. Du macht im create event eine Variable für die Horizontale ausrichtung und für die Vertikale ausrichtung.

    Create Event

    GML-Quellcode

    1. {
    2. var HorDirection; //Horizontale ausrichtung
    3. var VerDirection; //Vertikale ausrichtung
    4. }

    Step Event

    GML-Quellcode

    1. {
    2. if (keyboard_check(vk_up))
    3. {
    4. VerDirection = -1;
    5. vspeed -= 2;
    6. }
    7. else
    8. if (keyboard_check(vk_down))
    9. {
    10. VerDirection = 1;
    11. vspeed = 2;
    12. }
    13. else
    14. {
    15. vspeed = 0;
    16. }
    17. if (keyboard_check(vk_left))
    18. {
    19. HorDirection = -1;
    20. hspeed -= 2;
    21. }
    22. else
    23. if (keyboard_check(vk_right))
    24. {
    25. HorDirection = 1;
    26. hspeed = 2;
    27. }
    28. else
    29. {
    30. hspeed = 0;
    31. }
    32. }
    Alles anzeigen

    Die Funktion oben handelt das Movement. Die Figur bleibt stehen, sobald die Richtungstasten losläßt, aber die Variablen HorDirection und VerDirection bleiben erhalten.


    Event bei Schuß

    GML-Quellcode

    1. {
    2. instance=instance_create(obj_player.x,obj_player.y,object7);
    3. instance.vspeed = HorDirection * 2;
    4. instance.hspeed = VerDirecton * 2;
    5. }


    Der Schuß wird jetzt einfach in die Letzte bekannte richtung abgegeben. Beim Create Event kannst du noch eine Startrichtung eingeben, damit er beim start des Spiels nicht irgendwohin ballert.
    ...
  • Original von Shoba
    Probiers ganz anders. Du macht im create event eine Variable für die Horizontale ausrichtung und für die Vertikale ausrichtung.

    Create Event

    GML-Quellcode

    1. {
    2. var HorDirection; //Horizontale ausrichtung
    3. var VerDirection; //Vertikale ausrichtung
    4. }

    Step Event

    GML-Quellcode

    1. {
    2. if (keyboard_check(vk_up))
    3. {
    4. VerDirection = -1;
    5. vspeed -= 2;
    6. }
    7. else
    8. if (keyboard_check(vk_down))
    9. {
    10. VerDirection = 1;
    11. vspeed = 2;
    12. }
    13. else
    14. {
    15. vspeed = 0;
    16. }
    17. if (keyboard_check(vk_left))
    18. {
    19. HorDirection = -1;
    20. hspeed -= 2;
    21. }
    22. else
    23. if (keyboard_check(vk_right))
    24. {
    25. HorDirection = 1;
    26. hspeed = 2;
    27. }
    28. else
    29. {
    30. hspeed = 0;
    31. }
    32. }
    Alles anzeigen

    Die Funktion oben handelt das Movement. Die Figur bleibt stehen, sobald die Richtungstasten losläßt, aber die Variablen HorDirection und VerDirection bleiben erhalten.


    Event bei Schuß

    GML-Quellcode

    1. {
    2. instance=instance_create(obj_player.x,obj_player.y,object7);
    3. instance.vspeed = HorDirection * 2;
    4. instance.hspeed = VerDirecton * 2;
    5. }


    Der Schuß wird jetzt einfach in die Letzte bekannte richtung abgegeben. Beim Create Event kannst du noch eine Startrichtung eingeben, damit er beim start des Spiels nicht irgendwohin ballert.



    Netter Code, aber er sagt mir, obwohl alle Codes im gleichen Objekt (player) das bekannte Problem mit der Variable, das diese nicht erkannt wurde (Unknow Variable HorDirection).
    Was man mit Händen baut, kann auch mit Händen zerstört werden...
  • EDIT: Habe den Fehler eben beim zitieren gelesen.
    Da steht ja nur HorDirecton :D

    Nun schiesst der Player zwar auch beim Stehen, aber nur schräg... und das auch beim Laufen... es ist zum verzweifeln :no:



    Original von Shoba
    Ersetz "var HorDirection;" durch "HorDirection = 0", das selbe gilt auch für die Vertikalvariablen.


    Im CreateEvent:

    GML-Quellcode

    1. {
    2. HorDirection=0
    3. VerDirection=0
    4. }


    Im Step-Event:

    GML-Quellcode

    1. {
    2. if (keyboard_check(vk_up))
    3. { VerDirection = -1; vspeed -= 2; }
    4. else
    5. if (keyboard_check(vk_down))
    6. { VerDirection = 1; vspeed = 2; }
    7. else { vspeed = 0; }
    8. if (keyboard_check(vk_left))
    9. { HorDirection = -1; hspeed -= 2; }
    10. else
    11. if (keyboard_check(vk_right))
    12. { HorDirection = 1; hspeed = 2; }
    13. else
    14. { hspeed = 0; }
    15. }
    Alles anzeigen


    Im "press-Space"-Event:

    GML-Quellcode

    1. {
    2. instance=instance_create(obj_player.x,obj_player.y,object7);
    3. instance.vspeed = VerDirection * 2;
    4. instance.hspeed = HorDirecton * 2;
    5. }


    Wieder unknow variable HorDirection.

    Liegt das evtl. am press-Space event? muß ich vielleicht nur ein Space-Event erstellen?
    Was man mit Händen baut, kann auch mit Händen zerstört werden...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von magic_hero ()

  • Jaja, der logische Fehler mit dem Schräg schießen is mir auch gerade aufgefallen. Probier mal folgendes:

    GML-Quellcode

    1. {
    2. BinCheck = 0;
    3. if(keyboard_check(vk_up)) BinCheck += 1;
    4. if(keyboard_check(vk_right)) BinCheck += 2;
    5. if(keyboard_check(vk_down)) BinCheck += 4;
    6. if(keyboard_check(vk_left)) BinCheck += 8;
    7. switch(BinCheck)
    8. {
    9. case 1: //oben
    10. HorDirection = 0;
    11. VerDirection = -1;
    12. break;
    13. case 2: //rechts
    14. HorDirection = 1;
    15. VerDirection = 0;
    16. break;
    17. case 3: //Oben rechts
    18. HorDirection = 1;
    19. VerDirection = -1;
    20. break;
    21. case 4: //unten
    22. HorDirection = 0;
    23. VerDirection = 1;
    24. break;
    25. case 6: //rechts unten
    26. HorDirection =1;
    27. VerDirection = 1;
    28. break;
    29. case 8: //links
    30. HorDirection = -1;
    31. VerDirection = 0;
    32. break;
    33. case 9: //links oben
    34. HorDirection = -1;
    35. VerDirection = -1;
    36. break;
    37. case 12: //links unten
    38. HorDirection = -1;
    39. VerDirection = 1;
    40. break;
    41. default:
    42. break;
    43. }
    44. if(BinCheck == 0)
    45. {
    46. hspeed = HorDirection * 2;
    47. vspeed = HorDirection * 2;
    48. }
    49. }
    Alles anzeigen
    ...
  • Es ist aber auch wichtig das du verstehst was da genau abgeht.

    Die Zahlen 1,2,4,8 haben eine gemeinsamkeit. Es sind alles 2er potenzen.

    2 hoch 0 = 1
    2 hoch 1 = 2
    2 hoch 2 = 4
    etc....

    Wenn man das ganze binär darstellt

    00000001 = 1
    00000010 = 2
    00000100 = 4
    00001000 = 8

    fällt einem auf das die 1 jedesmal an einer anderen stelle ist. Wenn man die zahlen nun addiert werden die Informationen der Vorherigen zahl nicht gelöscht. Ergo ist jeder addierte wert einzigartig.

    Wenn GML Binäre opertionen unterstürzen würde wie z.b. Binäres verodern (nicht zu verwechseln mit dem logischen oder "||") könnte man solche operation viel schneller ausführen anstatt es umständlich mit + zu machen.
    ...
  • Original von Shoba
    Es ist aber auch wichtig das du verstehst was da genau abgeht.

    Die Zahlen 1,2,4,8 haben eine gemeinsamkeit. Es sind alles 2er potenzen.

    2 hoch 0 = 1
    2 hoch 1 = 2
    2 hoch 2 = 4
    etc....

    Wenn man das ganze binär darstellt

    00000001 = 1
    00000010 = 2
    00000100 = 4
    00001000 = 8

    fällt einem auf das die 1 jedesmal an einer anderen stelle ist. Wenn man die zahlen nun addiert werden die Informationen der Vorherigen zahl nicht gelöscht. Ergo ist jeder addierte wert einzigartig.

    Wenn GML Binäre opertionen unterstürzen würde wie z.b. Binäres verodern (nicht zu verwechseln mit dem logischen oder "||") könnte man solche operation viel schneller ausführen anstatt es umständlich mit + zu machen.


    Danke für die Erklärung. Habe zu C64 Zeiten in Assembler programmiert und ein wenig in C... natürlich Basic auch.

    Grundlagen sind also noch da. Aber man vergisst schnell wieder, wenn man zu den wichtigsten Hobbys Kinder und die Frau zählt.... und wenig Zeit für anderes hat.
    Was man mit Händen baut, kann auch mit Händen zerstört werden...