inventar_problem

  • GM 8

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

  • inventar_problem

    hallo leute.
    Ich brauche mal bitte noch mal Hilfe.
    Und Zwar,...
    Brauche ich für mein Projekt ein Inventar . Dazu habe ich mir auch schon viele Tutorials und Hilfen angeschaut.
    Doch leider bekomme ich trotzdem es nicht hin.
    Weil in allen was ich gesehen habe " das Sprite " oder "das Item Index " ins Inventar verschoben wurde,..aber leider nicht das eigentliche Item selber!
    Aber das genau brauche ich.

    Ich habe ein OBj_control. Das , dass Inventar erschafft und dann mehere Obj_ Waffen_art erzeugt. Diese sollen automatisch ins Inventar auf leere Plätze wandern.

    Wie mache ich das?

    Gruß,neogeo
  • Das kommt drauf an, wie du dein Inventar gemacht hast.

    Falls dein Inventar auf einer ds_map aufbaut, dann brauchst du nur die Map mit den indexen von obj_waffena_art befüllen, wenn sie created werden.
    Falls du eine eigene item_id für alles was in einem Inventar abgelegt werden kann hast, dann brauchst du nur die item_id eintragen, anstatt überhaupt ein object zu erstellen.

    Es hängt komplett davon ab, wie du bis jetzt dein Inventar gelöst hast, eine Standardlösung können wir dir dh nicht bieten.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • ich nutze keine ds_map oder ähnliches. Weil ich damit noch nicht klar komme.

    momentan Ich lasse einfach " Inventar " Zellen Sprites
    12 in horizontal und 5 in vertikaler richtung zeichen.

    GML-Quellcode

    1. inv_hori=12; // zellen in Horizontal
    2. inv_vert=5; // zellen in Vertikal
    3. inv_posX= 500
    4. inv_posY=500);


    draw_event

    GML-Quellcode

    1. k=0;
    2. for (i=0;i<inv_hori;i+=1) {
    3. for (j=0;j<inv_vert;j+=1) {
    4. draw_sprite(spr_zelle,0,inv_posX+j*80,inv_posY+i*80);
    5. }
    6. }
    7. k+=inv_hori;
    8. }


    ich weiß,.. das ist kein richtiges inventar,....
    anders bekomme ich es erstmal nicht hin.
  • mh, verstehe, dann empfehle ich dir zumindest ein ds_grid zu verwenden.

    Da kannst du mit inventar = ds_grid_create(12,5); dein Inventar erstellen und jedes Object das du im Inventar ablegst, wird in eine Nummer umgewandelt.
    Ist dein Inventar zB 12x32 pixel breit und die maus befindet sich an der 6ten stelle im Inventar bekommst du den Inventarplatz mit folgender Formel:

    GML-Quellcode

    1. inv_x = (mouse_x - x) div 32; //x ist der linkeste Punkt deines Inventars
    2. inv_y = (mouse_y - y) div 32;


    dann kannst du wenn du dein Schwert ablegen willst einfach sagen

    GML-Quellcode

    1. ds_grid_set(inventargrid,inv_x,inv_y,001)//001 wäre in dem Fall der code vom Schwert, kann aber auch die object id oder obj_schwert sein.
    2. with(obj_schwert)
    3. {
    4. instance_destroy();//das schwert object brauchst du jetzt nicht mehr
    5. }


    Wenn du dann ins inventar an die stelle klickst wo das schwert ist und du findest die nummer 001 dort, dann erstellst du ein object schwert.


    Du wirst nicht drumrum kommen, datenstrukturen zu lernen wenn du ein Inventar haben möchtest, also mach es besser gleich mit ds_grids oder ds_maps.
    Ich helfe dir gerne weiter :)

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • naja,... klar ich werde mich schon näher mit befassen werden. Haste recht .
    Aber es soll ja kein richtiges "Inventar sein". Vieleicht habe ich mich da falsch ausgedrückt.

    Im Grunde genommen suche ich nach einer Metode Objecte der Reihe nach zu orden.Und Wenn sie gespawnt werden auf freie Zellen "springen". So das es nur so aussieht als wäre es ein inventar.
  • ok. ich versuche es mal genauer zu erklären.
    Also es gibt im Spiel einen Gegenstand (Waffe). Der jedesmal wenn er gedroppt(gespawnt) wird ,..andere "Stats" (Eigenschaften) aufweißst.

    Der Spieler hat die Möglichkeit während eines Levels mehrere dieser besagten Gegenstände aufzunehmen. (Die anzahl wieviel aufgenommen speichere ich erstmal in einer glo.var )

    Wenn das Level zu Ende ist,.. kommt der Spieler automatisch in einen "Shop" mit wie gesagtem "fakeinventar" .
    Und jetzt lasse ich über ein control_obj. Den gegenstand spawen ,. und das mal der anzahl wie die glo.var. hergibt. Ob sie zusammen gespawnt ,.. oder nacheinander spielt keine rolle.

    nur wiegesagt ich habe keine Ahnung wie ich das machen könnte das sie sich automatisch sich freie Plätze im "fakeinventar" suchen. Es besteht ja die möglichkeit,.. das man ja nach 3 -4 level später noch Gegenstände im inventar hat.
  • Perfekt, das war die Info die ich brauchte. Also du brauchst ein ds_grid das nur einmal am Start des Spiels created wird in deinem Controller Object zum Beispiel. Das musst du dann mit dem wert -1 überall füllen, für leeres inventar.
    Wenn du nun im Shop bist und die Items gespawned werden, dann gehst du mit einer doppelten for schleife das grid durch um nach der nächsten freien Stelle zu suchen und dort dann das item zu spawnen.

    GML-Quellcode

    1. for (inv_y = 0 ; inv_y < inv_h ; inv_y += 1)//inv_h ist die Inventarhöhe
    2. {
    3. for (inv_x = 0 ; inv_x < inv_w ; inv_x += 1)//inv_w ist die inventarbreite
    4. {
    5. if inventar[# inv_x,inv_y] == -1
    6. {
    7. neu = instance_create(inv_x*32,inv_y*32,instance);
    8. neu.attack = 0;
    9. neu.durability = 0; //je nachdem wie du dein Item erstellst
    10. inventar[# inv_x,inv_y] = neu.id;//nun ist der Platz belegt, mit der object id des items.
    11. glo.var -= 1;//ein item weniger
    12. }
    13. }
    14. }//ist das inventar voll passiert nichts
    Alles anzeigen


    Wenn du etwas aus dem Inventar nimmst dann trägst du wieder -1 in das inventar wo die maus war falls das item verschwinden soll oder frei herumbewegt werden soll.

    GML-Quellcode

    1. //bei klick
    2. inv_x = (mouse_x - x) div 32; //x ist der linkeste Punkt deines Inventars
    3. inv_y = (mouse_y - y) div 32;
    4. inventar[# inv_x,inv_y] = -1;

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Hey. Danke erstmal für deine Hilfe.
    Habe es versucht auchgleich in die Tat umzusetzten.

    Aber ich bekomme folgende Fehlermeldung.
    ERROR in
    action number 1
    of Step Event
    for object obj_cont_waffen/wave:

    Error in code at line 9:
    if inventar[inv_x,inv_y] == -1
    ^
    at position 9: Unknown variable inventar or array index out of bounds



    Habe wie folgt den code :
    create

    GML-Quellcode

    1. erschaffe = 0
    2. globalvar inventar;
    3. globalvar inv_w;
    4. globalvar inv_h;
    5. inv_w = 8;
    6. inv_h = 4;
    7. inv_x = 0;
    8. inv_y = 0;
    9. alarm[0]= 2
    Alles anzeigen


    alarm 0

    GML-Quellcode

    1. if erschaffe = 0
    2. {
    3. inventar = ds_grid_create(inv_w,inv_h);
    4. ds_grid_set_region(inventar,0,0,7,7,-1)
    5. alarm[1]= 10
    6. }


    alarm 1

    GML-Quellcode

    1. erschaffe = 1


    step

    GML-Quellcode

    1. if erschaffe = 1
    2. {
    3. for (inv_y = 0 ; inv_y < inv_h ; inv_y += 1)//inv_h ist die Inventarhöhe
    4. {
    5. for (inv_x = 0 ; inv_x < inv_w ; inv_x += 1)//inv_w ist die inventarbreite
    6. {
    7. if inventar[inv_x,inv_y] == -1
    8. {
    9. neu = instance_create(inv_x*32,inv_y*32,obj_weapon_core);
    10. inventar[inv_x,inv_y] = neu.id;//nun ist der Platz belegt, mit der object id des items.
    11. global.front_eingesammelt -= 1;//ein item weniger
    12. }
    13. }
    14. }//ist das inventar voll passiert nichts
    15. }
    Alles anzeigen


    Wo liegt da noch der Fehler?
  • Du musst bei dem Befehl zum setzen oder lesen eines grid datensatzes ein "#" einbauen.

    GML-Quellcode

    1. inventar[# x,y]//statt inventar[x,y]


    dieser befehl ist die kürzere und angenehmere art ds_grid_set(grid,x,y,value) bzw ds_grid_get(grid,x,y,value) zu schreiben. Ohne der Raute denkt GM das du in ein Array schreiben willst, aber Inventar ist ein grid.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • hmmm,.. immer noch ein fehler

    FATAL ERROR in
    action number 1
    of Step Event
    for object obj_cont_waffen/wave:

    COMPILATION ERROR in code action
    Error in code at line 9:
    if inventar[# inv_x,inv_y] == -1
    ^
    at position 18: Unexpected symbol.


    kann es sein das der gm8.1 pro. das nicht liest?
    ich benutze den 8.1 pro
  • Ah ja. diese Syntax ist nur für Studio.
    Bei der älteren Version musst du eine Funktion verwenden:
    ​ds_grid_get(inventar, inv_x,inv_y)
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Hoppala, das hatte ich überlesen.

    Na du wendest das an um abzuspeichern, was im Inventar drinnen ist und was nicht, welches Item herausgenommen wird, etc, es ist wie ein Kasten oder eine Schublade.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)