I am looking for a clever way for setting up a walking sprite that slowly accelerates from standing to normal walking speed.
The normal moving speed is 250 and normal animation frame speed is 45.
I have added the following lines in the Window.Update procedure.
The increasing moving is working sort of okay with the next 2 lines but the FramesPerSecond not; it keeps the initial animation speed of the animation after loading the sprite screen with TSprite.CreateFrameSize.
if Sprite[NR].MoveSpeed < 250 then Sprite[NR].MoveSpeed := Sprite[NR].MoveSpeed + 5;
Sprite[NR].CurrentSprite.X := Sprite[NR].CurrentSprite.X + SecondsPassed * Sprite[NR].MoveSpeed;
(works okay)
if Sprite[NR].WalkRightSprite.FramesPerSecond < 45 then Sprite[NR].WalkRightSprite.FramesPerSecond := Sprite[NR].WalkRightSprite.FramesPerSecond + 5;
(not working).
Do you have an example how to get this right?
Thanks.
Hmmm… I’m not sure if I can tell what exactly is not working in your code but it doesn’t seem to solve the problem you need to solve. Try this approach:
const
FullSpeed = 250;
Acceleration = 5; // in px/s^2
begin
{ Deal with Acceleration }
// Note the use of "SecondsPassed" here!
Sprite[NR].MoveSpeed += Accelration * SecondsPassed;
if Sprite[NR].MoveSpeed > FullSpeed then
Sprite[NR].MoveSpeed := FullSpeed;
{ Move the sprite}
Sprite[NR].CurrentSprite.X += SecondsPassed * Sprite[NR].MoveSpeed;
end;
About the “FramesPerSecond” part, I understand you’re trying to speed up the animation, right? See Castle Game Engine: CastleGLImages: Class TSprite - in short, that’s not a reliable way to speed up the animation.
I don’t see any way to change speed of TSprite animations neither trhough TSprite nor through TSpriteAnimation APIs.
Thanks.
I have looked at the new sprite handling format but don’t know if it can handle variable animation speed.
It is rather new and I probably need examples to get to it; I was just learning the old format.
But can I get variable animation speed option by converting the sprite sheets to X3D format?
As for the task you’re doing, you can also use SmoothTowards utility for this.
As for animation speed:
The new sprite sheet approach supports controlling the speed of the animation, using MyScene.TimePlayingSpeed (on a single scene) or MyViewport.Items.Items.TimeScale (scales all animations on all scenes).
It is much better than the TSprite approach (which will be soon deprecated) on all accounts, IMO I really recommend the new approach Note that it is already available and 100% working ( Sprite sheets · castle-engine/castle-engine Wiki · GitHub ), and you can use CGE editor to arrange scenes with sprite sheets visually.
But can I get variable animation speed option by converting the sprite sheets to X3D format?
It is the same answer. “Converting the sprite sheets to X3D format” is what happens under the hood if you load the sprite sheet to TCastleScene. Usually, you don’t need to care about, and can consider “X3D nodes” as “some internal thing that engine is using”.
Ok, you convinced me to use the new format but for me it’s starting from scratch again, as it already took me a lot of time to get some things done with the TSprite class.
So I need some CGE running examples to learn how I can “port” my game code so far from TSprite class code to the new format.
I haven’t seen any examples yet or I have missed something.
Thanks.
Well, one thing at a time. I guess I will have to learn about rendering with Scenes en Viewports first instead of my current TDrawableImage.
I will start a new post “Learning to use new Sprite method”. Expect a lot of questions along my new journey of discovery and errors. Thanks for your support.