WPF:角色在屏幕上行走动画?

WPF:角色在屏幕上行走动画?,wpf,xaml,animation,Wpf,Xaml,Animation,我正在尝试解决如何使用WPF故事板(类似于动画gif)创建角色在屏幕上行走的动画 我在行走动作的不同阶段有多个角色的图像,我能做的最好的就是使用Blend在不同的时间显示和隐藏不同的图像。生成的动画不是特别平滑 我可以通过压缩时间线使它更平滑,但我想知道是否有更好或更抽象的方法来实现这一点?我已经搜索过了,但找不到相关的教程或示例 我已经看到了以下问题,但我仍然不清楚您将如何做到这一点: 并向用户显示横幅 雪碧动画是@icebat的道具 这里有一个很好的例子: 从本质上讲,您将获得一个精灵

我正在尝试解决如何使用WPF故事板(类似于动画gif)创建角色在屏幕上行走的动画

我在行走动作的不同阶段有多个角色的图像,我能做的最好的就是使用Blend在不同的时间显示和隐藏不同的图像。生成的动画不是特别平滑

我可以通过压缩时间线使它更平滑,但我想知道是否有更好或更抽象的方法来实现这一点?我已经搜索过了,但找不到相关的教程或示例

我已经看到了以下问题,但我仍然不清楚您将如何做到这一点:

  • 并向用户显示横幅


雪碧动画是@icebat的道具

这里有一个很好的例子:

从本质上讲,您将获得一个精灵表,其中角色处于动画的不同阶段。然后在页面上放置一个可以用ImageBrush填充的WPF元素,并对ImageBrush应用TranslateTransform,以定期在sprite工作表上显示不同的图像

对于后人来说,示例中的代码类似于:

XAML


不是答案,但当我需要让一个角色在一条直线上行走时,我只需要制作一个.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;
}