SFML - Creando una ventana

SFML en una libreria con la que podremos programar nuestros videojuegos utilizando el lenguaje que mas nos agrade ( D, C++, C, Python, etc).  Por gusto personal nosotros programaremos en C++.

Lo primero que tenemos que saber para poder crear nuestros juegos, es como crear una ventana, ya que justo aquí es donde se llevara acabo toda la magia de nuestro juego.

Bien, este sería el código de un programa que lo unico que hace es mostrar una ventana y responder a algunos eventos, como el de cerrar. En proximos ejemplos verémos como mostrar sprites y fuentes.

#include <SFML/Graphics.hpp>
using namespace sf;
int main()
{
  RenderWindow App(VideoMode(250,250,32),"SFML - Mi ventana");
  bool running = true;
  while (running)
  {
    Event event;
    while(App.GetEvent(event))
    {
      if(event.Type == Event::Closed)
        running = false;
      if(event.Type == Event::KeyPressed && event.Key.Code == Key::Escape)
        running = false;
    }
  }
  App.Close();
  return 0;
}

Muy bien, veamos..

RenderWindow App(VideoMode(250,250,32),"SFML - Mi ventana");

Creamos una variable llamada App, que justamente es la que representará nuestra ventana.

  • Recive como parametro VideoMode, el cuál contiene el modo de video a utilizar, para este ejemplo hemos utilizado una ventana de 250x250 pixeles y una profundidad de color de 32 bits por pixel.

  • El segundo parametro es una cadena será el titulo de nuestra ventana.

bool running = true;
while (running)
{
       ; ...
       ; ...

       ; ...
}

Este ciclo permitirá a nuestra ventana mantenerse abierta y en constante actualización, pero para que el usuario pueda comuniarse con nuestra ventana en necesario manejar los eventos, que sucederán por ejemplo cuando se trate cerrar la ventana, es decir le diremos a nuestro programa que hacer cuando se pulse sobre la famosa "X" de las ventanas.

Event event;


Creamos una variable "event", la que nos servirá para recivir todos los eventos que serán producidos en nuestra ventana.
while(App.GetEvent(event))
{
    ; ...
    ; ...

    ; ...
}

El método GetEvent recive como parametro un objeto de tipo Event, en el cuál guardará el evento que se esta efectuando en la ventana, regresando true en caso de que si exista algún evento que requeira ser manejado o falso en caso de no existir evento para manejar.

if(event.Type == Event::Closed)
  running = false;


Los objetos tipo Event tienen un atributo llamado Type, en el podemos obtener el tipo de evento acontesido, en este caso en particular estamos preguntando si el evento aparecido ha sido un clic sobre sobre la X de nuestra ventana y, de ser así hemos puesto la variable running en falso para que nuestro ciclo termine.
if(event.Type == Event::KeyPressed && event.Key.Code == Key::Escape)
   running = false;

Los eventos no sólo son clics por aquí y por alla, sino que tambien al teclear una tecla se considera un evento. Preguntamos si el event ocurrido ha sido un teclaso ejeje(no se me ocurrio de que otra manera referirme) y si la tecla pulsada ha sido la tecla Escape, entonces salimos del ciclo.

Muy bien!, ahora prueba la aplicación.


¿Qué?, ¿una mala sorpresa?, si, lo imagino... la ventana se ve, pero tiene un fondo transparente!, ¿verdad?. No te preocupes todo tiene solución. ¿qué fallo?, pues que no dibujamos nada en nuestro contexto, entonces queda transparente.
Primero, borremos la pantalla con un color.
App.Clear(Color(100,130,255));

El color es especificado en formato RGBA (rojo, verde, azul, opacidad), yo no coloque opacidad ya que si no se indica se asume que es 255.
Muy bien ya dibujamos algo en nuestra pantalla, pero... aún así no se ve ningún resultado, pasa que estamos dibujando en un buffer pero este no se esta mostrando,para mostrar el contenido dibujado basta con llamar el método Display, y el código completo quedaría asi:
#include <SFML/Graphics.hpp>
using namespace sf;
int main()
{
  RenderWindow App(VideoMode(250,250,32),"SFML - Mi ventana");
  bool running = true;
  while (running)
  {
    Event event;
    while(App.GetEvent(event))
    {
      if(event.Type == Event::Closed)
        running = false;
      if(event.Type == Event::KeyPressed && event.Key.Code == Key::Escape)
        running = false;
    }
    App.Clear(Color(100,13,,255));
    App.Display();
  }
  App.Close();
  return 0;
}


Fácil, no?

1 comentario :

  1. App.Clear(Color(100,13,,255));
    jejeje hay una coma de mas

    ResponderEliminar