C# 不使用XNA或其他第三方库的二维精灵动画
我想创建一个简单的游戏,类似于RPG Maker可以创建的游戏。我目前主要寻找的是一个教程,可以指导我如何在不使用XNA或任何其他特定库的情况下完成它 理想的情况是一个循序渐进的教程或一个好的、易于理解的示例 我的目标是自己去做,并且理解整个过程是如何与动画元素相互关联的 过去我已经用一个简单的教程制作了一个简单的蛇游戏,但是里面没有动作动画,这是我接下来要学习的主要内容 编辑: 到目前为止,我找到的所有教程都使用第三方库。我确实遇到过,但我正在寻找不包括XNA的东西。在快速搜索中我找到了。 我对c#graphics不是很有经验,但以下是我在使用非图形语言时学到的几点:C# 不使用XNA或其他第三方库的二维精灵动画,c#,animation,2d,sprite,C#,Animation,2d,Sprite,我想创建一个简单的游戏,类似于RPG Maker可以创建的游戏。我目前主要寻找的是一个教程,可以指导我如何在不使用XNA或任何其他特定库的情况下完成它 理想的情况是一个循序渐进的教程或一个好的、易于理解的示例 我的目标是自己去做,并且理解整个过程是如何与动画元素相互关联的 过去我已经用一个简单的教程制作了一个简单的蛇游戏,但是里面没有动作动画,这是我接下来要学习的主要内容 编辑: 到目前为止,我找到的所有教程都使用第三方库。我确实遇到过,但我正在寻找不包括XNA的东西。在快速搜索中我找到了。 我
- 声明要绘制的位置/内容
- 创建一个循环,直到中止/事件结束循环(如对象与某物碰撞)
- 在循环中:等待,清除旧绘图区域,重新计算新位置,在新位置绘制
- 如果需要,您也可以将图像更改为绘制,但是您需要为每个“帧”分别绘制图像
- 多线程是一个好主意,因此您可以将运行图形与其他游戏逻辑分开
- 尽量缩短清除绘图区域和重新绘图的时间,以防止闪烁
- 跟踪绘制对象的大小,以便更容易地检查碰撞(如精灵的中心+半径,然后可以轻松计算围绕它的圆面积,以检查两个精灵是否彼此太近)
x
毫秒(取决于希望动画显示的速度)在两个按钮之间切换一次
是一种可以包含一系列简单图像帧的格式,这些图像帧将显示为一系列(从而创建动画错觉)。如果要使用此格式创建精灵,可以使用与所找到的类似的代码,该代码提供了一些示例代码,说明如何使用C#设置动画.gif并控制其开始/停止
或者,如果您想要使用一个sprite文件(如我上面包含的文件),您可以使用类似的东西,它关注与Windows环境的GDI交互,以便提取sprite的一部分并将其绘制到目标画布上。通过每隔x
毫秒(如上所述)重新绘制,可以提供相同的效果
需要记住的几件事:
您需要在精灵中处理透明度(例如,上面的马里奥精灵有一个透明的背景),以便游戏环境的背景显示出来。如果使用GDI,这一切都与如何调用绘画方法有关。如果使用动画.gif-使用的方法取决于您在窗口上的显示方式
有关其他资源/示例/参考,请查阅以下资源:
- -一篇较老的文章,其中详细介绍了精灵动画、计时等概念,并给出了一些示例代码(示例中的一些DirectX)
- -一些用于处理精灵和大小调整的C#操作代码的示例(使用OpenGL,因此可能不适用)
- -用于创建精灵图纸的工具
- -用于在线创建动画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();
}