Inventory again
Blitz3D Forums/Blitz3D Programming/Inventory again
| ||
| I know there are some references in the forums and code archives but I need something pretty simple. I needs 1 9 x 9 grid which when an item is selected gets added to or removed from the grid. This should free up the position and if possible realign the free spaces. Each item needs a unique reference. So Pick up key Key appears in grid (Inventory) select key using cursor keys Hit enter to use key if okay to use remove key from grid and do action. I am sure its been asked 100 times but I will only have a limited number of items per level and dont need anything too fancy. |
| ||
mabe something like this, it is using the mouse ATM but you could change it for keys with some imagination:
;Small "database" containing all possible game objects loaded using DATA or loaded from a file. Add fields as needed.
Type IG_ObjectData
Field name$ ;item name
Field thumbfilename$ ;filename of thumb
Field thumb ; handle for thumbnail (if preloaded, this example doesnt use preloading))
Field DeleteWhenUsed ;1/0
Field Description$ ; ie, a gold shiny key with 666 on the handle
End Type
;A second "database" for your inventory.
Type IG_Inventory
Field name$
Field thumb ;image handle
Field DeleteWhenUsed
Field Description$
End Type
;function to add an object to your world, name must be unique as it is the "key field"
function addglobalobject(name$,filename$="missing.png",desc$="Mysterious Item",deletewhenused=0)
O.ig_objectdata= new ig_objectdata
o\name=name
o\filename=filename
;if using preloading thumbs uncomment folowing line
;o\thumb=loadimage (o\filename)
o\deletewhenused=deletewhenused
o\description=desc
end function
;removes an object from the inventory
Function Inventory_remove(name$)
;Erase item from inventory
For i.IG_inventory=Each IG_inventory
Freeimage i\thumb
If Upper(i\name)=Upper(name$) Delete i
Next
End Function
;Adds an object to the inventory from the world. Returns 1 if successful
;name must exactly match a name in your objectdata database.
Function Inventory_Pickup(name$)
;check If Object is in database & If Not
;raise an error otherwise add To inventory
success=0
For o.IG_objectdata=Each IG_objectdata
If Upper(o\name)=Upper(name$)
;create New inventory item from item database
i.IG_Inventory=New IG_inventory
i\name=o\name
;load thumbnail, if using preloading, change this to: i\thumb = copyimage (o\thumb)
i\thumb=LoadImage(o\thumbfilename$)
If Not i\thumb Then runtimeerror("Thumbnail Missing! "+o\thumbfilename,1)
i\deletewhenused=o\deletewhenused
i\description=o\description
success=1
EndIf
Next
If Not success Then debuglog("WARNING: Object "+name+" Is not in main database!",0)
End Function
;-------------the following may not work as i just made it up on the fly and may need tweaking (but you can see the idea)------
;to display and 'do' the inventory, returns the selected object name
function doinventory$()
picX=100 ; start position of grid
PicY=100
PicSize=32+1 ; image size + any 'border' it needs
columnmax=9 ; number of columns before going to next line. (could be re-aranged to work on rows)
StepX=0
StepY=0
repeat
;To load eye candy for inventory screen and clear the backbuffer.
;if inventory screen used change following line to: drawimage inventoryscreen,0,0
cls ;or renderworld if to show 3d in background.
selecteditem$=""
for item.ig_inventory=each ig_inventory
item\selected=0
px=picX+(stepx*32)
py=picY+(stepY*32)
drawimage item\thumb, px,py
if mouseX()>px and mousex()<px+PicSize and mouseY()>pY and mouseY()<py+PicSize
selecteditem$=item\name
gx=px
gy=py
endif
stepx=stepx+1:
if stepX=columnmax
stepX=0:
stepY=StepY+1
endif
next
drawimage glow,gx,gy ;you need a glow image for the selected item :)
flip;
vwait()
if mousehit(1) return selecteditem$
if mousehit(2) or keykit(1) return ""
forever
end function
;to use an object
function useobject(name$)
;returns a 1 if successful (player has item)
For i.IG_inventory=Each IG_inventory
if Upper(i\name)=Upper(name$)
if i\deletewhenused Inventory_remove(name$)
return 1
endif
Next
end function
;check to see if player has an object
function hasobject(name$)
;returns a 1 if successful (player has item)
For i.IG_inventory=Each IG_inventory
if Upper(i\name)=Upper(name$)
return 1
endif
Next
end function
EDIT!!! Although the above is plety fast enough as is, Stevie_G has just made me aware of something that could make the type search much more efficient: http://www.blitzmax.com/Community/posts.php?topic=72979 see his second post! |
| ||
| Just made some mods to this, still havent tested it in BB yet :/ Let me know how it goes :) |