Guida Interamente Scritta da Thejuster. Vietato copiare il contenuto di questa guida su altri Siti/Forum

 

Un piccolo Trick per simulare il rendering delle directX su una pictureBox.

 

In pratica questo trucco viene ancora usato oggi per creare piccoli giochini 2D con le gdi per evitare di usare le directX o altre librerie.

anche se per realizzare giochi e altamente consigliato usare le DirectX

ma in questo esempio vi illustro come poter fare un qualcosa di simile. sfruttando + o - le caratteristiche delle directX


---- Punto 1 ---- ( Graphics )

si parte da un piano da renderizzare. Quando programmiamo in directX il device vuole un controllo su cui renderizzare tutta la scena e di norma con le directX facciamo

In DirectX per effettuare un rendering completo ci basta appoggiarci al Paint del Form,

ma noi in questo caso andiamo a creare un timer,

Enabled = True, Interval = 1;

 

Se in directX avevamo

 

private void Form1_Load(object sender, EventArgs e)
        {
            dev = new DeviceDX(pictureBox1.Handle);


        } 





noi andremmo a ricreare lo stesso metodo ma sfruttando il comente GDI anzichè usare il device



private void timer1_Tick(object sender, EventArgs e)
        {
            Graphics g = Graphics.FromHwnd(pictureBox1.Handle);


        }

----- Punto 2 ------ ( Clear Screen ) Lo schermo và pulito in una sequenza velocissima, per permettere di vedere animazioni, e di eliminare il precedente rendering dal controllo in DirectX ci bastava fare
            dev.device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.White, 1, 0);
            dev.device.BeginScene();

            //Inizio Rendering
            sprite.Sprite.Begin(SpriteFlags.AlphaBlend);



          //Codice da Renderizzare a video



         sprite.Sprite.End();

            dev.device.EndScene();
            dev.device.Present();
            this.Invalidate();

}

Invece dal nostro evento TimerTick ci basta cancellare lo schermo usando la funzione Clear della picturebox

 

private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = Graphics.FromHwnd(pictureBox1.Handle);


           //Parte Rendering


            //do una pausa di 25 ms quasi come l'fps di un normale gioco 2D
            System.Threading.Thread.Sleep(25);
            g.Clear(Color.White);
         }

 

 

 


----- Punto 3 ------ ( Esempio di Rendering)

 

Ora proviamo ad eseguire un piccolo rendering di un rettangolo che segue il mouse, per fare questo abbiamo bisogno di ottenere l'offset del controllo picturebox, e tenere persente a noi che quell'offset equivale a X = 0; Y = 0;

int scx = 0, scy = 0;
        private void timer1_Tick(object sender, EventArgs e)
        {
            Graphics g = Graphics.FromHwnd(pictureBox1.Handle);

            scx = Cursor.Position.X - pictureBox1.Left - this.Left;
            scy = Cursor.Position.Y - pictureBox1.Top - this.Top;


            //Rendering
            g.DrawRectangle(Pens.Black, scx - 32/2, scy-32/2 * 2, 32, 32);


            //fps
            System.Threading.Thread.Sleep(25);
            g.Clear(Color.White);
        }

 


 

Avviamo il nostro programma e proviamo a muovere il mouse sulla picturebox, vedremo magicamente un quadratino che racchiude il cursore e che lo segue, :)

Spero che questo Trick possa essere utile per voi per realizzare piccoli giochini in GDI, e vedere tanti nuovi sorgenti di mini-game realizzati da tutti voi :)

Saluti Thejuster.