Sprite3D: FX, anim, flip, deform, handle, transitions...

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

Sprite3D: FX, anim, flip, deform, handle, transitions...

Post by eddy »

I started to convert the source code from PB4.40 to PB4.50 some day ago. :mrgreen:
FX functions are missing because I didn't finish to convert them.

:arrow: features version 0.95
- requirement : PB 4.50+
- view
- layer : zorder, FX, visibility
- sprite : zorder, FX, visibility, color, gradient, transparency, handle, flipsprite, image frames, deformation, attach or detach sprite child
- predefined FX :
  • rotation, move, mouse control, animation, autoremove, emitter
  • face object, follow object (with damping option)
  • snap object, vortex object, orbit object
  • SineScale, SineRotate, SineMove
  • shake, blink, jiggle
- deformation FX
  • Skew, Stretch, Perspective
- transition FX :
  • color, transparency, animation
  • move, scale, angle (with 31 easing modes)
:arrow: how to test
- for windows : you will have to copy the Engine3D.dll from the PureBasic/Compilers directory to your main project directory.
- for linux and mac : you will have to copy the Engine3D.so from the PureBasic/Compilers directory to your main project directory

:arrow: download http://gssprite.svn.sourceforge.net/vie ... z?view=tar

Image ImageImage

Uploaded with ImageShack.us
Last edited by eddy on Fri Aug 20, 2010 11:31 pm, edited 25 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: Sprite3D engine with FX [cross-platform]

Post by eddy »

Code: Select all

Declare InitSpriteScreen(maxView=$FF, maxLayer=$FF, maxSprite=$FFFF, maxFX=$FFFFF, maxTransition=$FFFF)
Declare InitEase()
Declare.i UseView(*View.GS_VIEW=0)
Declare.i UseLayer(*Layer.GS_LAYER=0)
Declare.b IsView(View)
Declare.b IsLayer(Layer)
Declare.b IsSprite(Sprite)
Declare.b IsFX(FX)
Declare.b IsTransition(Transition)
Declare.i ViewID(View)
Declare.i LayerID(Layer)
Declare.i SpriteID(Sprite)
Declare.i FxID(FX)
Declare.i TransitionID(Transition)
Declare AutoMidHandle(enabled=#True)
Declare AutoApplyFX(enabled=#True)
Declare.i CountViews()
Declare.i CountLayers()
Declare.i CountSprites()
Declare.i CountFX()
Declare.i CountViewLayers(View)
Declare.i CountLayerFX(Layer)
Declare.i CountLayerSprites(Layer)
Declare.i CountSpriteFX(Sprite)
Declare.i CountSpriteChildren(Sprite)
Declare ClearViews()
Declare ClearViewLayers(View)
Declare ClearLayerFXs(Layer)
Declare ClearLayerSprites(Layer)
Declare ClearSpriteFXs(Sprite)
Declare ClearSpriteChildren(Sprite)
Declare OpenSpriteScreen(Width, Height, Title$, Fullscreen=#True, FlipMode=#PB_Screen_WaitSynchronization)
Declare CloseSpriteScreen()
Declare.i SpriteScreenWidth()
Declare.i SpriteScreenHeight()
Declare.i CreateView(View, x, y, Width, Height, Color=$000000, RenderMode=#View_Render_Textured)
Declare FreeView(View)
Declare SetViewRendering(View, RenderMode)
Declare SetViewBackColor(View, Color)
Declare.i ViewRendering(View)
Declare.i ViewBackColor(View)
Declare.i ViewX(View)
Declare.i ViewY(View)
Declare.i ViewWidth(View)
Declare.i ViewHeight(View)
Declare.i CreateLayer(Layer, TextureFile$, BlendMode=#Layer_Blend_Alpha, FilterMode=#Layer_Filter_Bilinear)
Declare FreeLayer(Layer)
Declare SetLayerOrder(Layer, Order)
Declare SetLayerFrameCount(Layer, FrameCount)
Declare SetLayerFrame(Layer, Frame, x, y, Width, Height)
Declare SetLayerFrameGrid(Layer, Columns, Rows)
Declare SetLayerBlend(Layer, BlendMode)
Declare SetLayerFilter(Layer, FilterMode)
Declare SetLayerTransparency(Layer, Transparency)
Declare SetLayerHandle(Layer, HandleX.f, HandleY.f)
Declare ScaleLayer(Layer, ScaleX.f, ScaleY.f)
Declare PositionLayer(Layer, x.f, y.f)
Declare MoveLayer(Layer, x.f, y.f)
Declare RotateLayer(Layer, angle.f)
Declare TurnLayer(Layer, angle.f)
Declare HideLayer(Layer, Hide.b)
Declare.i ApplyLayerFX(Layer, FX=#PB_Ignore)
Declare.i LayerOrder(Layer)
Declare.i LayerFrameCount(Layer)
Declare.i LayerBlend(Layer)
Declare.i LayerFilter(Layer)
Declare.i LayerTransparency(Layer)
Declare.f LayerTextureWidth(Layer)
Declare.f LayerTextureHeight(Layer)
Declare.f LayerScaleX(Layer)
Declare.f LayerScaleY(Layer)
Declare.f LayerHandleX(Layer)
Declare.f LayerHandleY(Layer)
Declare.f LayerAngle(Layer)
Declare.f LayerX(Layer)
Declare.f LayerY(Layer)
Declare.b LayerHidden(Layer)
Declare.i CreateSprite(Sprite, x, y, Width=#PB_Ignore, Height=#PB_Ignore)
Declare FreeSprite(Sprite)
Declare SetSpriteOrder(Sprite, Order)
Declare SetSpriteColor(Sprite, Color)
Declare SetSpriteFrame(Sprite, Frame)
Declare SetSpriteTransparency(Sprite, Transparency)
Declare SetSpriteGradient(Sprite, Vertical, Color1, Color2, Transparency1=255, Transparency2=255)
Declare SetSpriteHandle(Sprite, HandleX.f, HandleY.f)
Declare DeformSprite(Sprite, dx1.f, dy1.f, dx2.f, dy2.f, dx3.f, dy3.f, dx4.f, dy4.f)
Declare ScaleSprite(Sprite, ScaleX.f, ScaleY.f)
Declare PositionSprite(Sprite, x.f, y.f)
Declare MoveSprite(Sprite, x.f, y.f)
Declare RotateSprite(Sprite, angle.f)
Declare TurnSprite(Sprite, angle.f)
Declare HideSprite(Sprite, Hide.b)
Declare FlipSprite(Sprite, FlipX.b, FlipY.b)
Declare RandomSpritePosition(Sprite, x1.f, x2.f, y1.f=#PB_Ignore, y2.f=#PB_Ignore)
Declare RandomSpriteAngle(Sprite, angle1.f=0, angle2.f=360)
Declare RandomSpriteScale(Sprite, ScaleX1.f, ScaleX2.f, ScaleY1.f=#PB_Ignore, ScaleY2.f=#PB_Ignore)
Declare RandomSpriteTransparency(Sprite, Transparency1, Transparency2)
Declare RandomSpriteFrame(Sprite, Frame1=#PB_Ignore, Frame2=#PB_Ignore)
Declare.i ApplySpriteFX(Sprite, FX=#PB_Ignore)
Declare.i MakeSpriteTarget(Sprite)
Declare.i AttachSpriteChild(Sprite, ChildSprite, OffsetX=0, OffsetY=0, Duration=#PB_Ignore, Delay=#PB_Ignore)
Declare.i DetachSpriteChild(Sprite, ChildSprite, NoTimeCheck.b=#True)
Declare.i SpriteChild(Sprite, ChildIndex)
Declare.i SpriteOrder(Sprite)
Declare.i SpriteColor(Sprite)
Declare.i SpriteFrame(Sprite)
Declare.i SpriteTransparency(Sprite)
Declare.f SpriteScaleX(Sprite)
Declare.f SpriteScaleY(Sprite)
Declare.f SpriteHandleX(Sprite)
Declare.f SpriteHandleY(Sprite)
Declare.f SpriteAngle(Sprite)
Declare.f SpriteX(Sprite)
Declare.f SpriteY(Sprite)
Declare.i SpriteWidth(Sprite)
Declare.i SpriteHeight(Sprite)
Declare.b SpriteFlipX(Sprite)
Declare.b SpriteFlipY(Sprite)
Declare.b SpriteHidden(Sprite)
Declare.i CreateTransitionsFX(FX, Transition, Duration=#PB_Ignore, Delay=#PB_Ignore, LoopCount=#PB_Ignore)
Declare.i CreateMouseControlFX(FX, OffsetX=0, OffsetY=0, Duration=#PB_Ignore, Delay=#PB_Ignore)
Declare.i CreateMoveFX(FX, SpeedX.f, SpeedY.f, AngleRelative.b=#False, Duration=#PB_Ignore, Delay=#PB_Ignore)
Declare.i CreateRotateFX(FX, SpeedAngle.f=360, Duration=#PB_Ignore, Delay=#PB_Ignore, LoopCount=#PB_Ignore)
Declare.i CreateTargetFX(FX, Duration=#PB_Ignore, Delay=#PB_Ignore)
Declare.i CreateSnapTargetFX(FX, TargetSprite, OffsetX=0, OffsetY=0, AngleRelative.b=#False, Duration=#PB_Ignore, Delay=#PB_Ignore)
Declare.i CreateFaceTargetFX(FX, TargetSprite, OffsetX=0, OffsetY=0, Damping.f=1, Duration=#PB_Ignore, Delay=#PB_Ignore)
Declare.i CreateFollowTargetFX(FX, TargetSprite, OffsetX=0, OffsetY=0, Damping.f=1, Duration=#PB_Ignore, Delay=#PB_Ignore)
Declare.i CreateFX(FX, type, paramSize, *executeFX.GS_FX_EXECUTE, Duration=#PB_Ignore, Delay=#PB_Ignore, *SpriteOrLayer.GS_EFFECTS=0)
Declare.i CopyFX(FX, NewFX, *SpriteOrLayer.GS_EFFECTS=0)
Declare FreeFX(FX)
Declare SetFXDelay(FX, delay)
Declare SetFXDuration(FX, Duration)
Declare SetFXStartTime(FX, Start)
Declare SetFXStopTime(FX, Stop)
Declare.i ApplyObjectFX(*SpriteOrLayer.GS_EFFECTS=0)
Declare.i FindFirstFX(*SpriteOrLayer.GS_EFFECTS, TypeMask=#FX_Mask_All)
Declare.i FindAnyFX(*SpriteOrLayer.GS_EFFECTS, TypeMask=#FX_Mask_All)
Declare.i NextMatchedFX()
Declare.i MatchedFX()
Declare.b LinkFX(*targetFX.GS_FX, *childFX.GS_FX)
Declare.b UnlinkFX(*FX.GS_FX)
Declare.b PauseFX(FX)
Declare.b ResumeFX(FX)
Declare.i FXDelay(FX)
Declare.i FXDuration(FX)
Declare.i FXLifespan(FX)
Declare.i FXStartTime(FX)
Declare.i FXStopTime(FX)
Declare.i FXStatus(FX)
Declare ExecuteMoveTransitionsFX(*FX.GS_FX, *Sprite.GS_SPRITE)
Declare ExecuteScaleTransitionsFX(*FX.GS_FX, *Sprite.GS_SPRITE)
Declare ExecuteAngleTransitionsFX(*FX.GS_FX, *Sprite.GS_SPRITE)
Declare ExecuteTransparencyTransitionsFX(*FX.GS_FX, *Sprite.GS_SPRITE)
Declare ExecuteColorTransitionsFX(*FX.GS_FX, *Sprite.GS_SPRITE)
Declare ExecuteMouseControlFX(*FX.GS_FX, *Sprite.GS_SPRITE)
Declare ExecuteMoveFX(*FX.GS_FX, *Sprite.GS_SPRITE)
Declare ExecuteRotateFX(*FX.GS_FX, *Sprite.GS_SPRITE)
Declare ExecuteTargetFX(*FX.GS_FX, *Sprite.GS_SPRITE)
Declare ExecuteSnapTargetFX(*FX.GS_FX, *Sprite.GS_SPRITE)
Declare ExecuteFaceTargetFX(*FX.GS_FX, *Sprite.GS_SPRITE)
Declare ExecuteFollowTargetFX(*FX.GS_FX, *Sprite.GS_SPRITE)
Declare.i CreateMoveTransitions(Transition, AngleRelative.b=#False, PositionRelative.b=#False, StartInterval=0, StartEaseX=#EASE_Linear, StartEaseY=#EASE_Linear)
Declare.i CreateScaleTransitions(Transition, StartInterval=0, StartEaseX=#EASE_Linear, StartEaseY=#EASE_Linear)
Declare.i CreateAngleTransitions(Transition, AngleRelative.b=#False, StartInterval=0, StartEase=#EASE_Linear)
Declare.i CreateTransparencyTransitions(Transition, StartInterval=0)
Declare.i CreateColorTransitions(Transition, StartInterval=0)
Declare.i CreateTransitions(Transition, Type)
Declare.i CopyTransitions(Transition, NewTransition)
Declare FreeTransition(Transition)
Declare AddMoveTransition(Transition, x.f, y.f, Interval=#PB_Ignore, EaseX=#PB_Ignore, EaseY=#PB_Ignore)
Declare AddScaleTransition(Transition, ScaleX.f, ScaleY.f, Interval=#PB_Ignore, EaseX=#PB_Ignore, EaseY=#PB_Ignore)
Declare AddAngleTransition(Transition, Angle.f, Interval=#PB_Ignore, Ease=#PB_Ignore)
Declare AddTransparencyTransition(Transition, Transparency.a, Interval=#PB_Ignore)
Declare AddColorTransition(Transition, Color, Interval=#PB_Ignore)
Declare RenderViews()
Last edited by eddy on Sun Aug 01, 2010 2:48 am, 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: Sprite3D engine with FX [cross-platform]

Post by eddy »

This is how does it work:
  1. Open Sprite Screen
  2. Create View
    • Add layer
      • Create Sprite in layer
      • Create Sprite in layer
        • Create FX for this sprite
          Create FX for this sprite
    • Add layer
      • Create Sprite in layer
  3. Create View etc...
Here is a little example:

Code: Select all

; ======================================
; EXAMPLE
; ======================================
InitMouse()
InitKeyboard()
InitSpriteScreen()
Add3DArchive(".", #PB_3DArchive_FileSystem)

OpenSpriteScreen(800, 600, "Sprite")
If CreateView(10, 0, 0, SpriteScreenWidth(), SpriteScreenHeight())
   SetViewBackColor(10, #Red)
   SetViewRendering(10, #View_Render_Textured)
   
   If CreateLayer(1, "image_bubble.png")
      CreateSprite(10, 222, 220)
      FlipSprite(10, 0, 1)
      ScaleSprite(10, 0.2, 0.2)
      RotateSprite(10, 45)
   EndIf
   If CreateLayer(#PB_Any, "image_character.png")
      For i=0 To 10
         sp=CreateSprite(#PB_Any, 0, 220, 111, 111)
         RandomSpritePosition(sp, 10, 620, 22, 620)
         SetSpriteGradient(sp, 1, #Cyan, #Blue, 255, 100)

         ;FX rotate
         CreateRotateFX(#PB_Any, 30)
      Next
   EndIf
EndIf 

Repeat
   RenderViews()
   FlipBuffers()
   ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
CloseSpriteScreen()
Last edited by eddy on Sun Aug 01, 2010 2:53 am, edited 4 times in total.
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
User avatar
J. Baker
Addict
Addict
Posts: 2181
Joined: Sun Apr 27, 2003 8:12 am
Location: USA
Contact:

Re: Sprite3D engine with FX [cross-platform]

Post by J. Baker »

This is pretty cool! I'll have to tinker with it some more. Thanks for sharing. ;)
www.posemotion.com

PureBasic Tools for OS X: PureMonitor, plist Tool, Data Maker & App Chef


Even the vine knows it surroundings but the man with eyes does not.
gnasen
Enthusiast
Enthusiast
Posts: 282
Joined: Wed Sep 24, 2008 12:21 am

Re: Sprite3D engine with FX [cross-platform]

Post by gnasen »

I tried your code with pb4.5 final, but it throws some exceptions (Pointer is Null, line 1033). If I give width/height a value to skip the default case, I get an IMA and so on.
I copied the engine3d.dll and just copy&paste the code from above, so I hope I didnt do anything wrong. I would really like to see it working :D
pb 5.11
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Re: Sprite3D engine with FX [cross-platform]

Post by eddy »

Perhaps a layer creation failed (texture not loaded).

I'll take a look.
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
moogle
Enthusiast
Enthusiast
Posts: 372
Joined: Tue Feb 14, 2006 9:27 pm
Location: London, UK

Re: Sprite3D engine with FX [cross-platform]

Post by moogle »

I got the same sort of error as gnasen (PB 4.5 x86)
Image
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Re: Sprite3D engine with FX [cross-platform]

Post by eddy »

gnasen wrote:I tried your code with pb4.5 final, but it throws some exceptions (Pointer is Null, line 1033). If I give width/height a value to skip the default case, I get an IMA and so on.
I copied the engine3d.dll and just copy&paste the code from above, so I hope I didnt do anything wrong. I would really like to see it working :D
I fixed the problem.

:arrow: download http://gssprite.svn.sourceforge.net/vie ... z?view=tar
- new transition FX : color, transparency, move, scale, angle (with 31 easing modes)
- FX : face object
Last edited by eddy on Sun Aug 01, 2010 10:13 am, edited 3 times in total.
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
User avatar
flaith
Enthusiast
Enthusiast
Posts: 704
Joined: Mon Apr 25, 2005 9:28 pm
Location: $300:20 58 FC 60 - Rennes
Contact:

Re: Sprite3D engine with FX [cross-platform]

Post by flaith »

Impressive, thanks eddy for sharing :)
“Fear is a reaction. Courage is a decision.” - WC
User avatar
eddy
Addict
Addict
Posts: 1479
Joined: Mon May 26, 2003 3:07 pm
Location: Nantes

Re: Sprite3D engine with FX [cross-platform]

Post by eddy »

flaith wrote:Impressive, thanks eddy for sharing :)
Thx.
The conversion PB4.40 -> PB4.50 is on the right track.

- FX : follow object, vortex object, orbit object
- new transition FX : animation frame by frame

Image

Uploaded with ImageShack.us
Last edited by eddy on Sun Aug 15, 2010 7:16 pm, edited 1 time 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: Sprite3D engine with FX [cross-platform]

Post by eddy »

- FX : SineScale, SineRotate, SineMove
- FX : Skew, Stretch, Perspective
- FX : Shake, Jiggle, Blink
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: Sprite3D engine with FX [cross-platform]

Post by eddy »

- I added more examples
- FX can be applied to layer (ApplyLayerFX)
Imagewin10 x64 5.72 | IDE | PB plugin | Tools | Sprite | JSON | visual tool
User avatar
idle
Always Here
Always Here
Posts: 5839
Joined: Fri Sep 21, 2007 5:52 am
Location: New Zealand

Re: Sprite3D: FX, anim, flip, deform, handle, transitions...

Post by idle »

It's looking good and working really well.
moogle
Enthusiast
Enthusiast
Posts: 372
Joined: Tue Feb 14, 2006 9:27 pm
Location: London, UK

Re: Sprite3D: FX, anim, flip, deform, handle, transitions...

Post by moogle »

very nice eddy, it's working fine now with no errors :)
Image
funkheld
New User
New User
Posts: 2
Joined: Thu Dec 31, 2009 11:56 am

Re: Sprite3D: FX, anim, flip, deform, handle, transitions...

Post by funkheld »

hello, is also a pixel collision with sprite ?
Post Reply