Probleme avec les sprites

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Geoff
Messages : 2
Inscription : mer. 11/janv./2006 13:26

Probleme avec les sprites

Message par Geoff »

Bonjour,
je me suis mis au purebasic voila quelques jours déjà, et je commence à assimiler certaines commandes, comme par exemple les structures qui vont m'etre tres utiles pour la conception de mon jeu d'aventure en 2d.
Mais j'ai rencontré tout de meme quelques problemes concernant les sprites :? .

J'aurai donc 3 questions à vous poser :

1-Quand je veux découper un personnage de ma planche, que j'assimile a un sprite 3D, j'utilise la commande ClipSprite et je découpe mon personnage aux dimensions souhaités. Le probleme c'est que lorsque j'affiche mon sprite3D a l'écran, au lieu de voir juste mon personnage, je vois tout le fichier bitmap redimensionné à la taille de mon personnage!

2-Comment fait on pour définir le centre de rotation d'un sprite 3D?

3-Comment je peux faire pour appliquer un retournement horizontal ou vertical à l'image de mon sprite?
J'ai essayer avec la commande TransformSprite3D mais sa ne marche pas.

voilà, si vous pouviez m'aider j'en serais ravi :)
Merci d'avance pour vos réponses :)
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Tout ce que tu cherches à faire a déjà été demandé :(
(mirrorsprite, flipsprite, centre de rotation et clipsprite3D)

donc pour le moment ce n'est pas faisable "simplement"... Y'a une grosse mise à jour qui ne devrait plus tarder. Avec de la chance certains de ces problèmes seront réglés

Dri :(
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

comme dit Dri ce n'est pas faisable facilement , c'est à dire avec une seule commande ,mais tu peux la créer toi même

Code : Tout sélectionner

If InitSprite() = 0 Or InitKeyboard() = 0 
  MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
  End
ElseIf OpenScreen( 800 , 600 , 32 , "Toto" ) = 0
  MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 )
  End
EndIf

CreateSprite(0,84,20)
StartDrawing(SpriteOutput(0))
BackColor(0,0,0)
FrontColor(255,255,0)
DrawText("Test miroir")
StopDrawing()


;Effet miroir 
Procedure  MiroirV(Sprite1,Sprite2)
CreateSprite(Sprite2,SpriteWidth(Sprite1),SpriteHeight(Sprite1)) 
UseBuffer(Sprite2)
For j= 0 To SpriteHeight(Sprite2)-1 
	ClipSprite(Sprite1,0,j,SpriteWidth(Sprite2),1)
	DisplaySprite(Sprite1,0,SpriteHeight(Sprite2)-j)
Next j
UseBuffer(-1)
ClipSprite(Sprite1,#PB_Default,#PB_Default,#PB_Default,#PB_Default)
EndProcedure	

Procedure  MiroirH(Sprite1,Sprite2)
CreateSprite(Sprite2,SpriteWidth(Sprite1),SpriteHeight(Sprite1)) 
UseBuffer(Sprite2)
For i= 0 To SpriteWidth(Sprite2)-1 
	ClipSprite(Sprite1,i,0,1,SpriteHeight(Sprite2))
	DisplaySprite(Sprite1,SpriteWidth(Sprite2)-i,0)
Next i
UseBuffer(-1)
ClipSprite(Sprite1,#PB_Default,#PB_Default,#PB_Default,#PB_Default)
EndProcedure	

MiroirH(0,1)
MiroirV(0,2)


Repeat
ClearScreen(0,0,0)

DisplaySprite(0,0,0)
DisplaySprite(1,84,0)

DisplaySprite(2,0,20)
FlipBuffers()
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

au fait que cherches tu à faire exactement ? à reprendre ton jeu Soldat ? ou tu fais tes tests pour l'instant ? ou un autre projet ?
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

j'étais curieux de voir ce que ça donnerait avec le code que je t'avais passé pour le ClipSprite3D

Cette image doit se trouver dans le même répertoire que le code .
Image

J'ai repris le code de S.M. merci à lui , c'est excellent.
Pour les explications sur le reste du code , je vous invite à lire le tutoriel

Code : Tout sélectionner

;http://forums.purebasic.com/english/viewtopic.php?t=16878
;http://www.games-creators.org/wiki/PureBasic:PremiersPas

;Déclare les procédures
Declare GestionClavier()
Declare AnimationSprite()
Declare DeplaceSprite()
Declare AfficheTexte()
Declare ClipSprite3D(Sprite3D,ClipX,ClipY,ClipWidth,ClipHeight)


Structure DDPIXELFORMAT
  dwSize.l
  dwFlags.l
  dwFourCC.l
  dwRGBBitCount.l
  dwRBitMask.l
  dwGBitMask.l
  dwBBitMask.l
  dwRGBAlphaBitMask.l
EndStructure

Structure DDCOLORKEY
  dwColorSpaceLowValue.l
  dwColorSpaceHighValue.l
EndStructure

Structure DDSCAPS2
  dwCaps.l
  dwCaps2.l
  dwCaps3.l
  dwCaps4.l
EndStructure

Structure DDSURFACEDESC2
  dwSize.l
  dwFlags.l
  dwHeight.l
  dwWidth.l
  lPitch.l
  dwBackBufferCount.l
  dwRefreshRate.l
  dwAlphaBitDepth.l
  dwReserved.l
  lpSurface.l
  ddckCKDestOverlay.DDCOLORKEY
  ddckCKDestBlt.DDCOLORKEY
  ddckCKSrcOverlay.DDCOLORKEY
  ddckCKSrcBlt.DDCOLORKEY
  ddpfPixelFormat.DDPIXELFORMAT
  ddsCaps.DDSCAPS2
  dwTextureStage.l
EndStructure

Structure D3DTLVERTEX
  sx.f
  sy.f
  sz.f
  rhw.f
  color.l
  specular.l
  tu.f
  tv.f
EndStructure

Structure PB_Sprite3D
  Texture.IDirectDrawSurface7 ; DirectDrawSurface7
  Vertice.D3DTLVERTEX[4]      ; The 4 vertices for the rectangle sprite
  Width.w          ; width set with ZoomSprite3D()
  Height.w       ; height set with ZoomSprite3D()
  unknown.l
EndStructure

Structure s_Sprite
    Direction.l              ; Direction de l'animation , Haut droite bas ou gauche 
    ImageEnCours.l           ; Indique quelle image de l'animation est actuellement en cours 
    ImageMaxi.l               ; Nombre d'image maxi pour une animation , ici on a 3 images par direction
    TailleX.l                ; Dimension en X de chaque image 
    TailleY.l                ; Dimension en Y de chaque image
    TempsEnCours.l           ; Indique la durée d'affichage de l'image en cours
    TempsMaxi.l              ; Indique la durée maxi d'affichage d'une image avant de passer à la suivante
    x.l                      ; Position en X du sprite
    y.l                      ; Position en Y du sprite
    PasX.l                    ; Vitesse déplacement en X
    PasY.l                    ; Vitesse déplacement en Y
EndStructure 

;Déclare 4 constantes 
Enumeration
    #AnimeHaut
    #AnimeDroite
    #AnimeBas
    #AnimeGauche
EndEnumeration  

;On déclare un personnage  
Global Gus.s_Sprite

Gus\Direction    = #AnimeDroite            ; On choisit une direction
Gus\ImageMaxi    = 2                       ; (0,1,2) ce qui fait bien 3 images
Gus\ImageEnCours = 0                       ; On se place sur la première image de l'animation
Gus\TailleX      = 24                      ; Taille d'une image 
Gus\TailleY      = 32                      ; Taille d'une image 
Gus\TempsEnCours = ElapsedMilliseconds() ; Initialise la durée d'affichage de l'ImageEnCours
Gus\TempsMaxi    = 150                     ; Ajuster la vitesse de l'animation ici
Gus\x            = 200                     ; Position à l'écran en X
Gus\y            = 200                     ; Position à l'écran en Y


;Initialise l'environnement nécessaire au fonctionnement des sprites et pour ouvrir un écran.
InitSprite()
InitSprite3D()

;Initialise l'environnement propre à la gestion du clavier. 
InitKeyboard()

;Ouvre un nouvel écran avec les caractéristiques Largeur, Hauteur et Profondeur. 
OpenScreen(640,480,32,"Tut Sprite")

;Active le support du format PNG (Portable Network Graphic)
UsePNGImageDecoder() 
    
;Charge en mémoire le sprite 
If LoadSprite(0,"player.png",#PB_Sprite_Texture)=0
    MessageRequester("Erreur","Impossible de charger le sprite Player.png",0)
    End ; Quitte le programme
EndIf    
CreateSprite3D(0,0)
Repeat
    ;Inverse le buffer d'arrière plan avec le buffer visible à l'écran. 
    ;La partie invisible du buffer remplace alors complètement La partie visible. 
    FlipBuffers()
    
    ;Efface l'écran courant avec la couleur specifiée. 
    ClearScreen(0,0,0)
    
    ;Gestion du clavier
    GestionClavier()
    
    ;Affiche un texte à l'écran
    AfficheTexte()
    
    ;Anime le sprite
    AnimationSprite()
    
    ;Deplace et affiche le sprite
    DeplaceSprite()
        
Until KeyboardPushed(#PB_Key_Escape)

End

Procedure AfficheTexte()
    
    StartDrawing(ScreenOutput())
    FrontColor(255,255,0)
    BackColor(0,0,255)
    DrawText("Appuyez sur la touche [Echap] pour quitter")
    StopDrawing()
    
EndProcedure

Procedure GestionClavier()
    
    If ExamineKeyboard()
        
        ;La touche haut du curseur est appuyée
        If KeyboardPushed(#PB_Key_Up)
            Gus\Direction=#AnimeHaut
            Gus\PasY = -1
            ;La touche droite du curseur est appuyée
        ElseIf KeyboardPushed(#PB_Key_Right)
            Gus\Direction=#AnimeDroite
            Gus\PasX = 1
            ;La touche bas du curseur est appuyée
        ElseIf KeyboardPushed(#PB_Key_Down)
            Gus\Direction=#AnimeBas
            Gus\PasY = 1
            ;La touche gauche du curseur est appuyée
        ElseIf KeyboardPushed(#PB_Key_Left)
            Gus\Direction=#AnimeGauche
            Gus\PasX = -1
        EndIf
    EndIf    
    
EndProcedure

Procedure AnimationSprite()
    
    ;Test si la durée maxi d'affichage d'une image est dépassée 
    If ElapsedMilliseconds()-Gus\TempsEnCours>Gus\TempsMaxi
        
        ;Initialise la durée d'affichage
        Gus\TempsEnCours=ElapsedMilliseconds()
        
        ;Incrémente l'image en cours, pour afficher l'image suivante.
        Gus\ImageEnCours + 1
        
        ;On reboucle l'animation ici 
        If Gus\ImageEnCours>Gus\ImageMaxi
            Gus\ImageEnCours = 0 
        EndIf 
        
    EndIf
    ClipSprite3D(0,Gus\ImageEnCours * Gus\TailleX, Gus\Direction * Gus\TailleY, Gus\TailleX , Gus\TailleY)
    
EndProcedure    
Procedure DeplaceSprite()
    
    Gus\x + Gus\PasX  ; Ajoute le pas en X à la position courante du sprite
    Gus\y + Gus\PasY  ; Ajoute le pas en Y à la position courante du sprite
    Gus\PasX = 0      ; Initialise le pas , il faudra appuyer à nouveau sur une touche pour l'activer
    Gus\PasY = 0      ; Initialise le pas , il faudra appuyer à nouveau sur une touche pour l'activer
    
    ;Affiche le sprite à la nouvelle position
    ;DisplayTransparentSprite(0,Gus\x, Gus\y)
    Start3D()
    DisplaySprite3D(0,Gus\x, Gus\y)
    ZoomSprite3D(0,24,32)
    ; ça tourne , y'a pas de doute, on est bien en 3D  
    RotateSprite3D(0,1,1)
    Stop3D()
EndProcedure


Procedure ClipSprite3D(Sprite3D,ClipX,ClipY,ClipWidth,ClipHeight)
;http://forums.purebasic.com/english/viewtopic.php?t=16878 (S.M.)
  *Sprite3D.PB_Sprite3D=IsSprite3D(Sprite3D)
 
  If *Sprite3D=0:ProcedureReturn 0:EndIf
  *DDS.IDirectDrawSurface7=*Sprite3D\Texture
 
  DDSDESC.DDSURFACEDESC2
  DDSDESC\dwSize=SizeOf(DDSURFACEDESC2)
  Result=*DDS\GetSurfaceDesc(DDSDESC)
  If Result:ProcedureReturn 0:EndIf
 
  *Sprite3D\Vertice[0]\tu=ClipX/DDSDESC\dwWidth
  *Sprite3D\Vertice[0]\tv=ClipY/DDSDESC\dwHeight
 
  *Sprite3D\Vertice[1]\tu=(ClipX+ClipWidth)/DDSDESC\dwWidth
  *Sprite3D\Vertice[1]\tv=ClipY/DDSDESC\dwHeight
 
  *Sprite3D\Vertice[2]\tu=ClipX/DDSDESC\dwWidth
  *Sprite3D\Vertice[2]\tv=(ClipY+ClipHeight)/DDSDESC\dwHeight
 
  *Sprite3D\Vertice[3]\tu=(ClipX+ClipWidth)/DDSDESC\dwWidth
  *Sprite3D\Vertice[3]\tv=(ClipY+ClipHeight)/DDSDESC\dwHeight
 
  ProcedureReturn 1 ; return success
EndProcedure
 
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

Bonjour à tous

J'ai modifié légèrement le programme de Comtois
- Tab permet d'autoriser la rotation ou pas et dans le sens de la marche.
- Gus ne marche que lorsqu'il se déplace !
- F1 à F8 permet de changer de personnage

Code : Tout sélectionner



;http://forums.purebasic.com/english/viewtopic.php?t=16878
;http://www.games-creators.org/wiki/PureBasic:PremiersPas

;Déclare les procédures
Declare GestionClavier()
Declare AnimationSprite()
Declare DeplaceSprite()
Declare AfficheTexte()
Declare ClipSprite3D(Sprite3D,ClipX,ClipY,ClipWidth,ClipHeight)
Global Marche, Tourne, Angle, Perso, Serie

Marche=0
Tourne=0
Angle=-1
Perso=0
Structure DDPIXELFORMAT
  dwSize.l
  dwFlags.l
  dwFourCC.l
  dwRGBBitCount.l
  dwRBitMask.l
  dwGBitMask.l
  dwBBitMask.l
  dwRGBAlphaBitMask.l
EndStructure

Structure DDCOLORKEY
  dwColorSpaceLowValue.l
  dwColorSpaceHighValue.l
EndStructure

Structure DDSCAPS2
  dwCaps.l
  dwCaps2.l
  dwCaps3.l
  dwCaps4.l
EndStructure

Structure DDSURFACEDESC2
  dwSize.l
  dwFlags.l
  dwHeight.l
  dwWidth.l
  lPitch.l
  dwBackBufferCount.l
  dwRefreshRate.l
  dwAlphaBitDepth.l
  dwReserved.l
  lpSurface.l
  ddckCKDestOverlay.DDCOLORKEY
  ddckCKDestBlt.DDCOLORKEY
  ddckCKSrcOverlay.DDCOLORKEY
  ddckCKSrcBlt.DDCOLORKEY
  ddpfPixelFormat.DDPIXELFORMAT
  ddsCaps.DDSCAPS2
  dwTextureStage.l
EndStructure

Structure D3DTLVERTEX
  sx.f
  sy.f
  sz.f
  rhw.f
  color.l
  specular.l
  tu.f
  tv.f
EndStructure

Structure PB_Sprite3D
  Texture.IDirectDrawSurface7 ; DirectDrawSurface7
  Vertice.D3DTLVERTEX[4]      ; The 4 vertices for the rectangle sprite
  Width.w          ; width set with ZoomSprite3D()
  Height.w       ; height set with ZoomSprite3D()
  unknown.l
EndStructure

Structure s_Sprite
  Direction.l              ; Direction de l'animation , Haut droite bas ou gauche
  ImageEnCours.l           ; Indique quelle image de l'animation est actuellement en cours
  ImageMaxi.l               ; Nombre d'image maxi pour une animation , ici on a 3 images par direction
  TailleX.l                ; Dimension en X de chaque image
  TailleY.l                ; Dimension en Y de chaque image
  TempsEnCours.l           ; Indique la durée d'affichage de l'image en cours
  TempsMaxi.l              ; Indique la durée maxi d'affichage d'une image avant de passer à la suivante
  x.l                      ; Position en X du sprite
  y.l                      ; Position en Y du sprite
  PasX.l                    ; Vitesse déplacement en X
  PasY.l                    ; Vitesse déplacement en Y
EndStructure

;Déclare 4 constantes
Enumeration
  #AnimeHaut
  #AnimeDroite
  #AnimeBas
  #AnimeGauche
EndEnumeration 

;On déclare un personnage 
Global Gus.s_Sprite

Gus\Direction    = #AnimeDroite            ; On choisit une direction
Gus\ImageMaxi    = 2                       ; (0,1,2) ce qui fait bien 3 images
Gus\ImageEnCours = 0                       ; On se place sur la première image de l'animation
Gus\TailleX      = 24                      ; Taille d'une image
Gus\TailleY      = 32                      ; Taille d'une image
Gus\TempsEnCours = ElapsedMilliseconds() ; Initialise la durée d'affichage de l'ImageEnCours
Gus\TempsMaxi    = 150                     ; Ajuster la vitesse de l'animation ici
Gus\x            = 200                     ; Position à l'écran en X
Gus\y            = 200                     ; Position à l'écran en Y


;Initialise l'environnement nécessaire au fonctionnement des sprites et pour ouvrir un écran.
InitSprite()
InitSprite3D()

;Initialise l'environnement propre à la gestion du clavier.
InitKeyboard()

;Ouvre un nouvel écran avec les caractéristiques Largeur, Hauteur et Profondeur.
OpenScreen(640,480,32,"Tut Sprite")

;Active le support du format PNG (Portable Network Graphic)
UsePNGImageDecoder()
   
;Charge en mémoire le sprite
If LoadSprite(0,"player.png",#PB_Sprite_Texture)=0
  MessageRequester("Erreur","Impossible de charger le sprite Player.png",0)
  End ; Quitte le programme
EndIf   
CreateSprite3D(0,0)
Repeat
  ;Inverse le buffer d'arrière plan avec le buffer visible à l'écran.
  ;La partie invisible du buffer remplace alors complètement La partie visible.
  FlipBuffers()
  
  ;Efface l'écran courant avec la couleur specifiée.
  ClearScreen(0,0,0)
  
  ;Gestion du clavier
  GestionClavier()
  
  ;Affiche un texte à l'écran
  AfficheTexte()
  
  ;Anime le sprite
  AnimationSprite()
  
  ;Deplace et affiche le sprite
  DeplaceSprite()
  
Until KeyboardPushed(#PB_Key_Escape)

End

Procedure AfficheTexte()
  
  StartDrawing(ScreenOutput())
  FrontColor(255,255,0)
  BackColor(0,0,255)
  
  DrawText("Appuyez sur la touche [Echap] pour quitter, F1 à F8 pour changer de GUS et [Tab] pour Rotation " + Str(Tourne))
  StopDrawing()
  
EndProcedure

Procedure GestionClavier()
  
  If ExamineKeyboard()
    Marche=0
    ;La touche haut du curseur est appuyée
    If KeyboardPushed(#PB_Key_Up)
      Marche=1
      Gus\Direction=#AnimeHaut
      Gus\PasY = -1
      
      
      ;La touche droite du curseur est appuyée
    ElseIf KeyboardPushed(#PB_Key_Right)
      Marche=1
      Gus\Direction=#AnimeDroite
      Gus\PasX = 1
      Angle=-1
      ;La touche bas du curseur est appuyée
    ElseIf KeyboardPushed(#PB_Key_Down)
      Marche=1
      Gus\Direction=#AnimeBas
      Gus\PasY = 1
      ;La touche gauche du curseur est appuyée
    ElseIf KeyboardPushed(#PB_Key_Left)
      Marche=1
      Gus\Direction=#AnimeGauche
      Gus\PasX = -1
      Angle=1
    ElseIf KeyboardPushed(#PB_Key_Tab)
      If Tourne 
        Tourne=0
      Else
        Tourne=1
      EndIf
      Delay(300)
    ElseIf KeyboardPushed(#PB_Key_F1)
      Perso=0
      Serie = 0
    ElseIf KeyboardPushed(#PB_Key_F2)
      Perso = 3
      Serie = 0
    ElseIf KeyboardPushed(#PB_Key_F3)
      Perso = 6
      Serie=0
    ElseIf KeyboardPushed(#PB_Key_F4)
      Perso = 9
      Serie = 0
    ElseIf KeyboardPushed(#PB_Key_F5)
      Perso=0
      Serie = 1
    ElseIf KeyboardPushed(#PB_Key_F6)
      Perso = 3
      Serie = 1
    ElseIf KeyboardPushed(#PB_Key_F7)
      Perso = 6
      Serie=1
    ElseIf KeyboardPushed(#PB_Key_F8)
      Perso = 9
      Serie = 1
    EndIf
  EndIf   
  
  
EndProcedure

Procedure AnimationSprite()
  
  ;Test si la durée maxi d'affichage d'une image est dépassée
  If ElapsedMilliseconds()-Gus\TempsEnCours>Gus\TempsMaxi
    
    ;Initialise la durée d'affichage
    Gus\TempsEnCours=ElapsedMilliseconds()
    
    ;Incrémente l'image en cours, pour afficher l'image suivante.
    Gus\ImageEnCours + Marche
    
    ;On reboucle l'animation ici
    If Gus\ImageEnCours>Gus\ImageMaxi+Perso
      
      Gus\ImageEnCours = 0 + Perso
    EndIf
    ;On force l'image 1 si Gus ne marche pas
    If Marche=0
      Gus\ImageEnCours = 1 +Perso
    EndIf
    
  EndIf
  ClipSprite3D(0,Gus\ImageEnCours * Gus\TailleX, (Gus\Direction * Gus\TailleY)+(Serie*128), Gus\TailleX , Gus\TailleY)
  
EndProcedure   
Procedure DeplaceSprite()
  
  Gus\x + Gus\PasX  ; Ajoute le pas en X à la position courante du sprite
  Gus\y + Gus\PasY  ; Ajoute le pas en Y à la position courante du sprite
  Gus\PasX = 0      ; Initialise le pas , il faudra appuyer à nouveau sur une touche pour l'activer
  Gus\PasY = 0      ; Initialise le pas , il faudra appuyer à nouveau sur une touche pour l'activer
  
  ;Affiche le sprite à la nouvelle position
  ;DisplayTransparentSprite(0,Gus\x, Gus\y)
  Start3D()
  DisplaySprite3D(0,Gus\x, Gus\y)
  ZoomSprite3D(0,24,32)
  ; ça tourne , y'a pas de doute, on est bien en 3D 
  If Tourne
    RotateSprite3D(0,Angle,1)
  EndIf 
  Stop3D()
EndProcedure


Procedure ClipSprite3D(Sprite3D,ClipX,ClipY,ClipWidth,ClipHeight)
  ;http://forums.purebasic.com/english/viewtopic.php?t=16878 (S.M.)
  *Sprite3D.PB_Sprite3D=IsSprite3D(Sprite3D)
  
  If *Sprite3D=0:ProcedureReturn 0:EndIf
  *DDS.IDirectDrawSurface7=*Sprite3D\Texture
  
  DDSDESC.DDSURFACEDESC2
  DDSDESC\dwSize=SizeOf(DDSURFACEDESC2)
  Result=*DDS\GetSurfaceDesc(DDSDESC)
  If Result:ProcedureReturn 0:EndIf
  
  *Sprite3D\Vertice[0]\tu=ClipX/DDSDESC\dwWidth
  *Sprite3D\Vertice[0]\tv=ClipY/DDSDESC\dwHeight
  
  *Sprite3D\Vertice[1]\tu=(ClipX+ClipWidth)/DDSDESC\dwWidth
  *Sprite3D\Vertice[1]\tv=ClipY/DDSDESC\dwHeight
  
  *Sprite3D\Vertice[2]\tu=ClipX/DDSDESC\dwWidth
  *Sprite3D\Vertice[2]\tv=(ClipY+ClipHeight)/DDSDESC\dwHeight
  
  *Sprite3D\Vertice[3]\tu=(ClipX+ClipWidth)/DDSDESC\dwWidth
  *Sprite3D\Vertice[3]\tv=(ClipY+ClipHeight)/DDSDESC\dwHeight
  
  ProcedureReturn 1 ; return success
EndProcedure 


Denis

Bonne Jounée à tous
Geoff
Messages : 2
Inscription : mer. 11/janv./2006 13:26

Message par Geoff »

Merci pour vos réponses :wink: , je vais tenter de remédier a mes problemes avec vos solutions.
Pour répondre à Comtoi, je voudrais reprendre mon projet soldat en purebasic, car grace a certaine commande et notament la commande "structure" de purebasic, je pense que je m'y retrouverai mieux dans mon programme.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

je voulais tester la vitesse des fonctions Miroir , c'est très rapide , l'inversion de mon écran 1280x1024 est instantané :)
utilisez les touches [F1],[F2] ou [F3]

Code : Tout sélectionner

;/SnapShot
ExamineDesktops()
hBitmap = CreateImage(0, DesktopWidth(0), DesktopHeight(0))
hdc = StartDrawing(ImageOutput())
SelectObject_(hdc, hBitmap)
BitBlt_(hdc, 0, 0, DesktopWidth(0), DesktopHeight(0), GetDC_(GetDesktopWindow_()), 0, 0, #SRCCOPY)
StopDrawing()
DeleteDC_(hdc) 

If InitSprite() = 0 Or InitKeyboard() = 0
  MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
  End
ElseIf OpenScreen( DesktopWidth(0) , DesktopHeight(0) , DesktopDepth(0) , "Toto" ) = 0
  MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 )
  End
EndIf


CreateSprite(0,DesktopWidth(0) , DesktopHeight(0))
StartDrawing(SpriteOutput(0))
DrawImage(ImageID(),0,0)
StopDrawing()

;Effet miroir
Procedure  MiroirV(Sprite1,Sprite2)
CreateSprite(Sprite2,SpriteWidth(Sprite1),SpriteHeight(Sprite1))
UseBuffer(Sprite2)
For j= 0 To SpriteHeight(Sprite2)-1
   ClipSprite(Sprite1,0,j,SpriteWidth(Sprite2),1)
   DisplaySprite(Sprite1,0,SpriteHeight(Sprite2)-j)
Next j
UseBuffer(-1)
ClipSprite(Sprite1,#PB_Default,#PB_Default,#PB_Default,#PB_Default)
EndProcedure   

Procedure  MiroirH(Sprite1,Sprite2)
CreateSprite(Sprite2,SpriteWidth(Sprite1),SpriteHeight(Sprite1))
UseBuffer(Sprite2)
For i= 0 To SpriteWidth(Sprite2)-1
   ClipSprite(Sprite1,i,0,1,SpriteHeight(Sprite2))
   DisplaySprite(Sprite1,SpriteWidth(Sprite2)-i,0)
Next i
UseBuffer(-1)
ClipSprite(Sprite1,#PB_Default,#PB_Default,#PB_Default,#PB_Default)
EndProcedure   

CopySprite(0,1)

Repeat
ClearScreen(0,0,0)
DisplaySprite(1,0,0)
If ExamineKeyboard()
	If KeyboardReleased(#PB_Key_F1)
		CopySprite(0,1)
	EndIf
	If KeyboardReleased(#PB_Key_F2)
		MiroirV(0,1)
	EndIf
	If KeyboardReleased(#PB_Key_F3)
		MiroirH(0,1)
	EndIf
EndIf
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Répondre