9

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

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

我的目标是自己做,并了解整个过程如何与彼此相关的动画元素一起工作。

过去我已经使用简单的教程构建了一个简单的蛇游戏,但其中没有运动动画,这是我接下来要学习的主要内容。

编辑:

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

4

3 回答 3

16

有多种方法可以处理您所描述的主题。我将提供一些概述,然后希望提供一些资源,这些资源可以为您提供示例以帮助您入门。

本质上,基于精灵的动画围绕着一系列相似的图像,当它们按顺序显示时,会产生运动的外观,类似于翻书。

诀窍是了解您的精灵何时移动(因此应该被动画化) - 以及它何时静止不动(因此不应该被动画化)。换句话说 - 假设你的游戏角色只应该在你按住的时候移动▲</kbd>, ▶</kbd>, ▼</kbd> or , you need to detect when one of those keys starts and stops being pressed, so that you can start/stop your animation accordingly.

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

马里奥

当。。。的时候▶</kbd> button is not pressed, you simply continually display the first image. When the ▶</kbd> button is pressed, you toggle between the two every x milliseconds (depending on how fast you want the animation to appear).

动画 .gif是一种格式,您可以在其中包含一系列简单的图像帧,这些图像帧旨在作为一个系列显示(因此会产生动画的错觉)。如果您要使用这种格式创建精灵,您可以使用类似于此 SO 讨论中的代码,它提供了一些示例代码,说明如何使用 C# 为动画 .gif 设置动画并控制其开始/停止。

或者,如果你想使用一个精灵文件(就像我上面包含的那个),你可以使用类似于这个 CodeProject 代码的东西,它专注于 GDI 与 Windows 环境的交互,以便提取和绘制精灵的一部分到目标画布。通过每x毫秒重新绘制一次(如上所述),这可以提供相同的效果。

要记住几件事:

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

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

对于 Sprite 开发:

于 2013-04-23T22:22:35.363 回答
4

我把我认为你所追求的例子放在一起。这个例子可以应用于按钮或图片框。出于简单,我选择了这种方式。

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

我已经在这里上传了我的项目文件。http://mcspazzy.com/code/ParTest.zip

希望这足以提供帮助。只是问你是否需要更多解释。

班上

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];
    }
}

这是在我的表单加载中。真的可以去任何东西被初始化的地方。

    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();


    }
于 2013-04-24T03:01:20.490 回答
1

在快速搜索中,我找到了这个例子。我在 c# 图形方面不是很有经验,但这里有几点我学到了使用非面向图形的语言:

  • 声明你想画的地方/什么
  • 创建一个循环运行直到中止/事件结束循环(比如对象与某物碰撞)
  • 在循环中:等待,清除旧绘图区,重新计算新位置,在新位置绘制
  • 如果需要,您也可以更改要绘制的图像,但是您需要为每个想要拥有的“帧”提供单独的图像
  • 多线程是个好主意,因此您可以将运行图形与其他游戏逻辑分开
  • 尽量保持清除绘图区域和重新绘制的时间尽可能短,以防止闪烁
  • 跟踪您绘制的对象的大小,使其更容易检查碰撞(如精灵的中心+半径,然后您可以轻松计算其周围的圆形区域以检查两个精灵是否彼此太近)
于 2013-04-23T07:33:55.360 回答