我听说在这里张贴大块的文本是一个很大的禁忌,所以我会试着只展示我认为问题可能出现的部分.但是,如果任何人想看到更多我的代码,我会很乐意提供的.这是用C#WinForms完成的,我知道有比C#WinForms更好的东西可以用来创建游戏,但这是为了一个学校项目,而且它必须在WinForms中.

private void SetUp()
{
    //Player character files loaded into the list
    this.DoubleBuffered = true;

    playerMovements = Directory.GetFiles("knightimages", "*.png").ToList();
    
    foreach (var filePath in playerMovements)
    {
        Console.WriteLine($"Loaded file: {filePath}");
    }
    knight = Image.FromFile(playerMovements[0]);
}

这是我用来把所有的图像动画角色放到"playerMotitions"列表中的方法.我的程序访问这些图像并显示骑士角色.

private void AnimateKnight(int start, int end)
{
    slowFrameRate += 1;

    if (slowFrameRate == 4)
    {
        steps++;
        slowFrameRate = 0;

        if (steps > end || steps < start)
        {
            steps = start;
        }

        knight = Image.FromFile(playerMovements[steps]);
    }
}

这是用于设置骑士动画的方法.我不确定问题是不是在这里,但我还是要把它包括进来,因为问题是他的动画不是很正确.

private void TimerEvent(object sender, EventArgs e)
{
    if (Core.IsLeft && playerX > 0)
    {
        playerX -= playerSpeed;
        //AnimateKnight(8, 11);
    }
    if (Core.IsRight && playerX + playerWidth < this.ClientSize.Width)
    {
        playerX += playerSpeed;
        AnimateKnight(12,15);
    }
    this.Invalidate();
}

这是我的计时器事件.我想问题可能出在这里?问题是,我希望它使用的图像(左图像8到11,右图像12到15)没有被使用.取而代之的是,每当骑士角色移动时,该程序似乎几乎运行了文件夹中的所有图像.他的动作很好,只是动画不太对劲.

我已经确保所有的图像都被正确命名并以正确的顺序放置.但它仍然在 pull 错误的图像.我一直在试图找出问题出在哪里,并做了一些调试(这是我非常新手),但我仍然找不到问题所在.请救救我!如前所述,如果任何人想要查看所有代码,我将很乐意提供.

此外,我按照这个视频教程,即使我可以说我的代码与他的匹配,但它不像他的是:https://www.youtube.com/watch?v=XaoczTCHAwc

我现在只能让他左右移动.这是因为我只是在测试这两个方向.他最终也会上下移动.左边被注释掉了,因为我现在只是在测试右边的.

我曾try 更改TimerEvent AnimateKnight()中的数字,并try 在AnimateKnight方法和Setup方法中使用sole.Writeline进行一些调试.

AnimateKnight方法中的console.Writeline显示它工作正常(我认为),而Setup中的写入线显示IS正在将图像加载到我没有告诉它的文件夹中.我的意思是,当角色向右移动时,图像12-15应该已经使用并设置了动画.相反,它使用的是图像0-8??我不知道它为什么要这么做.

推荐答案

从我们在 comments 中的交谈中,我怀疑你用Directory.GetFiles("knightimages", "*.png").ToList();构建的playerMovements个列表并不是你认为的顺序.因此,通过索引引用它会产生意外的结果.

一个常见的错误是在没有填充的情况下对图像进行索引,如Image.0.png、Image.2.png...Image.10.png、Image.11.png.但看看会发生什么.

playerMovements = Directory
    .GetFiles(ImageFolder, "*.png");

for(int i=0; i<playerMovements.Length; i++)
{
    Debug.WriteLine($"Index {i} - {Path.GetFileName(playerMovements[i])}");
}

index does not match file

你觉得他们会按顺序来,但他们不是.它们是排序的(默认情况下,以字母数字顺序排序,与我们看到的数字值不同.

所有迹象都表明,类似的事情正在发生.因此,我在 comments 中的意思是"打印"出您的图像目录中的文件名,这样我们就可以了解它们的实际顺序.


粘贴代码片段不应该对动画有任何影响,但无论如何,它只需要存在足够长的时间,以使此脚本进入JavaScript控制台,然后您可以再次将其取出.

只需在读入Directory.Files之后插入代码片段,并在此循环之后设置断点,然后查看打印出列表.(应该看起来像我发布的照片)

Csharp相关问答推荐

在EF Core中,有没有什么方法可以防止在查询中写入相同的条件,而代之以表达式?

我的MRG32k3a算法实现返回的数字超出了预期的[0,1]范围

DateTime ToString()未以指定格式打印

Regex字母数字校验

在平行内使用跨度.用于循环

C#使用相同内存的多个数组

工厂类是如何在.NET 8中注册的?

在ObservableCollection上使用[NotifyPropertyChangedFor()]源代码生成器不会更新UI

NETSDK1201:对于面向.NET 8.0和更高版本的项目,默认情况下,指定RUNTIME标识符将不再生成自包含的应用程序

如何在.NET MAUI上在iOS和Mac之间共享代码?(no条件编译和无代码重复)

如何在更新数据库实体时忽略特定字段?

将文本从剪贴板粘贴到RichTextBox时,新文本不会在RichTextBox ForeColor中着色

根据运行时值获取泛型类型的字典

如何获取我在SQL中输入的值

为什么使用User.IsInRole()总是返回FALSE?

如何使用Selenium/NUnit并行运行多个测试设备?

如何强制一个过程在不可见的情况下开始?

我为什么不';t将逻辑结果获取到我的GroupBy以筛选重复项吗?

WebApplication.CreateBuilder().Services.AddTransient()如何在ASP.NET核心MVC中工作?

当用户在 Windows App SDK (WinUI 3) 中调整大小时,如何保持 AppWindow 的 16:9 宽高比?