Ingame Sprite wechsel

  • GM 8

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

  • Hallo zusammen.

    Ich verzweifle gerade etwas. Wo schreibe ich das mit dem sprite_index eigentlich rein?
    Ich habe hier zum Beispiel ein Script "set_card" und code in einem Room. Sowie ein objekt mit dem namen cardempty0, das ein Create Event hat, mit einer "draw sprite" Action inkl. einem Sprite.

    Das steht in set_card script drin:

    GML-Quellcode

    1. {
    2. // Setzt Karte
    3. ins_card = instance_create(cardposition[0],cardposition[1],cardempty0);
    4. ins_card.sprite_index = cardtype;
    5. }


    Und dann habe ich in meinem Room unter settings den code der alles steuern soll:

    GML-Quellcode

    1. {
    2. // Set Playercards
    3. cardposition[0] = 240; // xpos
    4. cardposition[1] = 860; // ypos
    5. cardtype = string(spr_card_empty0);
    6. var shift_x = 40;
    7. repeat (11)
    8. {
    9. script_execute(set_card,cardposition,cardtype);
    10. cardposition[0] += shift_x;
    11. }
    12. // Set Opponent Cards
    13. cardposition[0] = 240; // xpos
    14. cardposition[1] = -50; // ypos
    15. shift_x = 40;
    16. cardtype = string(spr_card_backside0);
    17. repeat (11)
    18. {
    19. script_execute(set_card,cardposition,cardtype);
    20. cardposition[0] += shift_x;
    21. }
    22. }
    Alles anzeigen

    Der Code im room soll meine Karten steuern. Der Code set_card nur allgemein Karten zeichnen.
    Ich verzweifle so langsam an der Spriteänderung. Ich hab keine Ahnung, wie ich den Sprite einer Objectinstanz ändere. Steh voll auf dem Schlauch. Ist sicher nur ein grundlegendes Verständnisproblem...

    Ich wäre Euch sehr sehr dankbar für jegliche Hilfe. Bin sehr neu in GML. Hab auch schon vieles durchforsted und alle sprechen vom sprite_index, aber so richtig verstanden hab ich es nicht.

    Danke
    Chris
  • Okay also um es die nochmal verständlicher zu machen

    Wenn du ein Sprite erstellt z.B einen Fussball dann nennst du ihn spr_Fussball dieser name des Sprites ist gleichbedeutend mit dem sprite_index
    Für das Spätere Beispiel erstellen wir zudem noch ein Sprite mit dem Namen spr_Baseball.

    Es existieren jetzt also 2 unterschiedliche Sprite mit 2 unterschiedlichen Bildern

    Die einzelnen Bilder die das Sprite beeinhaltet (z.b Eine Animation) ist der image_index welche das aktuelle Bild zurückgibt
    wobei das erste Bild der index 0 ist und das zweite bild der index 1, usw....

    wenn du nun ein Object erstellst so weist du ihm ein Sprite zu. Andernfalls würdest du nix im Raum sehen!

    Möchtest du jetzt z.b wärend dem Spiel den Ball von einem Fussball auf einen Baseball ändern wenn der Spieler die Leertaste drückt so schreibst du in deinem Code

    GML-Quellcode

    1. if keyboard_check(vk_space)
    2. sprite_index = spr_Baseball
    3. else
    4. sprite_index= spr_Fussball


    Nun wird das Sprite mit diesem Namen dem Object zugewiesen und angezeigt,...

    Ich hoffe du hast es nun verstanden =)

    ----------------------------------------------------------------

    In deinem Fall muss Cardtype ein Sprite sein mit der Karte die du anzeigen möchtest,....
    Oft ist es aber sinnvoller wenn du alle Karten in einem Sprite speicherst und nur über den image_index auf die jeweilige Karte zugreifst,... image_speed = 0 nicht vergessen =)

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

  • Hallo Blayde.

    Vielen Dank für die verständliche Antwort.
    In Deinem Beispiel muss der Code zum Austausch der Bälle im Objekt stehen, richtig? Sonst weiß GM nicht, wo er die Sprites tauschen soll.
    Aber was ist, wenn ich das Sprite eines Objektes in einem Roomcode ändern möchte? Die Anweisung also an anderer Stelle stehen soll.

    Danke noch einmal.

    Zu deinem Vorschlag: Über die Frame-Lösung in einem einzelnen Sprite habe ich auch schon nachgedacht. In erster Linie möchte ich das ganze nicht in den Objekten steuern, sondern mit einem globalen Script. Aber wie es scheint, muss ich hier etwas umdenken. Kann es sein, das ich den Objekten Scripte zuweise, die abfragen, was die Objekte im jeweiligen Fall machen sollen? Sollte man Deiner Ansicht nach nicht alles in einem Code steuern, stattdessen lieber situationsbedingten Code in die Objekte schreiben?
    Ich habe hier jedoch die Befürchtung, das dann die Übersicht etwas flöten geht.

    Best wishes
    Chris

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

  • Wenn du den Spritewechsel in einem Skript haben willst und nicht im Objekt, dann solltest du das script in etwas so ausführen und gestalten:

    GML-Quellcode

    1. //Objekt
    2. sprite_index = scr_set_card()

    GML-Quellcode

    1. ///scr_set_card()
    2. //code
    3. return xyz //<- name des sprites oder Ort wo sich dieses befinden
    4. //zb return cardtype[0] wenn die sprite_indexes in einem array abgespeichert sind

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • OK. Verstehe ich das richtig:
    Das Objekt holt sich mit dem sprite_index Befehl und dem Verweis zu scipt "scr_set_card()" den Wert aus diesem Script.
    Das Script scr_set_card() gibt das gewünschte Sprite mit dem Return an das Objekt zurück.

    Bin gerade nicht am Arbeitsrechner, um das zu checken. Klingt aber plausibel.

    Danke sehr!
    :)
  • genau so kannst das lösen, wenn du das aber nur für ein Objekt brauchst ist es einfacher den Code gleich in das betreffende Objekt hineinzusetzen.

    Wenn du aber 2 Arten von Kartendecks hast zB rot und blau, dann kannst du ein script schreiben, das je nachdem welcher parameter übergeben wird ein anderen wert zurückgibt:

    GML-Quellcode

    1. sprite_index = scr_set_card(farbe);

    GML-Quellcode

    1. pos = ;//ieincode
    2. //...
    3. var index
    4. if argument0 == 0
    5. {
    6. index = rotekarten[pos];
    7. }
    8. if argument0 == 1
    9. {
    10. index = blauekarten[pos];
    11. }
    12. return index
    Alles anzeigen

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Ich habe noch ein kleines Problem.

    Das Return gibt mir immer den Wert 0 raus, wenn ich versuche das Script aus dem Objekt anzusprechen.
    Ich habe schon alles geprüft. Wenn ich mit show_message den Wert anzeige, den ich mit return zurückgeben will, dann ist Dieser im Script noch korrekt.
    Sobald ich den Wert aber ins Objekt übergebe mit: sprite_index = mein_script; dann ist da nur noch "0".

    Eine Idee?

    Hier der Code im script, das den Wert zurückgeben soll. Wie gesagt: show_message zeigt mir bis hier den richtigen Wert an. Sagen wir 5.

    GML-Quellcode

    1. {
    2. // Setzt Karte
    3. ins_card = instance_create(cardposition[0],cardposition[1],obj_card0);
    4. return cardtype; // Das ist eine Variable mit dem sprite_index, die ich an diese Funktion übergebe.
    5. }


    Und hier der Code im object:

    GML-Quellcode

    1. sprite_index = set_card; // Das ist mein Script Name


    Danke Euch.

    [GELÖST]
    Ich habe vergessen meinen Übergabewert in integer umzuwandeln. Deswegen hat sprite_index das auch nicht übernommen.
    Der richtige Code muss also lauten:

    GML-Quellcode

    1. sprite_index = real(set_card);
    (Man kann es auch schon vorher beim übergeben machen. Ich habe das mit dem String übersehen.)

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

  • Benutzer online 1

    1 Besucher