C#在图片框中制作游戏

时间:2014-05-16 12:53:04

标签: c# xna sdl picturebox

大家。所以,我正在使用图片框在C#中制作2D游戏,但对我而言,性能似乎有点糟糕。虽然这可能只是因为我的最佳化程度不佳。

我听说过SDL和XNA,并想知道我是否应该使用它们中的哪一个? 该游戏仅适用于Windows,我计划稍后实施多人游戏,因此一些帮助我建立网络的图书馆也会很酷。

顺便说一下,我来自javascript,我是一个相当新的C#。我正在制作的游戏是类似于Phage Wars的2D游戏,如果你知道的话。

非常感谢任何见解。 :)

5 个答案:

答案 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。添加控件和事件

在您的项目中创建一个新表单,并向其中添加以下控件/事件:

  • 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渲染场景,但这超出了本小节的介绍范围。

我希望这是入门和娱乐的足够信息,但是请询问您是否有任何意见,问题或建议。