大家。所以,我正在使用图片框在C#中制作2D游戏,但对我而言,性能似乎有点糟糕。虽然这可能只是因为我的最佳化程度不佳。
我听说过SDL和XNA,并想知道我是否应该使用它们中的哪一个? 该游戏仅适用于Windows,我计划稍后实施多人游戏,因此一些帮助我建立网络的图书馆也会很酷。
顺便说一下,我来自javascript,我是一个相当新的C#。我正在制作的游戏是类似于Phage Wars的2D游戏,如果你知道的话。
非常感谢任何见解。 :)
答案 0 :(得分:1)
你应该使用XNA,它还具有.Net的所有功能来处理网络
答案 1 :(得分:1)
我强烈推荐XNA。几个月前我进入了它,我发现它很容易(对于2D游戏更容易)理解和强大。在不利方面,微软停止了对XNA的工作:( 无论如何,如果你想仔细看看XNA我推荐这个教程:http://rbwhitaker.wikidot.com/xna-tutorials 我还没有和Unity合作,但是如果你认为你几年后仍然会制作游戏,那么看看它可能是值得的(因为它不像XNA那样死了)。
答案 2 :(得分:0)
Monogame,http://www.monogame.net/
使用XNA代码接口(所以,如果你回滚到香草XNA你不会失去一切),在developpement(据我所知2.3版),也兼容mobile,linux,mac。在我看来,在编译windows时它使用SDL是什么。
Unity也很棒,但从我的角度来看太大而且太强大,只是想有效地制作一些2D游戏。
另请参阅SharpDx,它是directx的.net包装器。更复杂的使用,但可以是开始学习directx的好方法。
答案 3 :(得分:0)
将Unity3D视为一种选择。 你可以创建2D和3D游戏,有大型社区,Windows版本是免费的(我的意思是,编译为Windows),你的代码可以用c#或Javascript编写(或者Boo ......但它不是那样的共同)。 我知道它是一个老帖子,但对于有同样问题的其他人可能会有好处。
答案 4 :(得分:-1)
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。添加控件和事件
在您的项目中创建一个新表单,并向其中添加以下控件/事件:
注意:这些将为空。在下一节中添加缺少的代码。
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渲染场景,但这超出了本小节的介绍范围。
我希望这是入门和娱乐的足够信息,但是请询问您是否有任何意见,问题或建议。