Page 1 sur 1

POO façon maison

Publié : sam. 28/juil./2007 14:24
par tmyke
Resultat de ma reflexion de ce samedi, une petite demo d'implementation de POO avec PB,
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
 

Publié : sam. 28/juil./2007 20:26
par Anonyme
j'ai bricolé un p'tit parser qui fonctionne bien , mais uniquement pour nux, comme cela n'attire pas les foules, je le laisse pour linux...

http://www.purebasic.fr/french/viewtopic.php?t=6895

Publié : sam. 28/juil./2007 21:17
par Backup
Cpl.Bator a écrit :j'ai bricolé un p'tit parser qui fonctionne bien , mais uniquement pour nux, comme cela n'attire pas les foules, je le laisse pour linux...

http://www.purebasic.fr/french/viewtopic.php?t=6895
c'est pas que ça n'attire pas, c'est plutot que pour ma part, j'y comprends rien !!

la poo est un concepte a part qui me depasse completement ! :D

Publié : sam. 28/juil./2007 22:54
par Anonyme
Dobro a écrit :
Cpl.Bator a écrit :j'ai bricolé un p'tit parser qui fonctionne bien , mais uniquement pour nux, comme cela n'attire pas les foules, je le laisse pour linux...

http://www.purebasic.fr/french/viewtopic.php?t=6895
c'est pas que ça n'attire pas, c'est plutot que pour ma part, j'y comprends rien !!

la poo est un concepte a part qui me depasse completement ! :D
la POO ( ou OOP dans ta langue préféré :D ) est très simple en fait.
Pour te donner une idée , tu utilises des structures dans tes prog ?
dans tes programmes , les structures sont composé que de variable.
les classes , c'est pareil , sauf que tu peut mettre des procédures dans ta structure, les procédures en POO s'appelle méthode , un constructeur n'est ni plus ni moins qu'un vulgaire allocatememory().
ca ouvre pas mal de perspective. par exemple :

Code : Tout sélectionner

class personnage
{
vie.l
Munition.l
Nom$

Controle_clavier(DirX,DirY)
Affichage()
} 
voici une classe "personnage" , avec cette classe, tu gère un personnage simple , tu peut lui attribuer une vie , des muns, un nom, cette classe possède deux méthodes (procédure) qui lui sont propre : Controle_clavier() & affichage()
c'est deux méthodes ne sont accessible que par un objet de classe personnage.
C'est à dire que tu ne peut pas faire Affichage() tout seul
mais tu dois faire :

Code : Tout sélectionner

BOB.personnage
BOB\Affichage()

et non pas 

Affichage()
se sont les grandes lignes, les codes plus haut sont factices, c'etait plus pour t'éclairer :D

Publié : sam. 28/juil./2007 23:40
par Backup
Cpl.Bator a écrit : se sont les grandes lignes, les codes plus haut sont factices, c'etait plus pour t'éclairer :D
ha oui ! je crois que je comprends !! :D

mais alors lorsque tu as fait

Code : Tout sélectionner

BOB.personnage
BOB\Affichage() 
que ce passe t'il ?

cela lance la procedure Affichage() qui appartiens seulement a BOB ??
mais cette procedure peut surement etre appeler par un autre objet non ?

et une fois fait peut ton quand mem appeler Affichage() directement ?
(je supose que oui, puisque la procedure existe en dehors de la classe) ! ??

Publié : sam. 28/juil./2007 23:43
par Anonyme
mais cette procedure peut surement etre appeler par un autre objet non ?
oui, seulement à un autre objet de la classe personnage.
et une fois fait peut ton quand mem appeler Affichage() directement ?
(je supose que oui, puisque la procedure existe en dehors de la classe) ! ??
Non, la procédure(méthode) est unique à la classe. le gros avantage, une classe bien faite, peut s'exporter facilement d'un projet à un autre sans touché à la classe. :wink:

Publié : sam. 28/juil./2007 23:48
par Backup
Merci pour tes lumieres :D

Publié : dim. 29/juil./2007 8:59
par tmyke
Cpl.Bator a écrit :j'ai bricolé un p'tit parser qui fonctionne bien , mais uniquement pour nux, comme cela n'attire pas les foules, je le laisse pour linux...

http://www.purebasic.fr/french/viewtopic.php?t=6895
Cpl.Bator a écrit : Linux :
File:1->oop-pb.tar.gz
Cela me boterais bien de le décortiquer... mais il semble que le lien oop-pb.tar.gz ne soit plus valide :?

Publié : dim. 29/juil./2007 10:37
par Anonyme
problème avec purestorage, dsl... :?