Item existiert nach dem Erstellen nicht !?
Übersicht

![]() |
TrustBetreff: Item existiert nach dem Erstellen nicht !? |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo nettes Forum!
Eins möchte ich vorne weg sagen, ja ich habe die Forensuche benutz und bin dank diesem Forum auch ohne neue Themen zu erstellen relativ weit gekommen ! Danke an dieser Stelle! Jedoch bin ich nun an einem Punkt der Verzweiflung angekommen. Ich habe folgendes Problem: habe ein Probescript geschrieben um es später in mein Spiel einzubinden. In diesem Script habe ich ein Inventarsystem probeweiser mit 2 Items gemacht. Dieses Inventar besteht aus 16 Feldern, aufgeteilt in 4 x 4 Blöcken, ein Block für jeweils ein Item! Was soweit auch funktioniert. Jedoch Funktioniert das mit dem Platzieren der Items ins Inventar nur halb. Entweder er zeichnet es Immer nur an die erste stelle, oder er bringt ne Fehlermeldung. Habe es so gemacht das ich vorher Prüfe welches feld leer ist, wenn es leer ist zeichnet er das item an diese stelle, danach soll diese stelle als "besetzt" markiert werden, und DA kommt die Fehlermeldung. Meine vermutung ist dass das item dass das feld als besetzt markiert, sich selber rauslöscht aus diesem feld, weil dieses ja als besetzt markiert ist. Habe den Code mal Dokumentiert und hier rein gepostet. wäre sehr nett wenn ihr mir helfen könntet. Code: [AUSKLAPPEN] Graphics 800,600 SetBuffer BackBuffer() item1_pic = LoadImage("./item1.jpg") item2_pic = LoadImage("./item2.jpg") item3_pic = LoadImage("./item3.jpg") itemD_pic = LoadImage("./itemD.jpg") maus_pic = LoadImage("./maus.png") ;Erstellen des Inventarslot Type ( 4x4 Felder ) Type slot Field x Field y Field besetzt End Type For i = 1 To 16 slot.slot = New slot slot\x = 500 + tempslotx slot\y = 380 + tempsloty slot\besetzt = 0 tempslotx = tempslotx + 35 If tempslotx > 105 tempslotx = 0 tempsloty = tempsloty + 35 EndIf Next ;Erstellen des Item Type Type tPickedUpItem Field name$ Field description$ Field image End Type While Not KeyHit(1) Cls HidePointer ;Erstellen der 2 Probeitems die mit Taste 1... If KeyHit(2) item.tPickedUpItem = New tPickedUpItem item\name$ = "Sword of Heaven" item\image = item1_pic EndIf ; ... bzw Taste 2 erzeugt werden If KeyHit(3) item.tPickedUpItem = New tPickedUpItem item\name$ = "Sword of Hell" item\image = item2_pic EndIf ; Regelung ob die Tasche / Items angezeigt werden If KeyHit(23) ; Taste i tasche_offen = 1 - tasche_offen EndIf If tasche_offen = 1 For slot.slot = Each slot If slot\besetzt = 0 DrawImage itemD_pic,slot\x,slot\y ;Das ist nur ein "Platzhalter-Image" für leere Slots EndIf Next ; Hier SOLLTE geregelt werden wenn ein slot nicht besetzt ist ( slot\besetzt = 0 ) For item.tPickedUpItem = Each tPickedUpItem For slot.slot = Each slot If slot\besetzt = 0 DrawImage item\image,slot\x,slot\y ;slot\besetzt = 1 ; <---- Hier ist scheinbar der hacken, Exit ; denn ist dies nicht Aktiv EndIf ; bringt BB keine Fehlermeldung, Next ; jedoch zeichnet BB die images dann immer Next ; in den ersten Slot! EndIf ; ; ; For item.tPickedUpItem = Each tPickedUpItem ; If ImagesCollide(maus_pic,MouseX(),MouseY(),0,item\image,slot\x,slot\y,0);<<<<<<< und hier kommt die fehlermeldung Text 50,50, item\name$ ; wenn oben genanntes Aktiv ist EndIf ; Und zwar "Object does not exist" Next DrawImage maus_pic,MouseX(),MouseY() Flip Wend End |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mein Vorschlag:
Code: [AUSKLAPPEN] Type Tslot
Field x Field y Field objekt.TPickedUpItem End Type Du kannst das Item direkt in dem Slot speichern. Wenn objekt = Null ist, einfach der Leere Feld anzeigen, ansonsten mit Slot\objekt\image auf das richtige Bild zugreifen... |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Trust |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo danke erstmal für die Antwort.
Klingt ganz gut, nur habe ich probleme das zu bewerkstelligen. wie erstelle ich denn dann die slots? Irgendwie bin ich jetzt ein bissl durcheinander. Code: [AUSKLAPPEN] Type slot
Field x Field y Field objekt.tPickedUpItem End Type Habe meinen Slottype dementsprechend geändert. Nun will ich die slots wie vorher auch erstellen mit der For-Schleife. Aber wie? Code: [AUSKLAPPEN] For i = 1 To 16
slot.slot = New slot slot\x = 500 + tempslotx slot\y = 380 + tempsloty slot\objekt.tPickedUpItem = 0 ;<---- ... ... So ja wohl eher nicht... Irgendwie stehe ich grade voll auf der Leitung ![]() Und was ich mich auch frage, wie sieht der code dann aus der darauf dann zugreift bzw. überprüft? müsste dann wohl in etwa so aussehen oder? ( Ist falsch ich weiß, aber Ungefähr...)Code: [AUSKLAPPEN] If tasche_offen = 1
For item.tPickedUpItem = Each tPickedUpItem For slot.slot = Each slot If slot\objekt.tPickedUpItem = 0 DrawImage itemD_pic,slot\x,slot\y Else DrawImage Slot\objekt\image,slot\x,slot\y Exit EndIf Next Next EndIf Hoffe das sieht nicht zu dumm aus, jedoch lerne ich seid gestern erst mit Types umzugehen. Meines erachtens nach nicht grad das einfachste. Nochmals danke für die Hilfe Mfg Trust |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Beim erstellen ist slot\objekt automatisch NULL. Jede Type-Variable die mit keinem Objekt befüllt ist, ist NULL.
NULL ist so zu sagen das "nicht-vorhanden-Objekt". Wenn du es trotzdem explizit angeben willst, geht das so: Code: [AUSKLAPPEN] For i = 1 To 16
slot.slot = New slot slot\x = 500 + tempslotx slot\y = 380 + tempsloty slot\objekt.tPickedUpItem = Null ;<---- Arbeiten tust du damit dann so: Code: [AUSKLAPPEN] If tasche_offen = 1
For slot.slot = Each slot If slot\objekt.tPickedUpItem = Null Then DrawImage itemD_pic,slot\x,slot\y Else DrawImage Slot\objekt\image,slot\x,slot\y EndIf Next EndIf Alle tPickedUpItem durchzugehen ist in diesem Fall nicht mehr nötig - sie sind ja mit dem entsprechenden Slot verlinkt. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Trust |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke, sehr verständlich erklärt!
Habe nun alles so verändert wie Du es mir gezeigt hast : Code: [AUSKLAPPEN] If KeyHit(2)
objekt.tPickedUpItem = New tPickedUpItem objekt\name$ = "Sword of Heaven" objekt\image = item1_pic EndIf If KeyHit(3) objekt.tPickedUpItem = New tPickedUpItem objekt\name$ = "Sword of Hell" objekt\image = item2_pic EndIf If KeyHit(23) ; Taste i tasche_offen = 1 - tasche_offen EndIf If tasche_offen = 1 For slot.slot = Each slot If slot\objekt.tPickedUpItem = Null Then DrawImage itemD_pic,slot\x,slot\y Else DrawImage Slot\objekt\image,slot\x,slot\y EndIf Next EndIf ;For slot.slot = Each slot ;If slot\objekt.tPickedUpItem <> Null Then ;If ImagesCollide(maus_pic,MouseX(),MouseY(),0,Slot\objekt\image,slot\x,slot\y,0) ;Text 50,50, objekt\name$ ;EndIf ;EndIf ;Next DrawImage maus_pic,MouseX(),MouseY() Das ist alles in der Hauptschleife! Leider zeichnet er die objekt\image garnicht ein, was heißt wenn ich Taste 1 bzw. 2 drücke passiert scheinbar garnichts. Nun weiß ich nicht woran das liegen könnte... Die objekte werden ja erstellt das ist sicher, die images sind auch korrekt, welcher teil des scrips ordnet denn jezt genau die objekte den slots zu? Code: [AUSKLAPPEN] If tasche_offen = 1
For slot.slot = Each slot If slot\objekt.tPickedUpItem = Null Then DrawImage itemD_pic,slot\x,slot\y Else DrawImage Slot\objekt\image,slot\x,slot\y EndIf Next EndIf Dieser teil sagt ja eigentlich nur, dass wenn slot leer ist, das leerimage gezeichnet wird, ansonsten objekt\image . Jedoch muss ich doch auch noch irgendwo sagen das er nicht leer ist... Sonst zeichnet er wie gesagt nur leere slots ein wie momentan der fall... Oder versteh ich das falsch? Vielen Dank Mfg Trust |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zitat: Jedoch muss ich doch auch noch irgendwo sagen das er nicht leer ist... Vollkommen Richtig.
Am besten ordnest du die Objekte nach dem erstellen zu: Code: [AUSKLAPPEN] If KeyHit(2)
objekt.tPickedUpItem = New tPickedUpItem objekt\name$ = "Sword of Heaven" objekt\image = item1_pic For s.slot = Each Slot If s\objekt = Null Then s\objekt = Objekt Exit EndIf Next EndIf Jeder slot wird durchgegangen bis wir einen haben der noch kein Objekt enthält. Das Objekt wird zugewiesen und die Schleife abgebrochen. Ich würde empfehlen, Funktionen für den Umgang mit Objekten zu verwenden, das mach den Code übersichtlicher wenn er länger wird. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Trust |
![]() Antworten mit Zitat ![]() |
---|---|---|
Super! Vielen Dank!
Jetzt funktioniert alles wie es soll ![]() Zitat: Ich würde empfehlen, Funktionen für den Umgang mit Objekten zu verwenden, das mach den Code übersichtlicher wenn er länger wird.
Muss ich dafür nicht die ganzen Types bzw. objekte global machen damit ich das dann auch in der Hauptschleife verwenden kann? Macht es dann den code nicht noch unübersichtlicher? Ich mein wäre schon sehr toll alles in eine funktion zu packen wie in etwa:Code: [AUSKLAPPEN] If monster = tot Then
create_item("0001") ; Wobei "0001" eine item ID ist EndIf Diese Funktion öffntet dann eine textdatei wo alle items aufglistet sind und sucht nach der item\ID und erstellt dieses item. Oder man includiert diese textdatei vor der hauptschleife einfach. Ist so eine function möglich? |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zitat: Muss ich dafür nicht die ganzen Types bzw. objekte global machen damit ich das dann auch in der Hauptschleife verwenden kann? Absolut nicht! Wenn man ordentlich mit Types umgehen kann, machen Globale Type-Variablen nur in wenigen Fällen sinn.
So eine Funktion die mit ItemID arbeitet ist fraglos möglich, sie erfordert nur etwas String-Parsing um die erforderlichen Informationen aus einer Datei zu bekommen, die man mit einem Texteditor tippen kann. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Trust |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ok vielen Dank nochmals!
Somit wären alle meine fragen beantwortet ![]() Hier noch einmal für alle Anderen die vielleicht mal das selbe Problem haben der Code an einem Stück : Code: [AUSKLAPPEN] Graphics 800,600
SetBuffer BackBuffer() item1_pic = LoadImage("./item1.jpg") item2_pic = LoadImage("./item2.jpg") item3_pic = LoadImage("./item3.jpg") itemD_pic = LoadImage("./itemD.jpg") maus_pic = LoadImage("./maus.png") Type slot Field x Field y Field objekt.tPickedUpItem End Type Type tPickedUpItem Field name$ Field description$ Field image End Type For i = 1 To 16 slot.slot = New slot slot\x = 500 + tempslotx slot\y = 380 + tempsloty slot\objekt.tPickedUpItem = Null tempslotx = tempslotx + 35 If tempslotx > 105 tempslotx = 0 tempsloty = tempsloty + 35 EndIf Next While Not KeyHit(1) Cls HidePointer If KeyHit(2) objekt.tPickedUpItem = New tPickedUpItem objekt\name$ = "Sword of Heaven" objekt\image = item1_pic For s.slot = Each Slot If s\objekt = Null Then s\objekt = Objekt Exit EndIf Next EndIf If KeyHit(3) objekt.tPickedUpItem = New tPickedUpItem objekt\name$ = "Sword of Hell" objekt\image = item2_pic For s.slot = Each Slot If s\objekt = Null Then s\objekt = Objekt Exit EndIf Next EndIf If KeyHit(23) ; Taste i tasche_offen = 1 - tasche_offen EndIf If tasche_offen = 1 For slot.slot = Each slot If slot\objekt.tPickedUpItem = Null Then DrawImage itemD_pic,slot\x,slot\y Else DrawImage Slot\objekt\image,slot\x,slot\y EndIf Next EndIf If tasche_offen = 1 For slot.slot = Each slot If slot\objekt.tPickedUpItem <> Null Then If ImagesCollide(maus_pic,MouseX(),MouseY(),0,Slot\objekt\image,slot\x,slot\y,0) Text 50,50, Slot\objekt\name$ EndIf EndIf Next EndIf DrawImage maus_pic,MouseX(),MouseY() Flip Wend End |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group