C#在图片框中制作游戏
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#在图片框中制作游戏相关的知识,希望对你有一定的参考价值。
每个人。因此,我正在使用图片框在C#中制作2D游戏,但对我而言,性能似乎有些差。尽管这可能只是由于我的优化不佳。
我听说过SDL和XNA,并且想知道我是否应该使用其中的任何一个?该游戏仅适用于Windows,我计划稍后再实现多人游戏,因此,一些可以帮助我进行联网的库也很酷。
顺便说一句,我来自javascript,我是相当新的C#。如果您知道,我正在制作的游戏就是2D游戏,类似于噬菌大战。
任何见识将不胜感激。 :)
您应该使用XNA,它也具有.Net的全部功能来处理网络连接
我强烈推荐XNA。几个月前,我接触到它,并且发现它既易于理解(对于2D游戏来说更容易),而且功能强大。不利的一面是,微软停止了XNA的开发工作:(无论如何,如果您想进一步了解XNA,我建议您学习本教程:http://rbwhitaker.wikidot.com/xna-tutorials我尚未与Unity合作,但如果您认为几年后仍会制作游戏,那么值得一看(因为它还不像XNA那样死)。
Monogame,http://www.monogame.net/
在开发中使用XNA代码界面(因此,如果您回滚到原始XNA,您将不会失去所有内容)(据我所知,版本2.3)还与移动设备,Linux,Mac兼容。在我看来,为Windows编译时它使用SDL。
团结也很棒,但从我的角度来看,太大却太强大了,只想高效地制作一些2D游戏。
也请看一下SharpDx,它是DirectX的.net包装器。使用起来更复杂,但可能是开始学习Directx的好方法。
考虑将Unity3D作为选项。您可以创建2d和3d游戏,社区很大,Windows版本是免费的(我是说,是为Windows编译),并且您的代码可以用c#或Javascript(或Boo ...但是不是很常见)编写。我知道这是一篇过时的文章,但对有相同问题的其他人来说可能是一件好事。
1。 PictureBoxCanvas类
创建一个名为PictureBoxCanvas的新类,并将以下代码粘贴到其中:
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public class PictureBoxCanvas
{
public uint[] Pixels { get; set; }
Bitmap Bitmap { get; set; }
GCHandle Handle { get; set; }
IntPtr Addr { get; set; }
bool IsRefreshing { get; set; }
PictureBox PctCanvas { get; set; }
public PictureBoxCanvas(PictureBox pctCanvas)
{
PctCanvas = pctCanvas;
Reset();
}
public void Reset()
{
// Initialise resources
Size ImageSize = new Size(320, 240); // This sets the resolution to 320 pixels wide and 240 pixels high. Modify this to any dimension you wish
PixelFormat fmt = PixelFormat.Format32bppRgb;
int PixelSize = Image.GetPixelFormatSize(fmt);
int Step = ImageSize.Width * PixelSize;
int padding = 32 - (Step % 32);
if (padding < 32)
{
Step += padding;
}
Pixels = new uint[(Step / 32) * ImageSize.Height + 1];
Handle = GCHandle.Alloc(Pixels, GCHandleType.Pinned);
Addr = Marshal.UnsafeAddrOfPinnedArrayElement(Pixels, 0);
Bitmap = new Bitmap(ImageSize.Width, ImageSize.Height, Step / 8, fmt, Addr);
PctCanvas.Image = Bitmap;
}
public void Refresh()
{
// Update
if (!IsRefreshing) // If computer is too slow then this will hold the next frame until the current one has finished
{
try
{
IsRefreshing = true;
PctCanvas.Refresh();
}
catch //(Exception ex)
{
//Console.Out.WriteLine(DateTime.Now.ToString("dd MMM yyyy HH:mm") + ":" + ex.Message + ex.StackTrace); // Uncomment to display exception info if desired
}
finally
{
IsRefreshing = false;
}
}
}
public void Dispose()
{
// Finished so free up resources
PctCanvas = null;
Addr = IntPtr.Zero;
if (Handle.IsAllocated)
{
Handle.Free();
}
Bitmap.Dispose();
Bitmap = null;
Pixels = null;
}
}
2。添加控件和事件
在您的项目中创建一个新表单,并向其中添加以下控件/事件:
- PictureBox命名为“ PctCanvas”
- 计时器名为“ Tmr25Hz”。将间隔设置为40,即每秒1000个刻度/ 25Hz。也双击控件为其创建事件方法
- 通过“表单”属性中的事件(闪电)图标添加“关闭”和“加载”事件方法
注意:这些将为空。在下一节中添加缺少的代码。
3。表单代码示例
如果从头开始创建新项目,那么后面的代码应如下所示:
using System;
using System.Windows.Forms;
namespace PictureBoxOfVersatility
{
public partial class Form1 : Form
{
PictureBoxCanvas PictureBoxCanvas { get; set; }
Random Random { get; set; }
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// This code runs after the Form has finished initialising
Random = new Random();
PictureBoxCanvas = new PictureBoxCanvas(PctCanvas);
Tmr25Hz.Start();
}
private void Tmr25Hz_Tick(object sender, EventArgs e)
{
// Modify the Pixels array i.e. move on to the next animation frame
for (int i = 0; i < PictureBoxCanvas.Pixels.Length; i++)
{
// These three lines are responsible for choosing a randomly coloured pixel
byte Red = (byte)Random.Next(0, 255);
byte Green = (byte)Random.Next(0, 255);
byte Blue = (byte)Random.Next(0, 255);
PictureBoxCanvas.Pixels[i] = ((uint)(Red | (Green << 8) | (Blue << 16) | 0xff000000));
}
// Refresh the PictureBoxCanvas
PictureBoxCanvas.Refresh();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// This method runs when the Form is closing
Tmr25Hz.Stop();
PictureBoxCanvas.Dispose();
}
}
}
4。编译,运行和修改
现在应按F5键编译并运行此项目。
第一次运行时,您会看到白噪声。这不是一个错误,但这是因为每帧每个像素都被赋予一种随机颜色。
现在,您可以自行替换随机代码,即在Tmr25Hz_Tick方法中。
完成此操作的方法是通过修改像素数组中的值。每个像素的红色,绿色和蓝色值介于0到255之间。
您将需要自行设计动画的动画,但这完全取决于您自己安排。
如果您不知道从哪里开始,那么我将从在像素阵列上粘贴不同的形状和图像开始。
一旦您掌握了此内容,请考虑如何将事件排序在一起,可能会列出等待时间和说明。
5。从这里去哪里?
PictureBoxCanvas的多功能性是巨大的。高级用户最终将能够利用图形硬件来帮助使用DirectX或OpenGl渲染场景,但这超出了本小节的范围。
玩得开心!
以上是关于C#在图片框中制作游戏的主要内容,如果未能解决你的问题,请参考以下文章