6

我可以找到一组仅使用原生图形库的java 2D 游戏教程android 游戏教程。 我在 C# 中寻找类似的东西(没有 DirectX 或 XNA) 我找到了这个游戏循环骨架,但它没有告诉如何渲染图形。 目标是模拟一个简单的电子设备。当用户快速“按下”键盘上的某些键时,我需要显示一些图形输出。因此它看起来像街机游戏。例如,当用户按下箭头键之一时,指针(图像)将相应移动。 我想我不能用典型的 Windows 窗体应用程序来做到这一点,可以吗? 例如使用一个









PictureBox控制和移动它的KeyPress事件Form

4

3 回答 3

16

这是一个简单的游戏,使用 ,WinForms来绘制(封装 GDI+)。TimerGraphics

它添加了一个每 10 毫秒“滴答”一次的计时器。它执行游戏逻辑的每个滴答声,然后绘制到屏幕外位图。这与使用链接中的示例中的连续循环相反。

表单分别处理关键事件(而不是做类似的事情GetKeyState

当窗体调整大小时,当它第一次加载时,它将创建正确大小的后缓冲位图。


创建一个新表单并将所有代码替换为以下代码。使用箭头键控制球。没有死的念头。

using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsGame
{
    public partial class Form1 : Form
    {
        Bitmap Backbuffer;

        const int BallAxisSpeed = 2;

        Point BallPos = new Point(30, 30);
        Point BallSpeed = new Point(BallAxisSpeed, BallAxisSpeed);
        const int BallSize = 50;

        public Form1()
        {
            InitializeComponent();

            this.SetStyle(
            ControlStyles.UserPaint |
            ControlStyles.AllPaintingInWmPaint |
            ControlStyles.DoubleBuffer, true);

            Timer GameTimer = new Timer();
            GameTimer.Interval = 10;
            GameTimer.Tick += new EventHandler(GameTimer_Tick);
            GameTimer.Start();

            this.ResizeEnd += new EventHandler(Form1_CreateBackBuffer);
            this.Load += new EventHandler(Form1_CreateBackBuffer);
            this.Paint += new PaintEventHandler(Form1_Paint);

            this.KeyDown += new KeyEventHandler(Form1_KeyDown);
        }

        void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Left)
                BallSpeed.X = -BallAxisSpeed;
            else if (e.KeyCode == Keys.Right)
                BallSpeed.X = BallAxisSpeed;
            else if (e.KeyCode == Keys.Up)
                BallSpeed.Y = -BallAxisSpeed; // Y axis is downwards so -ve is up.
            else if (e.KeyCode == Keys.Down)
                BallSpeed.Y = BallAxisSpeed;
        }

        void Form1_Paint(object sender, PaintEventArgs e)
        {
            if (Backbuffer != null)
            {
                e.Graphics.DrawImageUnscaled(Backbuffer, Point.Empty);
            }
        }

        void Form1_CreateBackBuffer(object sender, EventArgs e)
        {
            if (Backbuffer != null)
                Backbuffer.Dispose();

            Backbuffer = new Bitmap(ClientSize.Width, ClientSize.Height);
        }

        void Draw()
        {
            if (Backbuffer != null)
            {
                using (var g = Graphics.FromImage(Backbuffer))
                {
                    g.Clear(Color.White);
                    g.FillEllipse(Brushes.Black, BallPos.X - BallSize / 2, BallPos.Y - BallSize / 2, BallSize, BallSize);
                }

                Invalidate();
            }
        }

        void GameTimer_Tick(object sender, EventArgs e)
        {
            BallPos.X += BallSpeed.X;
            BallPos.Y += BallSpeed.Y;


            Draw();

            // TODO: Add the notion of dying (disable the timer and show a message box or something)
        }
    }
}
于 2011-10-20T11:19:22.513 回答
1

如果您想制作动态绘图,您可以使用WPF 画布来实现这些目的。它不支持游戏等,但它是一种绘制原始形式和图像的简单方法,就像您在网站中所做的那样。

于 2011-10-20T11:05:37.813 回答
1

.NET winforms 应用程序的本机渲染框架是GDI+网上有很多使用 GDI+ 绘制简单形状/图形的教程

于 2011-10-20T11:15:57.440 回答