Verschiedene Upgrades anzeigen

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

  • Verschiedene Upgrades anzeigen

    Hi, ich arbeite momentan an einem Upgrade System für mein Game ...,

    Hierfür habe ich 10 upgrades programmiert, jedes davon hat seine eigene Variable welche auf "False" gesetzt ist. Bspw. Upgrade1 = false usw.

    Ich möchte das nach jedem Level 3 Upgrades zufällig angezeigt werden, dafür habe ich 3 Objekte und einen Cursor erstellt. Die Objekte zeigen zufällig einen Sprite der Upgrades an, ungefähr so:

    sprite_ index = choose(spr_points, spr_hearts, spr_treasure usw.)

    Je nach dem auf welchen Objekt sich der Cursor befindet, man bestätigen drückt und welchen Sprite das Objekt besitzt, ändert sich eine Upgrade Variable auf "True" und das Upgrade wird aktiviert.

    Das ganze funktioniert auch wunderbar und genauso wie ich es mir vorstelle, es gibt nur ein Problem.

    Die Objekte zeigen manchmal auch Sprites von Upgrades an, welche bereits in einem vorherigen Level aktiviert wurden.

    Das möchte ich umgehen, ich hatte bereits selber eine Idee mit verschachtelten if-Statements.

    Wenn ich das aber komplett programmieren würde, dann würde dabei einige 10000 Zeilen Code heraus kommen.

    Da man dabei jede Möglichkeit in betracht ziehen müsste.

    Daher wollte ich fragen ob es da auch eine andere Lösung gibt?
    Schaut mal auf meinen Games vorbei (alle für Android):

    APPLE ISAAC

    JUGGLE JUNKIE

    SKY APE

    Freu mich über Meinungen, Verbesserungsvorschläge und gute Bewertungen!!!
  • Option 1) Nachdem ein Upgrade zufällig ausgewählt wurde, überprüfst du ob es bereits aktiviert ist und wenn ja, dann würfelst du es neu aus, solange bis du eines erwischt was verfügbar ist.
    Sehr einfach zu implementieren, aber nicht unbedingt der schönste Weg. Vor allem je weniger Upgrades verfügbar sind, desto häufiger muss neu gewürfelt werden.

    Option 2) Gib jedem Upgrade eine ID, z.b. einfach Zahlen von 1-10. Erzeuge eine ds_list und fülle sie mit den verfügbaren Upgrade IDs. Um Upgrades zufällig auszusuchen, generierst du einen zufälligen index zwischen 0 und ds_list_size, und nimmst das Upgrade was an dieser Stelle in der Liste hinterlegt ist. Jedes mal wenn der User ein Upgrade wählt, löscht du das Element aus der Liste mit ds_list_delete. Danach sind nur noch verfügbare Upgrades in der Liste.
  • Danke für deine Tipps,

    ich habe das ganze mal ausprobiert, also eine extra Objekt erstellt und darin im Create Event:

    global.AllUpgrades = ds_list_create()

    ds_list_add(global.AllUpgrades,1,2,3,4,5,6,7,8,9,10)

    Dann im Objekt für das Anzeigen der Sprites, Create Event:

    randomize()

    upgrade1 = irandom_range(1,ds_list_size(global.AllUpgrades))

    im Step Event:

    if upgrade1 = 1
    {
    sprite_index = spr_pic1
    }
    else if upgrade1 = 2
    {
    sprite_index = spr_pic2
    }

    usw.

    Bis zu dem Zeitpunkt funktioniert auch alles, was nicht klappt ist das löschen der einzelnen Upgrades:

    ds_list_delete(global.AllUpgrades,1)

    Bspw. mit diesem Code habe ich es probiert, aber die ID wird nicht gelöscht.

    Ach ja, ich habe es auch mal mit ds_list_destroy(global.AllUpgrades) probiert, das geht komischerweise.
    Schaut mal auf meinen Games vorbei (alle für Android):

    APPLE ISAAC

    JUGGLE JUNKIE

    SKY APE

    Freu mich über Meinungen, Verbesserungsvorschläge und gute Bewertungen!!!
  • MisteryJay schrieb:

    Ach ja, ich habe es auch mal mit ds_list_destroy(global.AllUpgrades) probiert, das geht komischerweise.


    ds_list_destroy löscht die ganze Liste. Das willst du auch machen, um den Speicher wieder freizugeben, aber eher im Destroy-event oder am Ende des Spiels, wenn die Liste nicht mehr gebraucht wird.


    MisteryJay schrieb:

    Dann im Objekt für das Anzeigen der Sprites, Create Event:

    randomize()


    randomize() sollte nur ein einziges mal am Anfang des Spiels aufgerufen werden, sonst zerstörst du dir damit deine Zufallsverteilung.


    MisteryJay schrieb:

    upgrade1 = irandom_range(1,ds_list_size(global.AllUpgrades))


    Listen starten mit dem Index 0, nicht 1, d.h. es müsste heißen irandom_range(0, ds_list_size(global.AllUpgrades) - 1), sonst hast du einen out-of-bounds index und dein Programm crasht sobald du versuchst darauf zuzugreifen.
    Nachdem du den index zufällig gewählt hast, musst du noch auslesen um welches Upgrade es sich eigentlich handelt, dann kannst du den Sprite setzen. Anschließend löscht du das Element mit dem gewählten Index.

    GML-Quellcode

    1. var idx = irandom_range(0, ds_list_size(global.AllUpgrades) - 1)
    2. var upgrade_id = ds_list_find_value(global.AllUpgrades, idx)
    3. switch (upgrade_id)
    4. {
    5. case 1:
    6. sprite_index = spr_pic1
    7. break
    8. case 2:
    9. // ...
    10. }
    11. // Wenn der user das Upgrade ausgewählt hat:
    12. ds_list_delete(global.AllUpgrades, idx)
    Alles anzeigen

    Es gibt übrigens keinen Grund die Sprite Auswahl im Step-Event zu machen, da es ja nur einmal ausgeführt werden muss.

    Du kannst dir noch etwas Arbeit sparen, indem du deine Upgrade IDs ebenfalls mit 0 startest und ein Array mit allen Upgrade Sprites erzeugst. Dann kannst du über die Upgrade ID direkt den entsprechenden Sprite zu bekommen.

    GML-Quellcode

    1. sprites = [ spr_pic1, spr_pic2, spr_pic3, ...] // Im Create Event, evtl. auch global
    2. sprite_index = sprites[upgrade_id]