Anterior | Índice | Siguiente
Capítulo 5: Parte 1. Sencillo Clon de Pong
Lenguaje: C#
Para: VS2005
Por Dark-N: hernaldog@gmail.com
Visita mi Blog


http://darknromhacking.com

Ir a Parte 2


Objetivo: hacer una versión sencilla del juego PONG. Solo se puede jugar de a 2 player, el player 1 con las teclas Fecha Arriba y Fecha Abajo, y el player 2 con las teclas Num Pad 8 y Num Pad 2. Usaremos VS 2005 (C#) con SDL .NET 6.0.

Es hora de aplicar todo lo aprendido antes. Primero debemos tener una pelota y 2 paletas, estos 3 elementos los sacamos del tutorial de la página de SDL .NET ya me gustaron.

   

Ahora, como variables globales o de Clase, creamos 3 Sprites, una llamada bola, otra paleta1 y otra paleta2. También creamos e inicializamos las variables de la velocidad, pero como la bola se mueve en un plano X,Y (es un juego 2D) existe la variable velocidadX y velocidadY. Por ultimo hacemos lo mismo con las variables que guardarán el puntaje de cada jugador:

Sprite bola;
Sprite paleta1;
Sprite paleta2;
int velocidadBolaX = 1;
int velocidadBolaY = 1;
int puntajeJ1 = 0;
int puntajeJ2 = 0; 

Luego en el constructor definimos la resolución y cargamos en las imágenes en los Sprites:

Video.WindowIcon();
Video.WindowCaption = "SDL.NET - Pong";
Video.SetVideoMode(400, 300);

bola = new Sprite(new Surface("../../imagenes/Ball.PNG"));
bola.TransparentColor = Color.Magenta;
bola.Transparent = true;
...

En el game-loop pintamos las variables del marcador con la clase TextSprite("texto",[opciones]) y definimos los movimientos si se presiona una tecla con la clase Keyboard.IsKeyPressed(<tecla>), nota que si presionamos hacia abajo es como ir hacia el Eje Y negativo (-Y) según el eje cartesiano. Nosotros definimos 5 píxeles el largo del desplazamiento de la barra:

//marcador
SdlDotNet.Graphics.Font fuente = new SdlDotNet.Graphics.Font("../../fuentes/comic.TTF", 20);
TextSprite texto = new TextSprite(puntajeJ1.ToString()+" - "+puntajeJ2.ToString(), fuente, Color.Yellow);
texto.Center = new Point(Video.Screen.Width / 2, 10);

//movimiento paleta izq
if (Keyboard.IsKeyPressed(Key.UpArrow) && paleta1.Top >= 5)
    paleta1.Y -= 5; 

if (Keyboard.IsKeyPressed(Key.DownArrow) && paleta1.Bottom <= Video.Screen.Height - 5)
    paleta1.Y += 5;

Ahora se define el movimiento de la bola con su velocidad inicial:

//movimiento bola
bola.X += velocidadBolaX;
bola.Y += velocidadBolaY;

Si la bola choca con la Paleta, hay que ver que si choca por el frente, arriba o abajo. Para simplificar las cosas, veremos si choca cualquier lado con la
clase Sprite.IntersectsWith(otroSprite), haremos velicidadX = velocidadX * -1, es decir, cambiar de sentido o rebotar y se le agrega que a cada rebote la bola vaya mas rápido, asi el juego no es tan monotono.

//rebote bola con paleta, se acelera la velocidad de la bola
if (paleta1.IntersectsWith(bola))
{
    velocidadBolaX *= -1;
    velocidadBolaX += 1;
}
if (paleta2.IntersectsWith(bola))
{
    velocidadBolaX *= -1;
    velocidadBolaX -= 1;
}

Programamos cuando se haga un punto.

//hacer un punto Jugador 1 a Jugador 2
if (bola.Right > Video.Screen.Width)
    {            
        puntajeJ1++;
        bola.X = 0;
        bola.Y = 0;
        velocidadBolaX = 1;
        velocidadBolaY = 1;
    }

Se agrega la condición de que la bola rebote arriba y abajo de la pantalla:

//si bola choca arriba o abajo rebota
if (bola.Top < 0)            
    velocidadBolaY *= -1;            

if (bola.Bottom > Video.Screen.Height)            
    velocidadBolaY *= -1;

Finalmente se hace render se los objetos involucrados:

// fondo negro
Video.Screen.Fill(Color.Black);

//texto en pantalla
Video.Screen.Blit(texto);

// pintamos la bola
Video.Screen.Blit(bola);

// pintamos las paletas
Video.Screen.Blit(paleta1);
Video.Screen.Blit(paleta2);

// se actualiza la pantalla
Video.Screen.Update();



Código fuente de este capítulo:

//Tutorial de SDL .NET
//Capitulo 5: Sencillo Clon de Pong
//Por Dark-N


using System;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Drawing; //colores

using SdlDotNet;
using SdlDotNet.Graphics; //para sprites
using SdlDotNet.Core; //Eventos
using SdlDotNet.Graphics.Sprites;  //textos
using SdlDotNet.Input; //keyborad


namespace Pong
{
    class Pong: IDisposable
    {
        Sprite bola;
        Sprite paleta1;
        Sprite paleta2;
        int velocidadBolaX = 1; //valocidad inicial
        int velocidadBolaY = 1;
        int puntajeJ1 = 0;
        int puntajeJ2 = 0;        
        
        public Pong() 
        {
            Video.WindowIcon();
            Video.WindowCaption = "SDL.NET - Pong";
            Video.SetVideoMode(400, 300);

            bola = new Sprite(new Surface("../../imagenes/Ball.PNG"));
            bola.TransparentColor = Color.Magenta;
            bola.Transparent = true;

            paleta1 = new Sprite(new Surface("../../imagenes/Paddle1.PNG"));
            paleta1.Transparent = true;
            paleta1.Center = new Point(10, Video.Screen.Height / 2);
            paleta2 = new Sprite(new Surface("../../imagenes/Paddle2.PNG"));
            paleta2.Transparent = true;
            paleta2.Center = new Point(Video.Screen.Width-10, Video.Screen.Height / 2);  
       
        }


        private void Quit(object sender, QuitEventArgs e)
        {
            Events.QuitApplication();
        }

        private void Teclado(object sender, KeyboardEventArgs e)
        {
            switch (e.Key)
            {
                case Key.Escape:                
                    Events.QuitApplication();
                    break;                
            }
        }


        //ciclo de juego (game-loop)
        private void Tick(object sender, TickEventArgs args)
        {

            //marcador
            SdlDotNet.Graphics.Font fuente = new SdlDotNet.Graphics.Font("../../fuentes/comic.TTF", 20);
            TextSprite texto = new TextSprite(puntajeJ1.ToString()+" - "+puntajeJ2.ToString(), fuente, Color.Yellow);
            texto.Center = new Point(Video.Screen.Width / 2, 10);


            //movimiento bola
            bola.X += velocidadBolaX;
            bola.Y += velocidadBolaY;

            //movimiento paleta izq
            if (Keyboard.IsKeyPressed(Key.UpArrow) && paleta1.Top >= 5)
                paleta1.Y -= 5;

            if (Keyboard.IsKeyPressed(Key.DownArrow) && paleta1.Bottom <= Video.Screen.Height - 5)
                paleta1.Y += 5;
            
            //movimiento paleta der            
            if (Keyboard.IsKeyPressed(Key.Keypad8) && paleta2.Top >= 5)
                paleta2.Y -= 5;

            if (Keyboard.IsKeyPressed(Key.Keypad2) && paleta2.Bottom <= Video.Screen.Height-5)
                paleta2.Y += 5;

            //rebote bola con paleta
            if (paleta1.IntersectsWith(bola))
            {
                velocidadBolaX *= -1;
                velocidadBolaX += 1;
            }
            if (paleta2.IntersectsWith(bola))
            {
                velocidadBolaX *= -1;
                velocidadBolaX -= 1;
            }


            //hacer un punto Jugador 1 a Jugador 2
            if (bola.X > Video.Screen.Width)
            {            
                puntajeJ1++;
                bola.X = 0;
                bola.Y = 0;
                velocidadBolaX = 1;
                velocidadBolaY = 1;
            }
            
            if (bola.X < 0)
            {             
                puntajeJ2++;
                bola.X = 0;
                bola.Y = 0;
                velocidadBolaX = 1; 
                velocidadBolaY = 1;
            }

            //si bola choca arriba o abajo rebota
            if (bola.Top < 0)            
                velocidadBolaY *= -1;            
            
            if (bola.Bottom > Video.Screen.Height)            
                velocidadBolaY *= -1;            

            // fondo negro
            Video.Screen.Fill(Color.Black);

            //texto en pantalla
            Video.Screen.Blit(texto);

            // pintamos la bola
            Video.Screen.Blit(bola);

            // pintamos las paletas
            Video.Screen.Blit(paleta1);
            Video.Screen.Blit(paleta2);
            
            // se actualiza la pantalla
            Video.Screen.Update();
        }


        public void Run()
        {
            Events.KeyboardDown += new EventHandler < KeyboardEventArgs >(this.Teclado);
            Events.Tick += new EventHandler < TickEventArgs >(this.Tick);
            Events.Quit += new EventHandler < QuitEventArgs >(this.Quit);
            Events.Run();
        }

        
        static void Main(string[] args)
        {
            Pong game = new Pong();
            game.Run();
        }

        #region IDisposable Members

        private bool disposed;


        protected virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    if (this.bola != null)
                    {
                        this.bola.Dispose();
                        this.bola = null;
                    }
                }
                this.disposed = true;
            }
        }

        public void Dispose()
        {
            this.Dispose(true);
            GC.SuppressFinalize(this);
        }


        public void Close()
        {
            Dispose();
        }

        ~Pong()
        {
            Dispose(false);
        }

        #endregion
        
    }
}
El proyecto se puede bajar para VS2005 con SDL.Net 6.0 desde aquí.

Recuerda ir a la Parte 2 para ver una versión del juego más completa que la recién desarrollada.


Anterior | Índice | Siguiente
Volver a Página Principal

blog comments powered by Disqus
2003 - 2018    La Web de Dark-N