C#在图片框中制作游戏

问题描述 投票:0回答:5

每个人。因此,我正在使用图片框在C#中制作2D游戏,但对我而言,性能似乎有些差。尽管这可能只是由于我的优化不佳。

我听说过SDL和XNA,并且想知道我是否应该使用其中的任何一个?该游戏仅适用于Windows,我计划稍后再实现多人游戏,因此,一些可以帮助我进行联网的库也很酷。

顺便说一句,我来自javascript,我是相当新的C#。如果您知道,我正在制作的游戏就是2D游戏,类似于噬菌大战。

任何见识将不胜感激。 :)

c# xna sdl picturebox
5个回答
1
投票

您应该使用XNA,它也具有.Net的全部功能来处理网络连接


1
投票

我强烈推荐XNA。几个月前,我接触到它,并且发现它既易于理解(对于2D游戏来说更容易),而且功能强大。不利的一面是,微软停止了XNA的开发工作:(无论如何,如果您想进一步了解XNA,我建议您学习本教程:http://rbwhitaker.wikidot.com/xna-tutorials我尚未与Unity合作,但如果您认为几年后仍会制作游戏,那么值得一看(因为它还不像XNA那样死)。


0
投票

Monogame,http://www.monogame.net/

在开发中使用XNA代码界面(因此,如果您回滚到原始XNA,您将不会失去所有内容)(据我所知,版本2.3)还与移动设备,Linux,Mac兼容。在我看来,为Windows编译时它使用SDL。

团结也很棒,但从我的角度来看,太大却太强大了,只想高效地制作一些2D游戏。

也请看一下SharpDx,它是DirectX的.net包装器。使用起来更复杂,但可能是开始学习Directx的好方法。


0
投票

考虑将Unity3D作为选项。您可以创建2d和3d游戏,社区很大,Windows版本是免费的(我是说,是为Windows编译),并且您的代码可以用c#或Javascript(或Boo ...但是不是很常见)编写。我知道这是一篇过时的文章,但对有相同问题的其他人来说可能是一件好事。


0
投票

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

玩得开心!

© www.soinside.com 2019 - 2024. All rights reserved.