WPF:角色在屏幕上行走动画?
我正在尝试解决如何使用WPF故事板(类似于动画gif)创建角色在屏幕上行走的动画 我在行走动作的不同阶段有多个角色的图像,我能做的最好的就是使用Blend在不同的时间显示和隐藏不同的图像。生成的动画不是特别平滑 我可以通过压缩时间线使它更平滑,但我想知道是否有更好或更抽象的方法来实现这一点?我已经搜索过了,但找不到相关的教程或示例 我已经看到了以下问题,但我仍然不清楚您将如何做到这一点:WPF:角色在屏幕上行走动画?,wpf,xaml,animation,Wpf,Xaml,Animation,我正在尝试解决如何使用WPF故事板(类似于动画gif)创建角色在屏幕上行走的动画 我在行走动作的不同阶段有多个角色的图像,我能做的最好的就是使用Blend在不同的时间显示和隐藏不同的图像。生成的动画不是特别平滑 我可以通过压缩时间线使它更平滑,但我想知道是否有更好或更抽象的方法来实现这一点?我已经搜索过了,但找不到相关的教程或示例 我已经看到了以下问题,但我仍然不清楚您将如何做到这一点: 并向用户显示横幅 雪碧动画是@icebat的道具 这里有一个很好的例子: 从本质上讲,您将获得一个精灵
- 并向用户显示横幅
不是答案,但当我需要让一个角色在一条直线上行走时,我只需要制作一个.gif,然后让它在屏幕上移动。非常简单和快速的解决方案。但如果你需要更复杂的东西,你可以尝试在WPF中搜索精灵动画,这个主题可以是密切相关的。谢谢,这是个不错的主意。但我希望让行走看起来更自然,据我所知,这需要人物四肢处于不同位置的不同图像。
<Grid Grid.Row="1" x:Name="ContentRoot" Margin="19,9.5,19,0">
<Rectangle Width="52" Height="40">
<Rectangle.Fill>
<ImageBrush ImageSource="/Assets/Images/animations/sprite_sheet.png"
Stretch="None"
AlignmentX="Left"
AlignmentY="Top">
<ImageBrush.Transform>
<TranslateTransform x:Name="SpriteSheetOffset" X="0" Y="0" />
</ImageBrush.Transform>
</ImageBrush>
</Rectangle.Fill>
</Rectangle>
</Grid>
private const int NumberOfColumns = 1;
private const int NumberOfFrames = 8;
private const int FrameWidth = 54;
private const int FrameHeight = 40;
public static readonly TimeSpan TimePerFrame = TimeSpan.FromSeconds(1 / 60f);
private int currentFrame;
private TimeSpan timeTillNextFrame;
private void OnUpdate(object sender, object e)
{
this.timeTillNextFrame += TimeSpan.FromSeconds(1 / 60f);
if (this.timeTillNextFrame > TimePerFrame)
{
this.currentFrame = (this.currentFrame + 1 + NumberOfFrames) % NumberOfFrames;
var row = this.currentFrame % NumberOfColumns;
var column = this.currentFrame / NumberOfColumns;
this.SpriteSheetOffset.X = -column * FrameWidth;
this.SpriteSheetOffset.Y = -row * FrameHeight;
this.timeTillNextFrame = TimeSpan.FromSeconds(0);
}
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
this.navigationHelper.OnNavigatedTo(e);
CompositionTarget.Rendering += this.OnUpdate;
}
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
this.navigationHelper.OnNavigatedFrom(e);
CompositionTarget.Rendering -= this.OnUpdate;
}