Item Inventar

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Raiden93

Betreff: Item Inventar

BeitragFr, Dez 17, 2010 19:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey,
ich habe mich schon lange gefragt wie ein Item Inventar funktioniert, aber leider fällt mir nicht ein wie ich es Realisieren könnte.
Würde mir da jemand Freundlicherweise auf die Sprünge Helfen?


MFG:
Raiden93/Kevin

Tennisball

BeitragFr, Dez 17, 2010 20:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich kenne den Herr Suchfunktion, der hilft dir gerne: https://www.blitzforum.de/forum/search.php
Einfach "Inventar" eingeben, Enter drücken und schon geht's los!

z.B. zeigt er dir diesen Thread: https://www.blitzforum.de/foru...hp?t=31632

mfg,
Tennisball
 

Sterbendes Lüftlein

BeitragFr, Dez 17, 2010 20:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Text entfernt

Blitzprogger

BeitragSa, Dez 18, 2010 2:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ansonsten kann man ein Inventar auch mit einem Array oder Types realisieren.
zB.:
Code: [AUSKLAPPEN]
Dim Items_im_Inventar (10)

Dann kannst du entweder damit arbeiten, dass jedes Item eine eigene ID hat und jeder der Plätze 0 bis 10 im Array diese ID speichert, oder du könntest es noch einfacher lösen, wenn du einfach im Inventar so viele Slots frei hast, wie es verschiedene Items gibt. Dann könntest du im Array einfach die Menge speichern.
Beispiel:
Code: [AUSKLAPPEN]
Dim Inventar_Slots (10,5)
Dim Inventar_Slots_Menge (10,5)
Const Brot_ID = 2
Inventar_Slots (3,2) = Brot_ID
Inventar_Slots_Menge (3,2) = 100
;Hier hättest du im Slot mit den Koordinaten 3|2 100 Brote

Oder:
Code: [AUSKLAPPEN]
Dim Inventar (10)
Const Brot_ID = 1
Inventar (Brot_ID) = 3
;Hier hättest du jetzt 3 Brote im Inventar


mfg, Blitzprogger
Mein aktuelles Projekt, Irnithal: http://www.blitzforum.de/worklogs/415/

Unfreiwilliger Gewinner des BAC# 115. Wink

Raiden93

BeitragSa, Dez 18, 2010 3:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Das erste währe ja eigentlich zu gebrauchen aber das 2 ist ja eigentlich dann überflüssig da ja jeder sein spiel ausbauen will und später dann plätze fehlen.^^
 

Sterbendes Lüftlein

BeitragSa, Dez 18, 2010 8:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Text entfernt

Ana

BeitragSa, Dez 18, 2010 12:36
Antworten mit Zitat
Benutzer-Profile anzeigen
ich würde es nicht als array machen, das ist mir immer zu undynamisch, es gibt gute möglichkeiten arrays einzusetzen, aber ich denke Types sind meistens einfach und nativer zu verwenden.

Ich hab es bisher so gemacht, das ich jedem Spieler/Gegner/haste nicht gesehen eine variable mit gegeben hab die einen inventargegenstand erfassen kann, die auch als types gespeichert sind. Jeder dieser Types hat dann wiederum eine variable die einen weiteren Types des Inventargegenstands enthält und so eine kette von items sich bilden. Also ungefähr so:
BlitzBasic: [AUSKLAPPEN]
Type Spieler
Field inventar.gegenstand
End Type

Type gegenstand
Field id
Field naechster_gegenstand.gegenstand
End Type


Dann musst du halt noch funktionen schreiben die diese Liste durch gehen können und untersuchen welche gegenstände das sind ect. Das lässt sich wie folgt realisieren

:BlitzBasic: [AUSKLAPPEN]
aktueller_gegenstand = spieler\inventargegnstand
While aktueller_gegenstand\naechster_gegenstand >< Null
aktueller_gegnstand = aktueller_gegenstand\naechster_gegenstand
Wend


Die vorteile sind hiebei:
- Du hast keinen totenspeicher, weil der Spieler eigentlich niemals alle gegenstände gleichzeitig hat
- Wenn du weitere gegenstände hinzufügst musst du nicht die inventar struktur erweitern
- Du kannst die Items sortieren lassen wenn du das möchtest, aber sie sind nicht immer in einer vorgegeben reihenfolge
- es ist einfach schicker Wink

Damit kannst du dann alle gegenstände durchlaufen, und gegeben falls etwas damit tun.

Um das Inventarmenü als solches aufzurufen, verwende ich ähnlich wie totensturm es schon gesagt hat eine Variable, allerdings verwende ich eine für alle menüs und untermenü, da ich bestimmt nicht mehr menus als das interger value haben werde und eigentlich auch keine 2 gleichzeitig offen sein sollten und man somit sicher sein kann das man in einem schritt gleich alle menüs zu machen, wenn man = 0 setzt oder so ähnlich. Außerdem bietet es sich an, jedes unter menü eine 10er Potzen höher im werte bereich zu setzen, da man somit durch 10 teilen kann und dann ein menütiefer ist. Also beispielsweise ist das inventar wert 3 und der unterpunkt nur questgegenstände viellecht 30 und nur kleidung 31. Beide kannst du mit einer ganzzahl division wieder in eine 3 verwandeln und kannst nebenbei auch noch gut erkennen welche menüs aufeinandern aufbauen.
Don't only practice your art,
but force your way into its secrets,
for it and knowledge
can raise human to divine
 

Sterbendes Lüftlein

BeitragSa, Dez 18, 2010 12:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Text entfernt

Raiden93

BeitragSa, Dez 18, 2010 14:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Ana ich versuche dein Tipp mal irgendwie umzusetzen, doch ich versteh noch nicht ganz wie du das meinst.Ich habe eine Tasche.png in der 4*4 =16 Plätze sind.

Ana

BeitragSa, Dez 18, 2010 14:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Da ich gerade bei meinen Schwiegereltern festsitze und mich zu tode langweile versuch ich mal detailreich dir was vor zu proggen, allerdings kann ich das hier nicht kontrollieren, können also kleinere fehler drin sein.

BlitzBasic: [AUSKLAPPEN]
Const ITEM_MAX = 16; Falls du ein maximum für gegenstände haben willst 

Global iventar_image = LoadImage(".\gfx\wieauchimmer.png"); Nehmen wir an, das wäre dein Inventarhintergund und gehen davon aus, das es in 4X4 Spalten angeordnet ist und das die abstände zwischen den plätzen gleich sind

Type Figur

Field x
Field y
;.... und was der sonst noch so kann
Field inventar.item; Hier kann also die Adresse eines Types von typ item gespeichert werden
Field item_anzahl ; Falls du möchtest das du nur 16 plätze hast ist diese Variable sinnvoll, sonst eher nicht
End Type

Type item
Field n.item; N für nächstes item und für schreibfaule ana's, also hier kommt das folge item hinein
Field v.item; V für vorgänger, das spart ein wenig rechenzeit, auch wenn es nicht absolut notwendig ist
Field ID ; Für jeden gegenstand kommt hier eine nummer rein, Essen 1, Schwert 2, singendes Kaninchen 3 usw
Field menge ; Wie viele gegenstände es gibt
Field image ; und wie sie ausssehen sollen.

End Type

Function Item_erstellen.item(image,ID,menge) ; Eine Funktion die ein "ITEM" zurück gibt (.item)
i.item = New item
i\id = id
i\menge = menge
i\image = image
End Function

Function Item_Add_GRUNDGERUEST(f.figur,i.item) ; Hier erstmal der Grundgedanke
If f\inventar = Null Then
f\inventar = i ; Für den falls dass das inventar leer war, wird einfach das erste item in dem field gespeichert
f\item_anzahl = item_anzahl + 1 ; und ein platz wird als vergeben angegeben
Else ; Spannender ist es schon,wenn wir bereits einen oder mehrere items haben
aki.item = f\inventar ; AKI = AKtuellesItem das brauchen wir für unsere while schleife
While aki\n <> Null ; Also solange das item noch einen nachfolger hat
aki = aki\n ; ... wird der nachfolger aki
Wend ; wenn die schleife also terminiert, haben wir das letzte item in der liste in aki gespeichert
aki\n = i ; und unser neues item i, wird nun dran gehängt
i\v = aki ; und der vorgänger von i wird dann das zuvor letzte
EndIf
End Function


Function Item_Add(f.figur,i.item) ; Und nun kommt noch die option dazu, dass wir gegenstände die schon im inventar sind auf die vorhanden addieren
If f\inventar = Null Then
f\inventar = i ; kenn ich ja schon ...
f\item_anzahl = item_anzahl + 1 ; langweilig ....
Else ; kommt da auch noch was neues ...
aki.item = f\inventar ; Achtung!!!
While aki\n <> Null ; Gleich kommt was neues!!!
;--------------Eingefügt------------------------------------------------------
If aki\id = i\id ; Wenn die beiden also vom selben typ sind
If aki\menge + i\menge > 0 Then ; Das macht sinn wenn wir diese funktion auch zum entfernen einiger gegenstände verwenden wollen, also wird hier geschaut ob wir nicht - 3 Brote in der Tasche haben am ende
aki\menge = aki\menge + i\menge ; Also hier falls wir eine positive anzahl angegenständen haben
Return True ; Abbruch der Funktion, es ist ja schon alles getan
ElseIf aki\menge + i\menge = 0 ; Also wenn wir nichts mehr davon im inventar haben
If aki\v <> Null ;Falls es das erste in der Liste ist, hat es ja keinen vorgänger und programmiersprachen fehlt bei nullreferenz ja immer ein wenig die sponanität
aki\v\n = aki\n ; Nun setzen wir den nachfolger von aki's vorgänger auf den Nachfolger von aki, damit aki aus der kette genommen wird
EndIf
If aki\n <> Null ; Analog zu oben, nur halt für nachfolger
aki\n\v = aki\v ; und umgekehrt natürlich auch
EndIf
Delete aki ; nun wo aki seine nachfolge geregelt hat kann es von uns gehen, wie bei alten menschen Wink
Return True
Else
DebugLog "Du versucht gerade eine negative menge zu tragen!" ; in dem fall sollten wir nichts tun, außer ein false zurück geben
Return False
EndIf
EndIf
;Hier wie gewohnt weiter ----------------------------
aki = aki\n
Wend
aki\n = i
i\v = aki\n
Return True ; Die True's geben an, dass wir hier eine gültige inventaroperation gemacht haben, die false das du zu wenig von dem gegenstand hast um soviel abziehen zu können.
EndIf
End Function

;Okay erstmal wieder der Grundgedanke
Function Iventar_draw_Grundgedanke(f.figur,x,y,spalten = 4) ; Zeichnet die gegenstände aus dem Inventar von F ab der stelle x,y, optional kannst du in spalten noch angeben wie viele hinter einander gemalt werden bis eine neue zeile kommt, wenn du nichts einträgst gehen wir von der 4er sache aus
aki.item = f\inventar ;Hey Aki kennen ich schon, schön dich wiederzusehen =)
While aki <> Null ;diesemal gehen wir soweit das wir alle items durch gehen und am ende aki = null sein wird, da wir es nach der schleifen nicht mehr brauchen
DrawImage aki\image,x + ((xount Mod spalten) * ImageWidth(aki\image) * 1.2),y + xount/spalten * ImageHeight(aki\image) * 1.2; Hier wird also gezeichnet, okay eventuell klappt das hier nicht so und man könnte es länger und einfacher schreiben, aber im grunde ist der gedanke bei x und y anfangen, bie x kommt der rest bei der division durch die spalten (also 0 bis spalten - 1) und dann halt der abstand der bilder, bei y wird die gerundete division verwendet um die höhe zu bestimmen
xount = xount + 1 ;xount ist die coole kombination von x und count :D also die anzahl der items "di mia scho packt ham"
Wend
End Function

;und hier noch ein wenig komfortkrams, wie z.b das wir das gerade mit der maus angeklickte item bekommen, hier geh ich davon aus, dass es eine globale variable gibt die jeden schleifen durchlauf = mousehit(1) gesetzt wird, nenn ich mal einfach maus1
Function Iventar_draw.item(f.figur,x,y,spalten = 4) ; Zeichnet die gegenstände aus dem Inventar von F ab der stelle x,y, optional kannst du in spalten noch angeben wie viele hinter einander gemalt werden bis eine neue zeile kommt, wenn du nichts einträgst gehen wir von der 4er sache aus
aki.item = f\inventar
While aki <> Null
AK_x = x + ((xount Mod spalten) * ImageWidth(aki\image) * 1.2) ; Diesmal brauchen wir die aktuelle x,y koordinaten dann öfter also zwischen speicher, imagewidth und so sollte man eh immer mit bedenken nutzen weil sie nicht soooo schnell sind
Ak_y = y + xount/spalten * ImageHeight(aki\image) * 1.2
DrawImage aki\image,AK_x,AK_y; Hier wird also gezeichnet, okay eventuell klappt das hier nicht so und man könnte es länger und einfacher schreiben, aber im grunde ist der gedanke bei x und y anfangen, bie x kommt der rest bei der division durch die spalten (also 0 bis spalten - 1) und dann halt der abstand der bilder, bei y wird die gerundete division verwendet um die höhe zu bestimmen
If maus1; Also wenn geklickt wird dann checken wir das ganze sonst kann man sich das sparen, im gegensatz zu Bmax geht BB nicht daonv aus das wenn man schon eine notwendigkeit nicht stimmt, das der rest gar nicht erst überprüft werden muss
If MouseX() > ak_x And MouseX()< ak_x + ImageWidth(aki\image) And MouseY() > ak_y And MouseY() < Ak_y + ImageHeight(aki\image);Hier schauen wir ob die maus irgendwo auf dem image ist, (das kann man rechen zeit schonender machen, aber ich wollte nicht noch mehr variablen drin haben, aber imagewidth,mousex() usw, müsste man nur einmal berechnen)
return_item.item = aki; falls ja wird aki gespeichert, man könnte es auch gleich zurück geben mit return aber dann würde der rest nicht gezeichnet werden für einen frame, also vermeiden wir das damit es nicht nach flimmern aussieht
EndIf
EndIf
xount = xount + 1 ;xount ist die coole kombination von x und count :D also die anzahl der items "di mia scho packt ham"
Wend
Return Return_item.item ; Falls nichts angeklickt wird also Null sonst halt das item
End Function


wie gesagte konnte es nicht prüfen, aber ich glaube es sollte zumindest den gedanken dahinter klar machen. Vielleicht einfach mal in den Compiler kopieren weil es doch recht unübersichtlich mit den teils sehr langen kommentaren ist
Don't only practice your art,
but force your way into its secrets,
for it and knowledge
can raise human to divine

Raiden93

BeitragSo, Dez 19, 2010 14:07
Antworten mit Zitat
Benutzer-Profile anzeigen
danke der code scheint mir sehr Kompliziert aber ich hoffe ich werde es schon Checken Razz.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group