cela reprends d'une façon générale ce qui existe déjà, mais tourné à ma façon.
- déclaration d'une classe de base
- Heritage d'une seconde classe.
C'est qu'une démo, tout cela pour 300 sprites en rotations (avec DM3D bien sûr...)
Qu'est-ce qu'il faut pas faire pour gouter un peu à la POO avec PB

http://www.eliza3d.com/Demo.zip
pour voir, le code (l'include et le media dans le zip)
Code : Tout sélectionner
; Include files
IncludeFile "OOP.pb"
IncludePath "Include\" : IncludeFile "dreamotion3d.pbi"
;===================================================================
;{
;--- classe Sprite
;
Type ( Sprite )
PosSp(px.l, py.l)
LoadSp(filename.s)
MethodeName(Mthds_Sprite)
PosSp.l
LoadSp.l
Field(Sprite_)
*Methods.l
x.l
y.l
*sp.CSprite2D
EndType()
;-
;}
;=============================
; method definition
;=============================
; positionnement
Procedure PosSp(*this.Sprite_, px.l, py.l)
*this\x = px
*this\y = py
DM_PositionSprite2D(*this\sp, px, py)
EndProcedure
; chargement
Procedure LoadSp(*this.Sprite_, filename.s)
*this\sp = DM_LoadSprite2D(filename, *this\x, *this\y)
EndProcedure
; constructeur et destructeur
Procedure.l NewSprite(vx.l, vy.l, *cptr)
; allocation et generation de l'espace pour les methodes
*Mthds.Mthds_Sprite = AllocMethod(Mthds_Sprite)
; init des pointeurs des methodes
SetMethod(*Mthds, PosSp)
SetMethod(*Mthds, LoadSp)
; creation de la classe field avec init du pointeur vers les methodes
MethodAssign( Sprite_)
; Field
*this\x=vx
*this\y=vy
; concerve le pointeur des champs de variables
PokeL(*cptr, *this)
ProcedureReturn *this
EndProcedure
; destroy
Procedure DeleteSprite(*this)
FreeMemory(*this)
EndProcedure
;
;===================================================================
;===================================================================
;{
;--- classe Sprite2
;
Type (Sprite2) Extends Sprite
DrawSp()
MethodeName(Mthds_Sprite2) Extends Mthds_Sprite
DrawSp.l
Field(Sprite2_) Extends Sprite_
name.s
EndType()
;-
;}
;=============================
; method definition
;=============================
; dessin
Procedure DrawSp(*this.Sprite2_)
DM_DrawSprite2D(*this\sp)
EndProcedure
; constructeur et destructeur
Procedure.l NewSprite2(vx.l, vy.l, *cptr)
; allocation et generation de l'expace pour les methodes
*Mthds.Mthds_Sprite2 = AllocMethod(Mthds_Sprite2)
; init des pointeurs des methodes
SetMethod(*Mthds, DrawSp)
SetMethod(*Mthds, PosSp)
SetMethod(*Mthds, LoadSp)
; creation de la classe field avec init du pointeur vers les methodes
MethodAssign( Sprite2_)
; Field
*this\name= "sprite"
; concerve le pointeur des champs de variables
PokeL(*cptr, *this)
ProcedureReturn *this
EndProcedure
; destroy
Procedure DeleteSprite2(*this)
FreeMemory(*this)
EndProcedure
;
;===================================================================
; ----------------------------------
; -----init du moteur et dépendances
; ----------------------------------
; Init PB modules
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
End
EndIf
;set graphic window 3D
DM_Graphics3D(800, 600, 32, 0, 1)
; load font
*font = DM_LoadFont( "Tahoma",9 , 0)
DM_TextColor(*font, 198,198,198,255)
; ----------------------------------
; définition du tableau pour nos
; 300 sprites
; ----------------------------------
Global Dim sp.Sprite2(300), Dim *sp.Sprite2_(300)
For i = 0 To 300
sp(i) = NewSprite2(0,0, @*sp(i) )
sp(i)\LoadSp("sp1.png")
sp(i)\PosSp(Random(800), Random(600))
*sp(i)\name = "sprite"+Str(i)
Next
Repeat
ExamineKeyboard()
ExamineMouse()
ShowCursor_(1)
If KeyboardReleased(#PB_Key_Escape) Or WindowEvent()=#PB_Event_CloseWindow
Quit=1
EndIf
; ---------------
; Render
; ---------------
DM_BeginScene()
DM_RenderWorld()
; affichage de nos sprites
For i = 0 To 300
DM_TurnSprite2D( *sp(i)\sp, 1)
sp(i)\DrawSp()
Next
; le FPS
DM_DrawText(*font, 10, 15, "FPS : "+Str(DM_FPS()))
DM_DrawText(*font, 10, 30, "nom du sp 33: "+ *sp(33)\name)
DM_EndScene()
Until Quit=1
; libération des ressources
For i = 0 To 300
DeleteSprite2(sp(i))
Next
DM_ClearGraphics()
End