Domanda

Potrei trovare una serie di tutorial di giochi 2D java e tutorial di giochi Android che utilizza solo librerie grafiche native .
Sto cercando qualcosa di simile in C # (senza DirectX o XNA)
Ho trovato questo schema del loop di gioco , ma non dice come eseguire il rendering della grafica.

L'obiettivo è simulare un semplice dispositivo elettronico.
Ho bisogno di mostrare un output grafico mentre l'utente "preme" rapidamente alcuni tasti sulla tastiera. Sembra quindi un gioco arcade.

Ad esempio Quando l'utente preme uno dei tasti freccia, un puntatore (un'immagine) si sposterà di conseguenza.

Immagino di non poterlo fare con la tipica applicazione Windows Form, posso?
Ad esempio, utilizza un controllo PictureBox e spostalo nell'evento KeyPress del Form.

È stato utile?

Soluzione

Ecco un semplice gioco che utilizza WinForms e un Timer , utilizzando Graphics per disegnare (incapsula GDI +).

Aggiunge un timer che "ticchetta" ogni 10 millisecondi.Ogni segno di spunta esegue la logica del gioco, quindi disegna una bitmap fuori schermo.Questo è in contrasto con l'utilizzo di un ciclo continuo come nell'esempio nel collegamento.

Il modulo gestisce gli eventi chiave separatamente (invece di fare qualcosa come GetKeyState )

Quando il modulo viene ridimensionato e quando viene caricato per la prima volta, creerà la bitmap del backbuffer della dimensione corretta.


Crea un nuovo modulo e sostituisci tutto il codice con di seguito.Controlla la palla usando i tasti freccia.Non esiste la nozione di morte.

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)
        }
    }
}

Altri suggerimenti

Se desideri creare disegni dinamici, puoi utilizzare WPF Canvas per questi scopi.Non supporta i giochi o simili, ma è un modo semplice per disegnare forme e immagini primitive come faresti in un sito web.

Il framework di rendering nativo per le app .NET winforms è GDI + .Ci sono molti tutorial online per disegnare semplici forme / grafica utilizzando GDI +

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top