Download Code & Graphics
Code: Select all
;ClipSprite3D by S.M.
;Graphics & Animated Sprite w/Alpha by J. Baker
;PureBasic v4.30 (x86)
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
Procedure ClipSprite3D(Sprite3D,ClipX,ClipY,ClipWidth,ClipHeight)
  *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
If InitSprite() = 0 Or InitKeyboard() = 0
  MessageRequester("Error", "Sprite system can't be initialized", 0)
  End
EndIf
If InitSprite3D() = 0
  MessageRequester("Error", "Sprite3D system can't be initialized correctly", 0)
  End
EndIf
UsePNGImageDecoder()
If OpenWindow(0, 0, 0, 640, 480, "Animated Sprite", #PB_Window_SystemMenu| #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
    If OpenWindowedScreen(WindowID(0), 0, 0, 640, 480, 0, 0, 0)
    Else
      MessageRequester("Error", "Can't open windowed screen!", 0)
      End
    EndIf
  EndIf
  CatchSprite(0, ?Pic1, #PB_Sprite_AlphaBlending | #PB_Sprite_Texture)
  CatchSprite(1, ?Pic2)
  ;LoadSprite(0, "flower.png", #PB_Sprite_AlphaBlending | #PB_Sprite_Texture)
  CreateSprite3D(0, 0)
  CreateSprite3D(1, 0)
  CreateSprite3D(2, 0)
  
  Sprite3DQuality(1)
  
  ;LoadSprite(1, "scene.png", 0)
  
  iW = 0
  iH = 0
  
  Repeat
    ; It's very important to process all the events remaining in the queue at each frame
    ;
    
    If Start3D()
      DisplaySprite(1, 0, 0)
      ZoomSprite3D(0, 160, 120)
      ClipSprite3D(0, iW, iH, 160, 120)
      DisplaySprite3D(0, 20, 340)
      DisplaySprite3D(0, 160, 340)
      DisplaySprite3D(0, 300, 340)
      DisplaySprite3D(0, 440, 340)
      
      
     If iW = 160 And iH = 360
      iW = 0
      iH = 0
     EndIf
      
       Delay(166) ;roughly 6 fps
       
      iW +160
     If iW = 640
      iH +120
      iW = 0 
     EndIf
      
      Stop3D()
    EndIf
    
    Repeat
      Event = WindowEvent()
      
      
      
      If Event = #PB_Event_CloseWindow
        End 
      EndIf
    Until Event = 0
    
    FlipBuffers() 
    ClearScreen(RGB(0, 96, 159))
    ;Delay(1)
  ForEver
  
Pic1: IncludeBinary "flower.png"
Pic2: IncludeBinary "scene.png"
