我听说在这里张贴大块的文本是一个很大的禁忌,所以我会试着只展示我认为问题可能出现的部分.但是,如果任何人想看到更多我的代码,我会很乐意提供的.这是用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相关问答推荐

MongoDB实体框架核心:表达必须可写

Regex在c#中完全匹配

如何使用C#和Graph API从Azure Directory获取用户详细信息

找不到网址:https://localhost:7002/Category/Add?区域= Admin.为什么我的URL是这样生成的?area = Admin而不是/Admin/

Int和uint相乘得到LONG?

发布用于Linux Ubuntu的C#应用程序

在C#中,有没有一种方法可以集中定义跨多个方法使用的XML参数描述符?

从ASP.NET Core中的枚举字段填充 Select 选项时,将默认的第一个选项添加为 Select 元素

如何在Cosmos SDK中控制超时、重试和重试之间的延迟?

RabbitMQ群集的MassTransit配置问题

如何从Entity Framework Core中填充ListIInterface

使用未赋值的、传递的局部变量

将J数组转换为列表,只保留一个嵌套的JToken

为什么在使用JsonDerivedType序列化泛型时缺少$type?

如何从原始图像到新创建的图像获得相同的特定 colored颜色 ,并且具有相同的 colored颜色 量和相同的宽度和高度?

如何在C#.NET桌面应用程序中动态更改焦点工具上的后退 colored颜色

从MudAutoComplete打开对话框,列表仍然可见

如何使用LINQ在C#中填充列表列表?

在Swagger中显示自定义属性的属性名称

部署Aspnet Blazor服务器时出现未处理的Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1]异常