Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不使用XNA或其他第三方库的二维精灵动画_C#_Animation_2d_Sprite - Fatal编程技术网

C# 不使用XNA或其他第三方库的二维精灵动画

C# 不使用XNA或其他第三方库的二维精灵动画,c#,animation,2d,sprite,C#,Animation,2d,Sprite,我想创建一个简单的游戏,类似于RPG Maker可以创建的游戏。我目前主要寻找的是一个教程,可以指导我如何在不使用XNA或任何其他特定库的情况下完成它 理想的情况是一个循序渐进的教程或一个好的、易于理解的示例 我的目标是自己去做,并且理解整个过程是如何与动画元素相互关联的 过去我已经用一个简单的教程制作了一个简单的蛇游戏,但是里面没有动作动画,这是我接下来要学习的主要内容 编辑: 到目前为止,我找到的所有教程都使用第三方库。我确实遇到过,但我正在寻找不包括XNA的东西。在快速搜索中我找到了。 我

我想创建一个简单的游戏,类似于RPG Maker可以创建的游戏。我目前主要寻找的是一个教程,可以指导我如何在不使用XNA或任何其他特定库的情况下完成它

理想的情况是一个循序渐进的教程或一个好的、易于理解的示例

我的目标是自己去做,并且理解整个过程是如何与动画元素相互关联的

过去我已经用一个简单的教程制作了一个简单的蛇游戏,但是里面没有动作动画,这是我接下来要学习的主要内容

编辑:

到目前为止,我找到的所有教程都使用第三方库。我确实遇到过,但我正在寻找不包括XNA的东西。

在快速搜索中我找到了。 我对c#graphics不是很有经验,但以下是我在使用非图形语言时学到的几点:

  • 声明要绘制的位置/内容
  • 创建一个循环,直到中止/事件结束循环(如对象与某物碰撞)
  • 在循环中:等待,清除旧绘图区域,重新计算新位置,在新位置绘制
  • 如果需要,您也可以将图像更改为绘制,但是您需要为每个“帧”分别绘制图像
  • 多线程是一个好主意,因此您可以将运行图形与其他游戏逻辑分开
  • 尽量缩短清除绘图区域和重新绘图的时间,以防止闪烁
  • 跟踪绘制对象的大小,以便更容易地检查碰撞(如精灵的中心+半径,然后可以轻松计算围绕它的圆面积,以检查两个精灵是否彼此太近)

有很多方法可以接近您所描述的主题。我将给出一点概述,然后希望提供一些资源,这些资源可以为您提供一些示例,帮助您开始学习

基本上,基于精灵的动画围绕着拥有一系列类似的图像展开,这些图像在按顺序显示时,会创建类似于翻页书的运动外观

诀窍是了解精灵何时移动(因此应设置动画)-以及何时静止(因此不应设置动画)。换句话说,假设你的游戏角色只在你按住的时候移动▲, ▶, ▼ 或◀, 您需要检测其中一个关键点何时开始和何时停止被按下,以便可以相应地启动/停止动画

想象一下,为了简单起见,您只有2个精灵。第一个(左,下方)表示角色静止不动,第二个表示角色中间的步子(右,下方):

当▶ 按钮未按下时,您只需连续显示第一个图像。当▶ 按下按钮后,每
x
毫秒(取决于希望动画显示的速度)在两个按钮之间切换一次

是一种可以包含一系列简单图像帧的格式,这些图像帧将显示为一系列(从而创建动画错觉)。如果要使用此格式创建精灵,可以使用与所找到的类似的代码,该代码提供了一些示例代码,说明如何使用C#设置动画.gif并控制其开始/停止

或者,如果您想要使用一个sprite文件(如我上面包含的文件),您可以使用类似的东西,它关注与Windows环境的GDI交互,以便提取sprite的一部分并将其绘制到目标画布上。通过每隔
x
毫秒(如上所述)重新绘制,可以提供相同的效果

需要记住的几件事:

您需要在精灵中处理透明度(例如,上面的马里奥精灵有一个透明的背景),以便游戏环境的背景显示出来。如果使用GDI,这一切都与如何调用绘画方法有关。如果使用动画.gif-使用的方法取决于您在窗口上的显示方式

有关其他资源/示例/参考,请查阅以下资源:

  • -一篇较老的文章,其中详细介绍了精灵动画、计时等概念,并给出了一些示例代码(示例中的一些DirectX)
  • -一些用于处理精灵和大小调整的C#操作代码的示例(使用OpenGL,因此可能不适用)
对于Sprite开发:

  • -用于创建精灵图纸的工具
  • -用于在线创建动画GIF的工具
  • -另一个动画gif创建者

我举了一个例子来说明我认为你们所追求的是什么。此示例可应用于按钮或图片框。我选择这种方式是出于简单

动画的每个实例都包含一个计时器和一个图像列表。每当计时器触发其事件时更新目标控件的映像

我已经在这里上传了我的项目文件

希望这足以有所帮助。问问你是否需要更多的解释

班级

public class Animation
{
    readonly Timer _animtimer = new Timer();

    public List<Image> Frames;

    public int FrameIndex;

    private Button _target;
    private PictureBox _ptarget;

    public void Target(PictureBox target)
    {
        _ptarget = target;
    }

    public void Target(Button target)
    {
        _target = target;
    }

    public int FrameSpeed
    {
        get { return _animtimer.Interval; }
        set { _animtimer.Interval = value; }
    }

    public Animation()
    {
        Frames  = new List<Image>();
        _animtimer.Interval = 100;
        _animtimer.Tick += Update;
    }

    public void Play()
    {
        _animtimer.Start();
    }

    public void AddFrame(string file)
    {
        Frames.Add(Image.FromFile(file));
    }

    public void Stop()
    {
        _animtimer.Stop();
    }

    private void Update(object sender, EventArgs eventArgs)
    {
        FrameIndex++;

        if (FrameIndex == Frames.Count)
        {
            FrameIndex = 0;
        }
        _target.Image = Frames[FrameIndex];
        _ptarget.Image = Frames[FrameIndex];
    }

    public static implicit operator Image(Animation a)
    {
        return a.Frames[a.FrameIndex];
    }
}

谢谢你的尝试,但不幸的是,它没有解释如何动画(让他行走)一个精灵你需要为每一帧单独的图像,就像动画GIF一样。您可以根据情况切换显示的图像。在运行时不可能对图形进行变形。为此,您需要适当的3d引擎和线框图形,或矢量/多边形解决方案。但是这些都不再是精灵了:)澄清一下:有了精灵,动画只是一种通过连续显示不同图像来实现的幻觉。我知道这一点,但我不知道如何实现。正因为如此,我才在这里要求
    private void Form1Load(object sender, EventArgs e)
    {

        _testAnim.AddFrame(@"F:\Im\Black.png");
        _testAnim.AddFrame(@"F:\Im\Blue.png");
        _testAnim.AddFrame(@"F:\Im\Green.png");
        _testAnim.AddFrame(@"F:\Im\Orange.png");
        _testAnim.AddFrame(@"F:\Im\Red.png");



        _testAnim.Target(ButtonTest);
        _testAnim.Target(PicBox);


        _testAnim.Play();


    }