Class routine

Blitz3D Forums/Blitz3D Programming/Class routine

The forum is locked. These are the original blitzbasic.com forums, kept so they can still be read. No new topics, replies or edits can be made here. To join in, head over to the Blitz3D+ forums.

Here is a good method for storing and handling objects. Types have two fundamental problems. First, a variable can only be one type class, unless you use the clunky Object() command. Second, types cannot store a variable array of subobjects, like a vertex list. This lets you store any structure in a regular old four-byte integer variable.

Here are the commands:

item=CreateItem(class)
"Class" is a constant, from 1 to infinity. Use CLASS_PLAYER, CLASS_MONSTER, etc.

Setl(item,parameter,value)
"parameter" is a constant, from 1 to infinity. Use PLAYER_HEALTH, MONSTER_LEVELOFSEETHINGRAGE, etc.

Getl(item,parameter) returns integers.

You can also use Setf(), Getf(), for floats.

CountItems(class)
How many items exist with that class.

GetItem(class,index)
Returns the item. Index is from 1 to CountItems().
This will probably be made into a lib.

Include "classes.bb"

Const CLASS_PLAYER=1
Const PLAYER_NAME=1
Const PLAYER_HEALTH=2
Const PLAYER_XPOSITION=3
Const PLAYER_YPOSITION=4
Const PLAYER_ZPOSITION=5

Const CLASS_MONSTER=2
Const MONSTER_HEALTH=1
Const MONSTER_XPOSITION=2
Const MONSTER_YPOSITION=3
Const MONSTER_ZPOSITION=4

Const CLASS_WEAPON=3
Const WEAPON_AMMO=1
Const WEAPON_RECOIL=2

For n=1 To 3
	player=createitem(CLASS_PLAYER)
	setl player,PLAYER_HEALTH,n
	setf player,PLAYER_XPOSITION,Rnd(0,100)
	setf player,PLAYER_YPOSITION,Rnd(0,100)
	setf player,PLAYER_ZPOSITION,Rnd(0,100)
	Next

player=GetItem(CLASS_PLAYER,2)
FreeItem player

sets GetItem(CLASS_PLAYER,1),PLAYER_NAME,"Adam"
sets GetItem(CLASS_PLAYER,2),PLAYER_NAME,"Joe"

For n=1 To CountItems(CLASS_PLAYER)
	player=getitem(CLASS_PLAYER,n)
	Print "Player "+n
	Print "Name: "+gets(player,PLAYER_NAME)
	Print "Health: "+getl(player,PLAYER_HEALTH)
	Print "X position: "+getf(player,PLAYER_XPOSITION)
	Print "Y position: "+getf(player,PLAYER_YPOSITION)
	Print "Z position: "+getf(player,PLAYER_ZPOSITION)
	Print ""
	Next

For n=1 To 2
	monster=createitem(CLASS_MONSTER)
	setl monster,MONSTER_HEALTH,Rnd(0,100)
	Next

For n=1 To CountItems(CLASS_MONSTER)
	monster=getitem(CLASS_MONSTER,n)
	Print "Monster "+n
	Print "Health:"+getl(monster,MONSTER_HEALTH)
	Print ""
	Next

WaitKey
End


classes.bb:
Global masterclassbuffer=CreateBank()

Const ITEM_HEADERLENGTH=4

Function CreateItem(class)
If BankSize(masterclassbuffer)<class*4
	ResizeBank masterclassbuffer,class*4
	Else
	classbuffer=PeekInt(masterclassbuffer,(class-1)*4)
	EndIf
If Not classbuffer
	classbuffer=CreateBank()
	PokeInt masterclassbuffer,(class-1)*4,classbuffer
	EndIf
item=CreateBank(ITEM_HEADERLENGTH)
PokeInt item,0,class
size=BankSize(classbuffer)
ResizeBank classbuffer,size+4
PokeInt classbuffer,size,item
Return item
End Function

Function CountItems(class)
If BankSize(masterclassbuffer)<class*4 Return 0
classbuffer=PeekInt(masterclassbuffer,(class-1)*4)
If classbuffer
	Return BankSize(classbuffer)/4
	Else
	Return 0
	EndIf
End Function

Function GetItem(class,index)
classbuffer=PeekInt(masterclassbuffer,(class-1)*4)
Return PeekInt(classbuffer,(index-1)*4)
End Function

Function FreeItem(item)
class=ItemClass(item)
classbuffer=PeekInt(masterclassbuffer,(class-1)*4)
For n=0 To (BankSize(classbuffer))/4-1
	If PeekInt(classbuffer,n*4)=item
		For m=n To (BankSize(classbuffer))/4-1-1
			PokeInt classbuffer,m*4,PeekInt(classbuffer,m*4+4)
			Next
		FreeBank item
		ResizeBank classbuffer,BankSize(classbuffer)-4
		Exit
		EndIf
	Next
End Function

Function ItemClass(item)
Return PeekInt(item,0)
End Function

Function Getl(item,parameter,defaultvalue=0)
If BankSize(item)<parameter*4+ITEM_HEADERLENGTH Return defaultvalue
Return PeekInt(item,(parameter-1)*4+ITEM_HEADERLENGTH)
End Function

Function Setl(item,parameter,value)
If BankSize(item)<parameter*4+ITEM_HEADERLENGTH ResizeBank item,parameter*4+ITEM_HEADERLENGTH
PokeInt item,(parameter-1)*4+ITEM_HEADERLENGTH,value
End Function

Function Getf#(item,parameter,defaultvalue#=0)
If BankSize(item)<parameter*4+ITEM_HEADERLENGTH Return defaultvalue
Return PeekFloat(item,(parameter-1)*4+ITEM_HEADERLENGTH)
End Function

Function Setf(item,parameter,value#)
If BankSize(item)<parameter*4+ITEM_HEADERLENGTH ResizeBank item,parameter*4+ITEM_HEADERLENGTH
PokeFloat item,(parameter-1)*4+ITEM_HEADERLENGTH,value
End Function

Function Gets$(item,parameter,defaultvalue$="")
If BankSize(item)<parameter*4+ITEM_HEADERLENGTH Return defaultvalue
sbank=PeekInt(item,(parameter-1)*4+ITEM_HEADERLENGTH)
If Not sbank Return defaultvalue
Return PeekString(sbank,0)
End Function

Function Sets(item,parameter,value$)
If BankSize(item)<parameter*4+ITEM_HEADERLENGTH
	ResizeBank item,parameter*4+ITEM_HEADERLENGTH
	Else
	sbank=PeekInt(item,(parameter-1)*4+ITEM_HEADERLENGTH)
	EndIf
If sbank
	ResizeBank sbank,Len(value)+1
	Else
	sbank=CreateBank(Len(value)+1)
	PokeInt item,(parameter-1)*4+ITEM_HEADERLENGTH,sbank
	EndIf
PokeString sbank,0,value
End Function