Ergebnis 1 bis 11 von 11

Thema: Items ordnen!

  1. #1

    Items ordnen!

    Guten Abend Community!

    Maker: Rm2k
    Probelm mit dem automatischen Anordnen von Items anhand von Pic in einem CMS.


    Ich bin dabei ein eigenes Menü zu erstellen und eigentlich schon recht weit.
    Bis auf das Ausrüstungsmenü und das Itemsortiment habe ich schon alles geschafft.

    Doch genau bei diesen beiden Punkten grübel ich schon seit geraumer Zeit.
    Es geht vor allem darum, die Items sortieren zu lassen.
    Damit meine ich etwa nicht, einen Knopf worauf alle Items sortiert werden sollen,
    sondern, dass wenn man ein Item findet nicht einen fixen Platz zugewiesen bekommt.
    Das heißt, wenn man ein Item findet, sollte kein Platz zwischen den Items sein.
    Ich hoffe, ich konnte mich halbwegs verständlich ausdrücken ^^

    Beispiel:
    Der Hero findet das Item A.
    Ist noch kein Platz besetzt muss es natürlich an den ersten Platz gesetzt werden.
    Der Hero findet Item C.
    Jetzt soll es aber nicht auf den dritten Platz gesetzt werden, sondern auf den 2.


    Durch dieses Beispiel wird hoffentlich klar was ich will.
    Wird ein Item aufgebraucht, müssen die anderen natürlich nachrutschen.
    Das ganze soll übrigens mit Pictures dargestellt werden.

    Hier ein Screenshot meines Menüs:



    Wie man erkennen kann, sollen immer 6 Items gleichzeitig angezeigt werden.
    Wenn man jetzt beim sechsten Item wäre und 1 runtegeht müsste das 1 Bild
    gelöscht werden und abgefragt werden ob eines exestiert das sich darunter befindet.


    Das Problem ist jetzt, das ich leider nicht weiß wie ich das mache.
    Nicht, dass ich gar keine Vorstellung habe wie es gehen könnte,
    aber schaffen tu ichs trotzdem nicht.

    Ich freue mich über jegliche Tipps die ihr mir schreibt.
    Es wäre mir natürlich schon lieber, wenns ein bisschen ausführlicher wäre.


    ~Waradience~

  2. #2
    hhmmm......
    Du könntest ein paar Ereignisse erstellen. Sagen wir 7. Jedes dieser Ereignisse soll jedes deiner items beinhalten. Für jedes Item eine neue Seite. Die Variabeln benutzt du für die Anzahl des weweiligen Gegenstandes. Mit Tab 1 und der Variable kannste schon mal dein erstes Pic für das item erscheinen lassen. Mit Tab 2 verhinderst du, dass die anderen Ereignisse dat selbe machen wie Ereignis 1. Nun musst du mit einem neuen Ereignis (Ereignis 8) verbieten, dass Ereignis 1 jemals für andere items verwendet werden soll. (solltest du das Item überhaupt nicht mehr haben, könnte man das Bild des Items da hängen lassen, nur wenn man es anklickt, sollte da stehen, dass du null von X Item hast........)
    ....wooow also jetzt komm ich selber nit mehr richtig mit.....
    Ich weiß nicht ob das funktionieren wird und ob mein Text überhaupt verständlich ist ........solltest du das überhaupt nicht verstehen und sollten keine anderen Tipps kommen, dann bin ich bereit ein kleines Skript anzufertigen. (ich versuchs^^). ääähhhhh.....übrigens >>Ich weiß, dieser Gedanke ist ziemlich grob. Und noch was.....sry schon mal für die Rechtschreibfehler die ich gemacht haben könnte.

  3. #3
    Hum, die Methode mit dem Switchen halte ich für etwas unflexibel. Ich empfehle dir auf etwas andere Mittel zu wechseln:

    - Lege eine Reichweite von Variablen fest, je nachdem wie groß das Inventar sein soll, z.B. die Variablen 0030 - 0060 sind nun unsere Inventarslot. Damit ist
    das Inventar 30 Felder groß

    Nun brauchen wir 3 Module die uns die Funktion ermöglichen. Diese sind noch nicht mal groß und sogar recht ähnlich aufgebaut. Sie heissen:
    Inventar_Show, Inventar_Del und Inventar_Insert.

    Wir geben im übrigen davon aus das jedes Gegenstand eine eigene ID(Idenfikationsnummer) hat. So lässt es sich eindeutig identifizieren.
    Wissen über Pointer ist unerlässlich für diese Aufgabe.
    Schau dir vielleicht mal das hier mal an. Eventuell hilft es dir.

    Die drei Funktionen dürften vom Namen her für sich sprechen. Aufgebaut sind sie in etwa so:

    Inventar_Insert:
    Dieses Modul dient dazu Gegenstände in unser Inventar einzufügen. Es braucht hierfür einen sogenannten "Parameter". Dieser Parameter ist die ID des Gegenstandes das wir einfügen wollen.

    Code:
    [Common Event: Inventar_Insert - Call]
    
    Set [0061:Pointer] = 30; // Der Beginn unseres Inventarfeldes war 0030 !
    
    LABEL 1
    IF [0061:Pointer] > 60 THEN //Das Ende unseres Inventarfeldes war 0060 !
      End Event Processing;
    ELSE // Es ist noch Platz im Inventar
    Set [0062:Vergleichsvari] = [[0061:Pointer]];
      IF [0062:Vergleichsvari] == 0 THEN // Die Variable ist leer und benutzbar
        Set [[0061:Pointer]] = [0063:Parameter_Insert];
        End Event Processing;
      ELSE //die Variable ist belegt !
         [0061:Pointer] = [0061:Pointer] + 1;
         Jump to LABEL 1;
      ENDIF
    ENDIF
    Diese Funktion muss so aufgerufen werden:

    Code:
    Set [0063:Parameter_Insert] = GegenstandID(z.B. 10);
    Call Event: Inventar_Insert
    Der Pointer am Anfang wird nun auf den Wert 30 gestellt.
    Direkt danach geht eine Schleife mit folgender Funktion los:

    Sie fragt ab ob der Pointer größer als 60 ist. Wenn er das ist, dann sind außerhalb der Reichweite unseres Inventars. Die war ja von 30 - 60.
    In diesem Fall bricht die Funktion ab und fügt die ItemID nicht ein.

    Falls wir noch nicht außerhalb unseres Inventars sein sollten, dann wird der angepointerte Wert in eine Variable übergeben. Das ist nötig da man im Maker leider nicht direkt gepointerte Variablen in einem Fork abfragen kann. :/
    Sollte die abgefragte Variable auf 0 sein, dann ist sie leer und wir können sie benutzen. Wenn das der Fall ist, dann wird die Item-ID an der aktuellen Variable eingefügt und die Funktion wird beendet.

    Falls die Variable nicht gleich 0 sein sollte und damit voll, wird zurück zum Sprungpunkt/Label 1 gesprungen und von da aus der Code nochmals wiederholt. Vor dem Sprung wird der Pointer um eine Variable weitergesetzt.


    PS:

    Für die restlichen Funktionen hab ich grad keine Zeit mehr. Aber erstmal sollten wir sowieso diese hier mal umsetzen. Das könnte anfangs etwas nach fachlatein aussehen, ich hoffe aber es dir trotzdem erklären zu können.
    Das ist so auf jeden Fall eine recht einfache Geschichte.
    Auch wenn es grad nicht danach aussieht.

  4. #4
    die methode von makenshi ist ganz gut...
    jedoch hat sie folgende schwachpunkte:
    - das herauslesen der itemanzahl wird etwas aufwendiger...
    um das zu entgehen, würde ich gleichzeitig mit einen pointer die itemanzahlen
    parallel beim item-insert prozess einfügen: (von 90- 120 leg ich mal die variablen fest in denen die anzahl gespeichert werden...)


    [Common Event: Inventar_Insert - Call]

    Set [0061:Pointer] = 30; // Der Beginn unseres Inventarfeldes war 0030 !
    set [0062ointer2] = 90

    LABEL 1
    IF [0061:Pointer] > 60 THEN //Das Ende unseres Inventarfeldes war 0060 !
    End Event Processing;
    ELSE // Es ist noch Platz im Inventar
    Set [0062:Vergleichsvari] = [[0061:Pointer]];
    IF [0062:Vergleichsvari] == 0 THEN // Die Variable ist leer und benutzbar
    Set [[0061:Pointer]] = [0063:Parameter_Insert];
    Set [[0062ointer2]]=[0064nzahl des hinzugefügten items]
    End Event Processing;
    ELSE //die Variable ist belegt !
    [0061:Pointer] = [0061:Pointer] + 1;
    [0062:Pointer2] = [0062:Pointer2] + 1;
    Jump to LABEL 1;
    ENDIF
    ENDIF

    soooo.. jetzt brauch man natürlich neben der vari 0063 parameter_insert
    noch die variable 0064, die die anzahl des hinzugefügten items beeinhaltet...
    also wird der code so hinzugefügt:

    Set [0063:Parameter_Insert] = GegenstandID(z.B. 10);
    set [0064nzahl des hinzugefügten items] = itemanzahl.. zb 3 stück...
    Call Event: Inventar_Insert



    so... jetzt zum anderen schwachpunkt... wie man von dem code ablesen kann, werden die items ja in chronologischer reihenfolge angezeigt... dh. wenn item c und dann item a eingesammelt wurden, dann werden sie im itemmenü auch in der reihenfolge angezeigt...
    jedoch würde bei makenshi, in dem falle man fände noch ein item a, dieses sepperat angezeigt... also c, a, a... was meistens nicht erwünscht wird...
    man muss also in dem falle zusätzlich abfragen, ob die gegenstands ID die in parameter_insert gespeichert wird, bereits vorhanden ist, und in diesem falle einfach die itemanzahl dieses slots erhöhen um die gewünschte zahl...
    würde also so aussehen:

    Common Event: Inventar_Insert - Call]

    Set [0061:Pointer] = 30; // Der Beginn unseres Inventarfeldes war 0030 !
    set [0062ointer2] = 90

    LABEL 1
    IF [0061:Pointer] > 60 THEN //Das Ende unseres Inventarfeldes war 0060 !
    End Event Processing;
    ELSE // Es ist noch Platz im Inventar
    Set [0062:Vergleichsvari] = [[0061:Pointer]];
    IF [0062:Vergleichsvari] == 0 THEN // Die Variable ist leer und benutzbar
    Set [[0061: Pointer]] = [0063: Parameter_Insert];
    Set [[0062: pointer2]]=[0064: Anzahl des hinzugefügten items]
    End Event Processing;
    ELSE //hier muss überprüft werden, ob die ID schon vorhanden ist
    IF [0062:Vergleichsvari] == [0063:Parameter_Insert] THEN
    (Set [[0061:Pointer]] = [0063:Parameter_Insert]; ) //(kann weggelassen werden...)
    Set [[0062ointer2]]=[[0062ointer2]]+[0064nzahl des hinzugefügten items]
    End Event Processing;
    ELSE //die Variable ist belegt !
    [0061: Pointer] = [0061: Pointer] + 1;
    [0062: Pointer2] = [0062: Pointer2] + 1;
    Jump to LABEL 1;
    ENDIF
    ENDIF

    sooo... das wäre das...^^

    um mal eines vorwegzu nehmen... es ist einfacher die items in ner festen reihenfolge anzuzeigen, d.h. NICHT chronologisch... (aber immernoch OHNE die lästigen leerstellen) also wenn man zuerst item c und dann item a findet, dann wird im menü trotzdem A zuerst und dann C angezeigt...
    das hat den vorteil, dass man nicht bei der itemaufnahme das callevent durchlaufen muss, sondern nur, wenn man ins itemmenü reinkommt, und zweitens kann man das mit dem items-bekomm zeugs (also items werden im maker weiterhin mit Add item hinzugefügt) beibehalten...
    und drittens fällt es den wenigsten auf, dass diese items chronologisch angezeigt werden.. oder es stört niemanden, wenn diese nicht chronologisch angezeigt werden...

    so nen chronologisches item anzeigs dingens hab ich schonmal gemakert:
    http://rs11.rapidshare.com/files/222...e_ueHseins.rar

    Geändert von übelster Held (03.05.2007 um 15:33 Uhr)

  5. #5
    Die Methode war noch nicht fertig üH.
    Da gehörte eigentlich noch eine Sortiermethode dran die auch einen festen Abbruchpunkt für die Insertfunktion liefert. Die hätte solche simplen Aufgaben ohne Probleme lösen können.

    Es geht ja erstmal um das Verständnis von diesem eher simplen Prinzip.
    Zur Itemzahl sollte an sich einfach eine Nummer an die ID angehängt werden.
    Eine ganze Variable extra dafür zu nehmen halte ich persönlich für Verschwendung.

    PS:

    Nächstes mal mit CODE-Tag. So wird das etwas schlecht lesbar.

    Geändert von makenshi (03.05.2007 um 17:53 Uhr)

  6. #6
    Ok, mal danke.
    Icih würde mir gern das Script anschauen, aber bei Rapidshare hab ich immer
    so meine Probleme.
    Könntest du es bitte wo anders hochladen -> http://npshare.de/

    Mit Pointern hab ich mich noch nicht so viel beschäftigt, aber ich hoffe dass
    ichs verstehen werde ^^
    Bis jetzt scheint mir das aber zeimlich kompliziert zu sein,
    wenns nützlich ist wie es zu sein scheint, will ich es mir aber unbedingt aneignen.

    Danke mal für Hilfe.
    Ich hoffe, dass du(üh) das Script wo anders hochladen könntest.

  7. #7
    http://npshare.de//files/35/9826/itemmenue_ueHseins.rar

    is natürlich nich so ganz optimal, wenn du mit pointern noch nicht so viel rumgepointert hast.. >_> *auf makenshis post verweiß*

  8. #8
    Nochmal danke.
    Ich habs jetzt und seh schon, dass es ein bisschen dauern wird bis ich das geschnallte habe.
    Sobald ich auf Probleme stoße wo ich mich nicht raussehe, werde ich hier wieder
    reinposten. Bis dahin könnte es schon dauern.

    ~Waradience~

  9. #9
    So, hab leider wenig Zeit gehabt um was auszupobieren.
    Ich muss auch zugeben, dass ich das ganze mit Pointern noch nicht
    so ganz verstehe.
    Da ich die folgende Woche aber noch viel mit der
    Schule zu tun hab werd ichs erstmal lassen.

    Eine Frage hätte ich da trotzdem:
    Ist das beim 2k3 (v1.08 by Advocate) ein Übersetzungsfehler.

    Denn eigentlich wird dabei überprüft ob die beiden Variablen gleich sind.

    ~Waradience~

    Sry für Doppelpost

  10. #10
    Das ist schon richtig soweit.
    Das hat an der Stelle nur indirekt etwas mit einer Pointerung zutun. Wäre halt eine Pointerung auf diese Variable dort und deren Inhalt. Darum hat Advocate wahrscheinlich diesen Begriff dort benutzt.

    @Pointer

    Ich kann gerne versuchen dir das erlernen von diesen zu erleichtern. Durch ein Beispielprojekt und etwas Messengerkontakt eventuell. Meld dich halt einfach mal bei mir wenn du magst.

    Geändert von makenshi (11.05.2007 um 19:52 Uhr)

  11. #11
    Das wäre toll, wenn du mir so helfen könntest!
    Schau mal in deinem PN Kasten nach ^^

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •