Shaped Sprite Module

Share your advanced PureBasic knowledge/code with the community.
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Shaped Sprite Module

Post by eddy »

Code: Select all

;:=============================================================================
;:- ShapedSprite.pbi
;:- Author          : Eddy
;:- Date            : June 28, 2014
;:- Compiler        : PureBasic 5.30
;:- Target OS       : Mac, Linux, Windows
;:- Source --------------------------------------------------------------------
;:- http://www.purebasic.fr/english/viewtopic.php?f=12&p=447248
;:=============================================================================
CompilerIf Not Defined(MacroBuilder, #PB_Module)
  DeclareModule MacroBuilder
    EnableExplicit    
    Macro _DoubleQuote
      "
    EndMacro    
    Macro _Colon
      :
    EndMacro    
    Macro DefineMacro(_MacroHead, _MacroBody)
      _Colon#Macro _MacroHead#_Colon#_MacroBody#_Colon#EndMacro
    EndMacro    
    Macro Override(_Name, _Prefix=_)
      DefineMacro(_Name, _Prefix#_Name)      
    EndMacro           
  EndDeclareModule  
  Module MacroBuilder
  EndModule
CompilerEndIf

CompilerIf Not Defined(ShapedSprite, #PB_Module)
  DeclareModule ShapedSprite
    EnableExplicit
    Enumeration 
      #FX_Shape_Shake 
      #FX_Shape_Twist
      #FX_Shape_Wave
      #FX_Shape_Stretch
      #FX_Shape_Jiggle
      #FX_Shape_Rotate
      #FX_Shape_SlideIn
      #FX_Shape_SlideOut
      ;#FX_Shape_Wobble
    EndEnumeration
    Declare HandleSprite(Sprite,HandleX.f,HandleY.f)  
    Declare MidHandleSprite(Sprite)
    Declare DeformSprite(Sprite, x0.f, y0.f, x1.f, y1.f, x2.f, y2.f, x3.f, y3.f)
    Declare _ZoomSprite(Sprite,Width.f,Height.f)  
    Declare _RotateSprite(Sprite,Angle.f,Mode=#PB_Absolute)
    Declare TurnSprite(Sprite,Angle.f)
    Declare SkewSprite(Sprite, First.f, Second.f, Vertical=#False)
    Declare.f _SpriteWidth(Sprite)
    Declare.f _SpriteHeight(Sprite)
    Declare.f SpriteHandleX(Sprite)
    Declare.f SpriteHandleX(Sprite)
    Declare.f SpriteAngle(Sprite)
    Declare SaveSpriteShape(Sprite,ShapeName$="")
    Declare RestoreSpriteShape(Sprite,ShapeName$="")
    Declare _CreateSprite(Sprite,Width,Height, Mode=0)
    Declare _CopySprite(Sprite1,Sprite2, Mode=0)
    Declare _LoadSprite(Sprite,FileName$, Mode=0)
    Declare _DisplayTransparentSprite(Sprite,x,y, Intensity=255, Color=#PB_Default)      
    Declare.i CreateSpriteAnimation(Sprite, FrameWidth, FrameHeight, Frame=0, FitFrameSize=#True)
    Declare.i CreateSpriteAnimationSequence(Sprite, SequenceName$, FrameSequence$="")
    Declare AnimateSprite(Sprite, Frame)
    Declare AnimateSpriteSequence(Sprite, SequenceName$, Progress.f)
    Declare AnimateSpriteShape(Sprite, FX, Progress.f, ProgressLag.f, AmplitudeX.f, AmplitudeY.f)
  EndDeclareModule 
  
  Module ShapedSprite
    Structure SPRITE_QUAD
      x.f[4]
      y.f[4]
    EndStructure     
    Structure SPRITE_SEQUENCE
      Array selectedFrames.i(0) 
    EndStructure
    Structure SPRITE_FRAME
      x.i : y.i : w.i : h.i
    EndStructure
    Structure SHAPED_SPRITE
      box.SPRITE_QUAD
      rotated.SPRITE_QUAD      
      deformed.SPRITE_QUAD
      *deformation.SPRITE_QUAD      
      w.f
      h.f
      hx.f
      hy.f
      angle.f      
      selectedFrame.i
      Array frames.SPRITE_FRAME(0)
      Map sequences.SPRITE_SEQUENCE()
    EndStructure
    Global NewMap ShapedSprites.SHAPED_SPRITE()
    
    ;------ Methods to change Sprite Shape
    
    Procedure ReshapeSprite(*s.SHAPED_SPRITE, IsResizing=#True, IsDeforming=#True, IsRotating=#True)
      With *s
        If IsResizing
          \box\x[0]=-\hx : \box\y[0]=-\hy   
          \box\x[1]=\w-\hx : \box\y[1]=-\hy       
          \box\x[2]=\w-\hx : \box\y[2]=\h-\hy       
          \box\x[3]=-\hx : \box\y[3]=\h-\hy       
        EndIf     
        If IsDeforming 
          \deformed=\box
          If \deformation
            Protected i
            For i=0 To 3
              \deformed\x[i]+\deformation\x[i]
              \deformed\y[i]+\deformation\y[i]
            Next
          EndIf 
        EndIf 
        If IsRotating 
          \rotated=\deformed
          If \angle
            Protected radian.f=Radian(\Angle)
            Protected cos.f=Cos(radian), sin.f=Sin(radian)
            For i=0 To 3
              Protected px.f=\rotated\x[i], py.f=\rotated\y[i]
              \rotated\x[i]=cos*px-sin*py
              \rotated\y[i]=sin*px+cos*py
            Next
          EndIf 
        EndIf     
      EndWith   
    EndProcedure
    
    Procedure HandleSprite(Sprite,HandleX.f,HandleY.f)  
      Protected *s.SHAPED_SPRITE=FindMapElement(ShapedSprites(),""+Sprite)
      With *s
        \hx=HandleX
        \hy=HandleY
        ReshapeSprite(*s)
      EndWith   
    EndProcedure 
    
    Procedure MidHandleSprite(Sprite)  
      Protected *s.SHAPED_SPRITE=FindMapElement(ShapedSprites(),""+Sprite)
      With *s
        \hx=\w/2 ; centered horizontaly 
        \hy=\h/2 ; centered verticaly
        ReshapeSprite(*s)
      EndWith   
    EndProcedure
    
    Procedure _ZoomSprite(Sprite,Width.f,Height.f)  
      Protected *s.SHAPED_SPRITE=FindMapElement(ShapedSprites(),""+Sprite)
      With *s
        \w=Width
        \h=Height
        ReshapeSprite(*s)
      EndWith   
    EndProcedure 
    
    Procedure DeformSprite(Sprite, x0.f, y0.f, x1.f, y1.f, x2.f, y2.f, x3.f, y3.f)
      Protected *s.SHAPED_SPRITE=FindMapElement(ShapedSprites(),""+Sprite)
      With *s
        If Not \deformation : \deformation=AllocateMemory(SizeOf(SPRITE_QUAD)) : EndIf 
        \deformation\x[0]=x0 : \deformation\y[0]=y0
        \deformation\x[1]=x1 : \deformation\y[1]=y1
        \deformation\x[2]=x2 : \deformation\y[2]=y2
        \deformation\x[3]=x3 : \deformation\y[3]=y3
        ReshapeSprite(*s,#False)  
      EndWith
    EndProcedure
    
    Procedure _RotateSprite(Sprite,Angle.f,Mode=#PB_Absolute)
      Protected *s.SHAPED_SPRITE=FindMapElement(ShapedSprites(),""+Sprite)
      With *s
        If Mode=#PB_Absolute
          \angle=Angle
        Else 
          \angle+Angle
        EndIf     
        ReshapeSprite(*s,#False,#False)  
      EndWith  
    EndProcedure
    
    Procedure TurnSprite(Sprite,Angle.f)
      Protected *s.SHAPED_SPRITE=FindMapElement(ShapedSprites(),""+Sprite)
      With *s
        \angle+Angle
        ReshapeSprite(*s,#False,#False)  
      EndWith  
    EndProcedure
    
    Procedure SkewSprite(Sprite, First.f, Second.f, Vertical=#False)
      If Vertical
        DeformSprite(Sprite, 0, First, 0, Second, 0, Second, 0, First)
      Else
        DeformSprite(Sprite, First, 0, First, 0, Second, 0, Second, 0)
      EndIf
    EndProcedure
    
    ;------ Methods to save/restore Sprite Shape
    
    Procedure SaveSpriteShape(Sprite,ShapeName$="")
      Protected *s.SHAPED_SPRITE=FindMapElement(ShapedSprites(),""+Sprite)
      With *s
        If ShapeName$="" : ShapeName$+"DEFAULT_"+Sprite : EndIf                 
        Protected *shape.SHAPED_SPRITE=AddMapElement(ShapedSprites(),ShapeName$)          
        CopyStructure(*s,*shape,SHAPED_SPRITE)
      EndWith 
    EndProcedure 
    
    Procedure RestoreSpriteShape(Sprite,ShapeName$="")
      Protected *s.SHAPED_SPRITE=FindMapElement(ShapedSprites(),""+Sprite)
      With *s
        If ShapeName$="" : ShapeName$+"DEFAULT_"+Sprite : EndIf                 
        Protected *shape.SHAPED_SPRITE=FindMapElement(ShapedSprites(),ShapeName$)
        CopyStructure(*shape,*s,SHAPED_SPRITE)
      EndWith 
    EndProcedure
    
    ;------ Methods to create/display Sprite
    
    Procedure _LoadSprite(Sprite,FileName$, Mode=0)
      Protected Result=LoadSprite(Sprite,FileName$,Mode)
      If Sprite=#PB_Any : Sprite=Result : EndIf       
      ;init shape
      Protected *s.SHAPED_SPRITE=AddMapElement(ShapedSprites(),""+Sprite)      
      With *s
        StartDrawing(SpriteOutput(Sprite))
        \w=OutputWidth()
        \h=OutputHeight()   
        \frames(0)\w=OutputWidth()  
        \frames(0)\h=OutputHeight()
        StopDrawing()        
      EndWith
      MidHandleSprite(Sprite)
      ;save default shape
      SaveSpriteShape(Sprite)
      
      ProcedureReturn Result      
    EndProcedure
    
    Procedure _CopySprite(Sprite1,Sprite2, Mode=0)
      Protected Result=CopySprite(Sprite1,Sprite2,Mode)
      If Sprite2=#PB_Any : Sprite2=Result : EndIf
      ;copy shape
      Protected *s.SHAPED_SPRITE=AddMapElement(ShapedSprites(),""+Sprite2)
      RestoreSpriteShape(Sprite2,""+Sprite1)
      ;save default shape
      SaveSpriteShape(Sprite2)
      
      ProcedureReturn Result
    EndProcedure
    
    Procedure _CreateSprite(Sprite,Width,Height, Mode=0)
      Protected Result=CreateSprite(Sprite,Width,Height,Mode)
      If Sprite=#PB_Any : Sprite=Result : EndIf       
      ;init shape
      Protected *s.SHAPED_SPRITE=AddMapElement(ShapedSprites(),""+Sprite)      
      With *s
        \w=Width
        \h=Height   
        \frames(0)\w=Width  
        \frames(0)\h=Height
      EndWith
      MidHandleSprite(Sprite)
      ;save default shape
      SaveSpriteShape(Sprite)
      
      ProcedureReturn Result
    EndProcedure
    
    Procedure _DisplayTransparentSprite(Sprite,x,y, Intensity=255, Color=#PB_Default)  
      Protected *s.SHAPED_SPRITE=FindMapElement(ShapedSprites(),""+Sprite)
      With *s
        TransformSprite(Sprite,
                        \rotated\x[0],\rotated\y[0], 
                        \rotated\x[1],\rotated\y[1],
                        \rotated\x[2],\rotated\y[2], 
                        \rotated\x[3],\rotated\y[3])
        DisplayTransparentSprite(Sprite,x,y,Intensity,Color)
      EndWith 
    EndProcedure 
    
    ;------ Methods to get Sprite Properties
    
    Procedure.f _SpriteWidth(Sprite)
      Protected *s.SHAPED_SPRITE=FindMapElement(ShapedSprites(),""+Sprite)
      ProcedureReturn *s\w
    EndProcedure
    
    Procedure.f _SpriteHeight(Sprite)
      Protected *s.SHAPED_SPRITE=FindMapElement(ShapedSprites(),""+Sprite)
      ProcedureReturn *s\h
    EndProcedure
    
    Procedure.f SpriteAngle(Sprite)
      Protected *s.SHAPED_SPRITE=FindMapElement(ShapedSprites(),""+Sprite)
      ProcedureReturn *s\angle
    EndProcedure
    
    Procedure.f SpriteHandleX(Sprite)
      Protected *s.SHAPED_SPRITE=FindMapElement(ShapedSprites(),""+Sprite)
      ProcedureReturn *s\hx
    EndProcedure
    
    Procedure.f SpriteHandleY(Sprite)
      Protected *s.SHAPED_SPRITE=FindMapElement(ShapedSprites(),""+Sprite)
      ProcedureReturn *s\hy
    EndProcedure
    
    ;------ Methods to Animate Sprite
    
    Procedure AnimateSprite(Sprite, Frame)
      Protected *s.SHAPED_SPRITE=FindMapElement(ShapedSprites(),""+Sprite)
      With *s\frames(Frame)
        *s\selectedFrame=Frame
        ClipSprite(Sprite,\x,\y,\w,\h)
      EndWith       
    EndProcedure 
    
    Procedure AnimateSpriteSequence(Sprite, SequenceName$, Progress.f)
      Protected *s.SHAPED_SPRITE=FindMapElement(ShapedSprites(),""+Sprite)
      With *s
        FindMapElement(\sequences(),SequenceName$)
        Protected sequenceLength = ArraySize(\sequences()\selectedFrames())+1
        Protected num=Int(sequenceLength *Progress) % sequenceLength
        AnimateSprite(Sprite,\sequences()\selectedFrames(num))
      EndWith       
    EndProcedure     
    
    Procedure AnimateSpriteShape(Sprite, FX, Progress.f, ProgressLag.f, AmplitudeX.f, AmplitudeY.f)
      Protected *s.SHAPED_SPRITE=FindMapElement(ShapedSprites(),""+Sprite)
      With *s
        Protected a0.f, a1.f, cos.f, sin.f, px.f, py.f,i 
        Protected x0.f, y0.f, x1.f, y1.f, x2.f, y2.f, x3.f, y3.f
        Select FX            
          Case #FX_Shape_Twist
            a0=progress*2*#PI
            a1=ProgressLag*2*#PI              
            x0=AmplitudeX* Cos(a0):y0=AmplitudeY* Sin(a0) : a0+a1
            x1=AmplitudeX* Cos(a0):y1=AmplitudeY* Sin(a0) : a0+a1
            x2=AmplitudeX* Cos(a0):y2=AmplitudeY* Sin(a0) : a0+a1
            x3=AmplitudeX* Cos(a0):y3=AmplitudeY* Sin(a0)
            
          Case #FX_Shape_Shake
            If AmplitudeX
              a0=1-Mod(Progress,1)            
              x0=a0*(AmplitudeX-2*Random(AmplitudeX))
              x1=x0 : x2=x0 : x3=x0
            EndIf 
            If AmplitudeY
              a1=1-Mod(Progress+ProgressLag,1)
              y0=a1*(AmplitudeY-2*Random(AmplitudeY))
              y1=y0 : y2=y0 : y3=y0
            EndIf 
            
          Case #FX_Shape_Stretch            
            If AmplitudeX
              a0=(progress)*2*#PI            
              x1=AmplitudeX * Sin(a0) : x2=x1
              x0=-x1 : x3=-x1
            EndIf 
            If AmplitudeY
              a1=(progress+ProgressLag)*2*#PI                          
              y0=AmplitudeY * Sin(a1) : y1=y0
              y2=-y0 : y3=-y0
            EndIf
            
          Case #FX_Shape_Wave
            a0=(progress)*2*#PI
            a1=(progress+ProgressLag)*2*#PI              
            If AmplitudeX
              x0=AmplitudeX * Sin(a0) : x1=x0            
              x2=AmplitudeX * Sin(a1) : x3=x2              
            EndIf 
            If AmplitudeY
              y0=AmplitudeY * Sin(a0) : y3=y0
              y1=AmplitudeY * Sin(a1) : y2=y1
            EndIf
            
          Case #FX_Shape_Jiggle
            a0=(progress*ProgressLag)*2*#PI
            a1=(progress)*2*#PI                          
            px=AmplitudeX * Cos(a0)
            py=AmplitudeY * Sin(a0)
            cos=Cos(a1) : sin=Sin(a1)
            x0=cos*px-sin*py
            y0=sin*px+cos*py
            x1=x0 : x2=x0 : x3=x0                
            y1=y0 : y2=y0 : y3=y0                
            
          Case #FX_Shape_Rotate
            a0=(progress+ProgressLag)*2*#PI
            cos.f=Cos(a0) : sin.f=Sin(a0)
            For i=0 To 3
              px.f=\box\x[i] : py.f=\box\y[i]
              \deformed\x[i]=cos*px-sin*py
              \deformed\y[i]=sin*px+cos*py
            Next            
            ReshapeSprite(*s,#False,#False)
            ProcedureReturn 
            
            
          Case #FX_Shape_SlideIn
            a0=(1-Mod(Progress,1))
            Protected *frame.SPRITE_FRAME=\frames(\selectedFrame)
            If AmplitudeY>0
              y2=-\h*a0
              y3=y2          
            ElseIf AmplitudeY<0 
              y0=\h*a0
              y1=y0
            EndIf
            If AmplitudeX>0
              x1=-\w*a0
              x2=x1
            ElseIf AmplitudeX<0 
              x0=\w*a0              
              x3=x0
            EndIf            
            
        Case #FX_Shape_SlideOut
            a0=Mod(Progress,1)
            If AmplitudeY>0
              y2=-\h*a0
              y3=y2
            ElseIf AmplitudeY<0 
              y0=\h*a0
              y1=y0
            EndIf
            If AmplitudeX>0
              x1=-\w*a0
              x2=x1
            ElseIf AmplitudeX<0 
              x0=\w*a0              
              x3=x0
            EndIf
        EndSelect
        DeformSprite(Sprite, x0.f, y0.f, x1.f, y1.f, x2.f, y2.f, x3.f, y3.f)
      EndWith      
    EndProcedure    
    
    Procedure.i CreateSpriteAnimation(Sprite, FrameWidth, FrameHeight, Frame=0, FitFrameSize=#True)
      Protected *s.SHAPED_SPRITE=FindMapElement(ShapedSprites(),""+Sprite)
      With *s
        StartDrawing(SpriteOutput(Sprite))
        Protected imageW=OutputWidth(),col,lastCol=imageW/FrameWidth
        Protected imageH=OutputHeight(),row,lastRow=imageH/FrameHeight
        Protected num=0,frameCount=lastCol * lastRow      
        StopDrawing()
        ;init all animation frames
        ReDim \frames(frameCount-1)
        For row=0 To lastRow-1 
          For col=0 To lastCol-1 
            \frames(num)\x=col * FrameWidth
            \frames(num)\y=row * FrameHeight
            \frames(num)\w=FrameWidth
            \frames(num)\h=FrameHeight
            num+1            
          Next 
        Next   
        ;select default sprite frame
        AnimateSprite(Sprite, Frame)
        If FitFrameSize : _ZoomSprite(Sprite,FrameWidth,FrameHeight) : EndIf 
      EndWith 
      ProcedureReturn frameCount
    EndProcedure  
    
    Procedure.i CreateSpriteAnimationSequence(Sprite, SequenceName$, FrameSequence$="")
      Protected *s.SHAPED_SPRITE=FindMapElement(ShapedSprites(),""+Sprite)
      With *s
        AddMapElement(\sequences(), SequenceName$)
        Protected num, sequenceLength
        If FrameSequence$=""
          sequenceLength=ArraySize(\frames())+1
          ReDim \sequences()\selectedFrames(sequenceLength-1)
          For num=0 To sequenceLength-1
            \sequences()\selectedFrames(num)=num
          Next         
        Else 
          sequenceLength=CountString(FrameSequence$,",")+1
          ReDim \sequences()\selectedFrames(sequenceLength-1)
          For num=0 To sequenceLength-1
            \sequences()\selectedFrames(num)=Val(StringField(FrameSequence$,num+1,","))
          Next       
        EndIf         
      EndWith
      ProcedureReturn sequenceLength
    EndProcedure
  EndModule
  
  UseModule ShapedSprite
  UseModule MacroBuilder  
  Override(ZoomSprite)
  Override(RotateSprite)
  Override(SpriteWidth)
  Override(SpriteHeight)
  Override(CreateSprite)
  Override(LoadSprite)
  Override(CopySprite)
  Override(DisplayTransparentSprite)
CompilerEndIf
Last edited by eddy on Fri Jul 04, 2014 8:07 pm, edited 8 times in total.
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Re: Shaped Sprite Module

Post by eddy »

Code: Select all

; *************************
; EXAMPLE 1
; *************************

InitSprite()
OpenWindow(0, 0, 0, 370, 370, "Save/Load sprite shape!", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)  
OpenWindowedScreen(WindowID(0), 10, 10, 350, 350, 0, 0, 0)

CreateSprite(0, 200,200, #PB_Sprite_AlphaBlending)
StartDrawing(SpriteOutput(0)) 
DrawingMode(#PB_2DDrawing_AlphaBlend)
Box(0,0,200,200,RGBA(255,255,255,255))
DrawingMode(#PB_2DDrawing_AlphaChannel)
Box(50,50,100,100,RGBA(0,0,0,50))
StopDrawing()

ZoomSprite(0,50,50)
MidHandleSprite(0)
SaveSpriteShape(0)  

ZoomSprite(0,150,150)
MidHandleSprite(0)
RotateSprite(0,45)
SaveSpriteShape(0,"Bigger")  

CopySprite(0,1, #PB_Sprite_AlphaBlending)
ZoomSprite(1,10,100)
MidHandleSprite(1)
SkewSprite(1,50,-50,#True)  

Repeat
  ClearScreen(RGB(0,10,100))
    
  RestoreSpriteShape(0)
  DisplayTransparentSprite(0, 150,110, 255, RGB(255,60,90))
  
  RestoreSpriteShape(0,"Bigger")  
  DisplayTransparentSprite(0, 150,110, 255)
  
  TurnSprite(1,0.5)
  DisplayTransparentSprite(1, 150,110, 255, RGB(0,255,255))
  
  FlipBuffers()     
Until WindowEvent()=#PB_Event_CloseWindow

Code: Select all

; *************************
; EXAMPLE 2
; *************************

InitSprite()
OpenWindow(0, 0, 0, 370, 370, "Deform sprites", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)  
OpenWindowedScreen(WindowID(0), 10, 10, 350, 350, 0, 0, 0)

CreateSprite(0, 100,100, #PB_Sprite_AlphaBlending)
StartDrawing(SpriteOutput(0)) 
DrawingMode(#PB_2DDrawing_AlphaChannel)
Box(0,0,100,100,0)
DrawingMode(#PB_2DDrawing_AlphaBlend)
Circle(50,50,49,RGBA(255,255,255,255))
DrawingMode(#PB_2DDrawing_AlphaChannel)
Circle(60,60,35,RGBA(0,0,0,100))
StopDrawing()

Dim x.f(3)
Dim y.f(3)
a.f=0
r.f=5

Repeat
  ClearScreen(RGB(0,10,100))
  
  RestoreSpriteShape(0)
  a+1
  For i=0 To 3
    x(i)=r*Cos(Radian(a*10)+i*#PI/4)
    y(i)=r*Sin(Radian(a*10)+i*#PI/4)
  Next   
  DeformSprite(0,x(0),y(0),x(1),y(1),x(2),y(2),x(3),y(3))
  DisplayTransparentSprite(0, 150,110,200)
  
  HandleSprite(0,50,0)
  RotateSprite(0,a)
  ZoomSprite(0,70,70)
  DisplayTransparentSprite(0, 150,110)  
  
  FlipBuffers()     
Until WindowEvent()=#PB_Event_CloseWindow
Last edited by eddy on Sun Jun 29, 2014 12:07 pm, edited 2 times in total.
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Re: Shaped Sprite Module

Post by eddy »

Code: Select all

; *************************
; EXAMPLE 3
; *************************

InitSprite()
OpenWindow(0, 0, 0, 370, 370, "Sprite animation", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)  
OpenWindowedScreen(WindowID(0), 10, 10, 350, 350, 0, 0, 0)

CreateImage(0, 90,90, 32,RGB(0,0,0))
fnt=LoadFont(0, "Impact", 19)
StartDrawing(ImageOutput(0)) 
DrawingFont(fnt)
For j=0 To 2
  For i=0 To 2
    DrawText(i*30+9,j*30-2,""+num,RGBA(255,255,255,255)) : num+1
  Next 
Next 
StopDrawing()
SaveImage(0,"test.bmp",#PB_ImagePlugin_BMP) 

LoadSprite(0,"test.bmp", #PB_Sprite_AlphaBlending)
TransparentSpriteColor(0,0)
animFrames=CreateSpriteAnimation(0, 30,30)
anim=0

Repeat
  ClearScreen(RGB(0,10,100))
  
  anim=(ElapsedMilliseconds()/100) % animFrames
  AnimateSprite(0,anim)
  DisplayTransparentSprite(0, 150,110)
    
  FlipBuffers()     
Until WindowEvent()=#PB_Event_CloseWindow

Code: Select all

; *************************
; EXAMPLE 4
; *************************

InitSprite()
OpenWindow(0, 0, 0, 370, 370, "Sprite animated sequence", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)  
OpenWindowedScreen(WindowID(0), 10, 10, 350, 350, 0, 0, 0)

CreateImage(0, 90,90, 32,RGB(0,0,0))
fnt=LoadFont(0, "Impact", 19)
StartDrawing(ImageOutput(0)) 
DrawingFont(fnt)
For j=0 To 2
  For i=0 To 2
    DrawText(i*30+9,j*30-2,""+num,RGBA(255,255,255,255)) : num+1
  Next 
Next 
StopDrawing()
SaveImage(0,"test.bmp",#PB_ImagePlugin_BMP) 

LoadSprite(0,"test.bmp", #PB_Sprite_AlphaBlending)
TransparentSpriteColor(0,0)
CreateSpriteAnimation(0,30,30)
CreateSpriteAnimationSequence(0,"PingPong","0,1,2,3,4,3,2,1")
CreateSpriteAnimationSequence(0,"FullLoop")                   

animProgress.f=0

Repeat
  ClearScreen(RGB(0,10,100))
  
  animProgress=(ElapsedMilliseconds()/3000) ;animation takes 3 seconds to loop
  
  AnimateSpriteSequence(0,"PingPong", animProgress) ;animation 0 -> 4 -> 0
  DisplayTransparentSprite(0, 150,110)
  
  AnimateSpriteSequence(0,"FullLoop", animProgress) ;animation 0 -> 8
  DisplayTransparentSprite(0, 150,210)
  
  FlipBuffers()     
Until WindowEvent()=#PB_Event_CloseWindow
Last edited by eddy on Fri Jul 04, 2014 8:07 pm, edited 5 times in total.
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
User avatar
idle
Always Here
Always Here
Posts: 5836
Joined: Fri Sep 21, 2007 5:52 am
Location: New Zealand

Re: Shaped Sprite Module

Post by idle »

Thanks Eddy, it appears to work on ubuntu 12.04 x64
Windows 11, Manjaro, Raspberry Pi OS
Image
User avatar
Demivec
Addict
Addict
Posts: 4260
Joined: Mon Jul 25, 2005 3:51 pm
Location: Utah, USA

Re: Shaped Sprite Module

Post by Demivec »

Thanks for sharing this. :)

Where is CreateSpriteAnimationSequence() defined?
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Re: Shaped Sprite Module

Post by eddy »

Demivec wrote: Where is CreateSpriteAnimationSequence() defined?
I updated the sprite lib above.
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Re: Shaped Sprite Module

Post by eddy »

[updated]
- bug fixed : replace CopyMemory by CopyStructure (because copyMemory cannot handle complex nested structure)
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Re: Shaped Sprite Module

Post by eddy »

[Updated]
- animated FX

Code: Select all

; *************************
; EXAMPLE 5
; *************************

InitSprite()
OpenWindow(0, 0, 0, 500, 500, "Sprite animated effect", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)  
OpenWindowedScreen(WindowID(0), 10, 10, WindowWidth(0)-20, WindowHeight(0)-20, 0, 0, 0)

CreateImage(0, 90,90, 32,#PB_Image_Transparent )
StartDrawing(ImageOutput(0)) 
DrawingMode(#PB_2DDrawing_AlphaBlend)
Box(0,0,90,90,RGBA(255, 255, 200,10))
Box(10,10,70,70,RGBA(200, 100, 10,10))
StopDrawing()
SaveImage(0,"polygon.bmp",#PB_ImagePlugin_BMP, 32) 

LoadSprite(0,"polygon.bmp", #PB_Sprite_AlphaBlending)
ZoomSprite(0,20,100)
HandleSprite(0,10,0)
SaveSpriteShape(0,"Long")

RestoreSpriteShape(0)
ZoomSprite(0,40,40)
MidHandleSprite(0)
SaveSpriteShape(0,"Square")

ZoomSprite(Sprite, 10,10)
MidHandleSprite(Sprite)
SaveSpriteShape(0,"Mini")    

Dim SlideX.f(3) : Dim SlideY.f(3)
SlideX(0)=0   : SlideY(0)=-1
SlideX(1)=0   : SlideY(1)=1
SlideX(2)=-1  : SlideY(2)=0
SlideX(3)=1   : SlideY(3)=0

Progress.f=0
Repeat
  ClearScreen(RGB(50,10,100))
  
  Progress=(ElapsedMilliseconds()/1000)
  
  SpriteBlendingMode(#PB_Sprite_BlendSourceAlpha,#PB_Sprite_BlendInvertSourceAlpha)
  RestoreSpriteShape(0,"Long")
  AnimateSpriteShape(0,#FX_Shape_Wave,Progress,0.2,10,0)
  DisplayTransparentSprite(0, 300,10,200)  
  AnimateSpriteShape(0,#FX_Shape_Wave,Progress+0.2,0.2,10,0)
  DisplayTransparentSprite(0, 300,110,200)
  
  SpriteBlendingMode(#PB_Sprite_BlendDestinationColor,#PB_Sprite_BlendSourceColor)
  RestoreSpriteShape(0,"Mini")    
  For i=0 To 3
    AnimateSpriteShape(0,#FX_Shape_Jiggle,Progress,0.25*i,5,15)
    DisplayTransparentSprite(0, 60+60*i,20,100)  
  Next   
  RestoreSpriteShape(0, "Square")
  For i=0 To 3
    AnimateSpriteShape(0,#FX_Shape_SlideIn,Progress/2,0.25*i,SlideX(i),SlideY(i))
    DisplayTransparentSprite(0, 60+60*i,80,100)  
    
    AnimateSpriteShape(0,#FX_Shape_SlideOut,Progress/2,0.25*i,SlideX(i),SlideY(i))
    DisplayTransparentSprite(0, 60+60*i,140,100)  
    
    AnimateSpriteShape(0,#FX_Shape_Shake,Progress,0.25*i,10,5)
    DisplayTransparentSprite(0, 60+60*i,200,100)  
    
    AnimateSpriteShape(0,#FX_Shape_Twist,Progress,0.25*i,5,5)
    DisplayTransparentSprite(0, 60+60*i,260,100)  
  
    AnimateSpriteShape(0,#FX_Shape_Stretch,Progress,0.25*i,5,5)
    DisplayTransparentSprite(0, 60+60*i,320,100)  
    
    AnimateSpriteShape(0,#FX_Shape_Wave,Progress,0.25*i,5,5)
    DisplayTransparentSprite(0, 60+60*i,380,100) 
  
    AnimateSpriteShape(0,#FX_Shape_Rotate,Progress/2,0.1*i,5,5)
    DisplayTransparentSprite(0, 60+60*i,440,100) 
  Next 
  
  FlipBuffers()     
Until WindowEvent()=#PB_Event_CloseWindow
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
Post Reply