Item existiert nach dem Erstellen nicht !?

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Trust

Betreff: Item existiert nach dem Erstellen nicht !?

BeitragMo, Mai 04, 2009 23:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Xeres

Moderator

BeitragMo, Mai 04, 2009 23:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Trust

BeitragDi, Mai 05, 2009 14:15
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Embarassed

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

Xeres

Moderator

BeitragDi, Mai 05, 2009 14:37
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Trust

BeitragDi, Mai 05, 2009 15:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Xeres

Moderator

BeitragDi, Mai 05, 2009 15:22
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Trust

BeitragDi, Mai 05, 2009 16:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Super! Vielen Dank!
Jetzt funktioniert alles wie es soll Smile

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?

Xeres

Moderator

BeitragDi, Mai 05, 2009 16:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Trust

BeitragDi, Mai 05, 2009 16:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok vielen Dank nochmals!

Somit wären alle meine fragen beantwortet Very Happy


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

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group