v4 - OOP ( I love MACRO )
Posted: Sun Feb 12, 2006 12:09 am
I love MACRO
!!

Code: Select all
; ======================================
; NEW MACRO COMMANDS TO SIMPLIFY OOP CODING
; ======================================
;//// COLLECTION OF OBJECT
Macro CreateCollection(TYPENAME)
Global *this#TYPENAME.TYPENAME
Global NewList TYPENAME#List.TYPENAME()
Declare TYPENAME#Create()
EndMacro
Macro ForInCollection(TYPENAME)
ForEach TYPENAME#List()
*this#TYPENAME = TYPENAME#List()
EndMacro
Macro EmptyCollection(TYPENAME)
1 And (CountList(TYPENAME#List())=0)
EndMacro
;//// OBJECT CREATION
Macro CreateThis(TYPENAME)
AddElement(TYPENAME#List())+8
*this#TYPENAME = TYPENAME#List()
TYPENAME#Create()
EndMacro
Macro DeleteThis(TYPENAME)
DeleteElement(TYPENAME#List())
*this#TYPENAME = 0
EndMacro
;//// CURRENT OBJECT
Macro GetThis(TYPENAME)
*this#TYPENAME
EndMacro
Macro SelectThis(TYPENAME,TYPEINSTANCE)
ChangeCurrentElement(TYPENAME#List(), TYPEINSTANCE)
*this#TYPENAME = TYPENAME#List()
EndMacro
;Macro NextThis(TYPENAME)
;Debug "..........."
;EndMacro
;Macro PreviousThis(TYPENAME)
;Debug "..........."
;EndMacro
;//// READ / WRITE OBJECT PROPERTIES
Macro WithThis(TYPENAME,TYPEINSTANCE = 0)
If TYPEINSTANCE <> 0 : SelectThis(TYPENAME,TYPEINSTANCE) : EndIf
With *this#TYPENAME
EndMacro
; ======================================
; OOP EXAMPLE
; ======================================
Prototype.l PROCTYPE_MOVE(dx=3,dy=2)
Prototype.l PROCTYPE_BOOM(xlimit)
Structure MISSILE
x.l
y.l
destroyed.b
move.PROCTYPE_MOVE
boom.PROCTYPE_BOOM
EndStructure
CreateCollection(MISSILE)
;// OBJECT PROCEDURE
Procedure MissileMove(dx,dy)
WithThis(MISSILE)
\x+dx
\y+dy
Debug "position X: "+Str(\x)
Debug "position Y: "+Str(\y)
Debug ""
EndWith
EndProcedure
;// OBJECT PROCEDURE
Procedure MissileBoom(xlimit)
WithThis(MISSILE)
If (\x>xlimit)
\destroyed=#True
Debug "BOOM !! "
EndIf
EndWith
EndProcedure
;// OBJECT DEFAULT CONSTRUCTOR
Procedure MissileCreate()
WithThis(MISSILE)
\x=0
\y=0
\move=@MissileMove()
\boom=@MissileBoom()
\destroyed=0
EndWith
EndProcedure
;// CREATE OBJECT INSTANCE
m1 = CreateThis(MISSILE)
WithThis(MISSILE)
\x=5
\y=5
EndWith
m2 = CreateThis(MISSILE)
WithThis(MISSILE)
\x=Random(20)
\y=Random(20)
EndWith
SelectThis(MISSILE,m1)
Debug "missile1 pos X: "+Str( GetThis(MISSILE)\x )
Repeat
ForInCollection(MISSILE)
WithThis(MISSILE)
\move(Random(3),Random(3))
\boom(200)
If (\destroyed) : DeleteThis(MISSILE) : EndIf
EndWith
Next
Until EmptyCollection(MISSILE)