Page 1 of 2

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

Posted: Wed Jul 21, 2010 12:51 am
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

Re: Sprite3D engine with FX [cross-platform]

Posted: Wed Jul 21, 2010 12:52 am
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()

Re: Sprite3D engine with FX [cross-platform]

Posted: Wed Jul 21, 2010 1:02 am
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()

Re: Sprite3D engine with FX [cross-platform]

Posted: Wed Jul 21, 2010 7:36 am
by J. Baker
This is pretty cool! I'll have to tinker with it some more. Thanks for sharing. ;)

Re: Sprite3D engine with FX [cross-platform]

Posted: Wed Jul 21, 2010 9:29 am
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

Re: Sprite3D engine with FX [cross-platform]

Posted: Wed Jul 21, 2010 9:46 am
by eddy
Perhaps a layer creation failed (texture not loaded).

I'll take a look.

Re: Sprite3D engine with FX [cross-platform]

Posted: Wed Jul 21, 2010 9:58 am
by moogle
I got the same sort of error as gnasen (PB 4.5 x86)

Re: Sprite3D engine with FX [cross-platform]

Posted: Sat Jul 31, 2010 9:34 pm
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

Re: Sprite3D engine with FX [cross-platform]

Posted: Sat Jul 31, 2010 10:22 pm
by flaith
Impressive, thanks eddy for sharing :)

Re: Sprite3D engine with FX [cross-platform]

Posted: Sun Aug 01, 2010 10:10 am
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

Re: Sprite3D engine with FX [cross-platform]

Posted: Wed Aug 11, 2010 2:49 am
by eddy
- FX : SineScale, SineRotate, SineMove
- FX : Skew, Stretch, Perspective
- FX : Shake, Jiggle, Blink

Re: Sprite3D engine with FX [cross-platform]

Posted: Sun Aug 15, 2010 6:50 pm
by eddy
- I added more examples
- FX can be applied to layer (ApplyLayerFX)

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

Posted: Mon Aug 16, 2010 10:12 pm
by idle
It's looking good and working really well.

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

Posted: Mon Aug 16, 2010 10:38 pm
by moogle
very nice eddy, it's working fine now with no errors :)

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

Posted: Tue Aug 17, 2010 5:46 pm
by funkheld
hello, is also a pixel collision with sprite ?