jueves, 7 de febrero de 2013

El primer juego en SFML 2.0 (I): Configurando el Proyecto

Bueno, después de unos días titubeantes, con mucha información teórica, os voy a mostrar como hacer nuestro primer juego con SFML. El objetivo son, por una parte aprender a configurar un proyecto C/C++ en Visual Studio 2010 (Visual Studio 2012 es igual ), también aprenderemos lo básico para crear una aplicación en SFML 2, como se inicia una ventana, como se dibuja, etc.

Con respecto a la programación de videojuegos, veremos como es el flujo de un juego, y cuales son las características básicas de todo juego, desde el mas complicado hasta el mas sencillo. También tendremos una base con la que ir introduciendo nuevos conceptos de SFML y posteriormente de Box2d, etc..

 

Preparando la carpeta de proyecto.

 

En esta entrada ya os comente como organizo yo los proyectos. Sin no tenéis una carpeta con la misma estructura es momento de hacerla. El lugar donde la pongáis es indiferente, yo tengo mi carpeta de trabajo en la raíz del disco duro ( C: en mi caso ). Es importante tener el mismo árbol de carpetas pues la configuración de VS2010 se hará según esta organización. Si no os gusta tendréis que adaptar algunos pasos a vuestra configuración.

crearprimerjuego001

En la carpeta almenas tendrá que haber las dos carpetas marcadas.

Nota:

Para facilitaros las cosas podéis bajaros mi versión de ExternalLib de mi box personal. Este contiene SFML 2.0 ultima release VS 2010 32bits del 2013-01-08 por cortesía de eXpl0it3r. Box2d y TMX-Parser con el proyecto dividido en zlib, tinyxml, base63, etc. Solo tenéis que descargarlo y descomprimirlo en la carpeta de trabajo.

 

Creando un modelo (template) de proyecto SFML 2.0

 

Cada vez que iniciemos un nuevo juego/aplicación con SFML 2.0 tendremos que realizar el mismo proceso de configuración del proyecto una y otra vez. Así que como soy un vago, voy a realizar un proyecto modelo (template) el cual solo tendremos que copiar y realizar unos mínimos cambios para empezar a trabajar.

Dentro de la carpeta MyGames_Code crearemos una nueva carpeta llamada _SFMLTemplate, me gusta ponerle guion bajo delante para distinguirlo rápidamente. Dentro de esa carpeta crearemos las siguientes carpetas: bin, build, include, source. Quedando la carpeta como sigue:

crearprimerjuego002

Ahora es momento de irnos a VS2010 express edition. Antes que nada hay que poner la configuración en experto, si no no veras las mismas cosas que tengo yo, ni tendrás el mismo acceso a las opciones que tengo yo. Sigue la siguiente imagen:

crearprimerjuego003

Una vez en modo experto, crearemos una nueva solución: Archivo > Nuevo… > Proyecto … (File > New… > Project … abriéndose el siguiente dialogo:

crearprimerjuego004

Elegimos en proyectos Win32 (1), luego “Proyecto Win32” (2) ( Win32 Project ), cambiamos el nombre del proyecto en (3) a build, en (4) cambiamos la localización del proyecto a la carpeta _SFMLTemplate que hemos creado antes, desmarcamos la opción de “crear directorio para la solución” (5) y finalmente damos a aceptar (ok). Aparece otro dialogo:

crearprimerjuego005

En “configuración de la aplicación” (Application Settings) marcamos la opción de “proyecto vacío” (empty project) y terminamos (Finish) de crear el proyecto. Esto crea un proyecto vacío, y una serie de archivos en la carpeta build que creamos antes.

nota:

Dar el nombre build al proyecto no importa ya que el nombre con el que se crea la aplicacion lo podemos cambiar desde el propio VS2010 de forma rápida y sencilla.

A continuación vamos a crear un archivo de código llamado main, esto es necesario para poder configurar bien todas las características, además de para poder probar que la configuración funciona correctamente:

crearprimerjuego009

Botón derecho sobre la carpeta “Archivos Fuentes” (Source Files), y seleccionamos Añadir > Nuevo Archivo… (Add > New Item…). En el nuevo dialogo seleccionamos “Archivo C++ (.cpp)” ( C++ File(.cpp) ) en (1) cambiamos su nombre a “main” en (2), cambiamos su localizacion a la carpeta source que creamos antes en (3) y pulsamos “aceptar” (ok) en (4).

crearprimerjuego010

 

Configurando el proyecto para trabajar con SFML 2.0


Pulsando con el botón derecho sobre el nombre del proyecto se despliega un menú, del que elegimos Propiedades (Properties).

crearprimerjuego006

En la ventana que aparece, debemos realizar varias operaciones. Primero hacer que los cambios se apliquen tanto al modo debug (de testeo ) como a la versión release (de distribución).

crearprimerjuego007

Una vez ahí, nos vamos a la sección de general y ponemos como “directorio de salida” (output directory) ../bin/, la carpeta que creamos antes, hay que tener en cuenta que los directorios relativos se empiezan a contar desde donde se encuentra el archivo de proyecto (.vcxproj). También cambiamos el “directorio intermedio” (intermediate directory) añadiendo ../obj/ al principio de lo que hay por defecto.

crearprimerjuego008

Seguimos a la sección de depuración (debugging) y cambiamos el directorio de trabajo (Working directory) a $(TargetDir) como se ve a continuación:

crearprimerjuego012

Esto hará que todas las rutas que usemos en nuestro juego estén referidas a la carpeta donde esta la aplicación.

Ahora vamos a la parte de C/C++ > General (1), Desplegamos el combobox de “Directorios de inclusión adicionales” (Additional include directories)(2) y seleccionamos “<Editar…>”(<edit…>)(3) en la nueva ventana añadiremos lo siguiente:

../include para que los archivos que coloquemos en la carpeta include que creamos antes se accesible desde nuestro código.

../../../ExternalLib/SFML2/include
 
crearprimerjuego011

OPCIONAL:

Podemos usar SFML 2 como librerías dinámicas, con lo que tendremos que copiar las .dll que necesitemos junto con nuestro ejecutable o podemos usarlas como librerías estáticas, es decir se copiaran aquellas partes de SFML 2 que usemos dentro de nuestro ejecutable.
La ventaja de las .dll es que si cambian las librerías sin cambiar la interface, por ejemplo resolviendo un bug, se puede incorporar inmediatamente a nuestro ejecutable simplemente copiando la nueva dll a nuestra carpeta de ejecutable.
La ventaja de las librerías estáticas, menos numero de archivos junto a nuestro ejecutable y menos opciones a que alguien meta mano en nuestro juego (hackeo).
Es cuestión de gustos. Para usar las librerías estáticas hay que ir a la opción de preprocesador (preprocessor) > definiciones de preprocesador (Preprocessor definitions) y añadir SFML_STATIC.

Nos movemos a la opción de Enlazado(Linker), y nos ponemos en la opción General. Allí buscamos Directorios de librerías adicionales (Aditional Lirary Directory) e insertamos ../../../ExternalLib/SFML2/lib como directorio adicional de búsqueda de librerías.

crearprimerjuego013

Luego en la opción entrada(input) vamos a poner las librerías que usaremos, pero esto dependerá de la versión que estemos usando (Debug o Release), pues tendremos que decir que use las librerías de debug o de relesase de SFML.

crearprimerjuego014

Primero elegiremos la versión debug/release desde el combobox de configuración. Si Visual Studio pregunta si querer guardar los cambios que habéis hecho en las configuraciones decir que SI, Enlazador > Entrada > Dependencias adicionales > <editar..> (Linker > Input > Aditional Dependencies > <edit…> ) y en el cuadro tendréis que entrar lo siguiente:

Librerías estáticas modo debug :
  • sfml-window-s-d.lib
  • sfml-system-s-d.lib
  • sfml-graphics-s-d.lib
  • sfml-audio-s-d.lib (Esto es si usáis sonido, tendréis que copiar las librerías dinámicas libsndfile-1.dll y openal32.dll de la carpeta SFML2/bin a vuestra carpeta bin)
  • sfml-main-d.lib (Esto es para los usuarios Windows si no quieren que aparezca la consola de comandos al ejecutar el programa)
  • sfml-network-s-d.lib (Esto es si queréis usar las funciones de red)
Librerías estáticas modo release:
  • sfml-window-s.lib
  • sfml-system-s.lib
  • sfml-graphics-s.lib
  • sfml-audio-s.lib ( copiar libsndfile-1.dll y openal32.dll )
  • sfml-main.lib (Esto es para los usuarios Windows si no quieren que aparezca la consola de comandos al ejecutar el programa)
  • sfml-network-s.lib (Esto es si queréis usar las funciones de red)
Librerías dinámicas modo debug : Hay que copiar las correspondientes dll desde SFML2/bin a nuestra carpeta bin junto al ejecutable.
  • sfml-window-d.lib ( copiar sfml-window-d-2.dll )
  • sfml-system-d.lib ( copiar sfml-system-d-2.dll )
  • sfml-graphics-d.lib ( copiar sfml-graphics-d-2.dll )
  • sfml-audio-d.lib ( copiar sfml-audio-d-2.dll, libsndfile-1.dll y openal32.dll )
  • sfml-main-d.lib
  • sfml-network-d.lib ( copiar sfml-network-d-2.dll )
Librerías dinámicas modo release :
  • sfml-window.lib ( copiar sfml-window-2.dll )
  • sfml-system.lib ( copiar sfml-system-2.dll )
  • sfml-graphics.lib ( copiar sfml-graphics-2.dll )
  • sfml-audio.lib ( copiar sfml-audio-2.dll, libsndfile-1.dll y openal32.dll )
  • sfml-main.lib
  • sfml-network.lib ( copiar sfml-network-2.dll  )
Un ultimo paso seria dar un nombre distinto a la version debug y a la version release, esto es importante sobre todo imprescincible para la creacion de las librerias.


Asegurandonos de estar en modo debug, en la sección General, yo suelo añadir un _d al Nombre de Objetivo ( Target Name ).

En la siguiente parte nos pondremos manos a la obra con un juego simple y clásico.

Gracias por vuestra atención. Un saludo.

13 comentarios:

Unknown dijo...

al tratar de ejecutar el codigo por default de SFML me da este error el LNK2019 y LNK 2020.. uso la version de 64bits y windows 7 ultimate, que puedo hacer?

Unknown dijo...

Hola gracias por leer mi blog. Que sea 64bits y Win7 Ultimate no importa siempre que uses VS2010. Es posible que estes linkando las librerias estaticas (tienen un "-s-" en el nombre) de SFML2 y no haya puesto la macro de preprocesador SFML_STATIC

"Para usar las librerías estáticas hay que ir a la opción de preprocesador (preprocessor) > definiciones de preprocesador (Preprocessor definitions) y añadir SFML_STATIC."

Espero que esto solucione tus problemas.
Feliz codificacion.

Unknown dijo...
Este comentario ha sido eliminado por el autor.
Unknown dijo...

esta reparado...volví a hacer todos los pasos y agregue lo que me dijo SFML_STATIC en preprocessor definitions.
Muchas gracias ahora a seguir con tu magnifico blog :)

Unknown dijo...

A mí me sigue dando error. Lo he añadido como sigue: SFML_STATIC;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)

Me da errores del tipo LNK1120, LNK2019 y LNK2038. ¿Por qué sucede? ¿Cómo puedo solucionarlo?

Unknown dijo...

Hola, Gracias por tu interes en el blog.

El error LNK2038 me dice que es posible que estes mezclando librerias de debug y de release juntas.

Asegurate de que las propiedades de DEBUG tengas añadidas como librerias adicionales las que acaban en -s-d.lib, y que en RELEASE tengas las librerias que acaban en -s.lib de las listas de librerias que menciono hacia el final de la entrada.

La unica excepcion es sfml-main-d.lib para DEBUG y sfml-main.lib para RELEASE.

Espero que esto solucione tus problemas de compilacion.

Un saludo.

Unknown dijo...

Muchas gracias por la respuesta. He revisado lo de Vinculador (Linker) > Entrada y lo tengo puesto de este modo:

En DEBUG: sfml-window-s-d.lib;sfml-system-s-d.lib;sfml-graphics-s-d.lib;sfml-audio-s-d.lib;sfml-main-d.lib;sfml-network-s-d.lib;%(AdditionalDependencies)

Y en RELEASE: sfml-window-s.lib;sfml-system-s.lib;sfml-graphics-s.lib;sfml-audio-s.lib;sfml-main.lib;%(AdditionalDependencies)

Así que no tengo nada que solucionar según lo que has dicho. :/

Un saludo.

Unknown dijo...

Otra idea que se me ocurre es que en las definiciones del precompilador hayas usado las mismas opciones (esto es SFML_STATIC;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) que me indicas antes) tanto para DEBUG como para RELEASE, cuando los pasos a dar es poner la configuracion de propiedades a "All configurations" y entonces añadir SFML_STATIC.

Solo especulo, comprueba si en RELEASE esta la etiqueta de preprocesador _DEBUG.

nlbi21 dijo...

Hola amigo no se si me vayas a responder ya que esto tiene como 1 año :c pero me sale un error después de seguir tus pasos.

LNK1123: error durante la conversión a COFF: archivo no válido o dañado.

Ojala me puedas ayudar, gracias de todas maneras y por tus tutoriales.

Unknown dijo...

Gracias por tu interes.
El error que me comentas parece que tiene que ver con haber instalado vs2012 junto con vs2010. Parece que se pisan uno a otro. En este link hablan de ese problema y de posible soluciones
http://stackoverflow.com/questions/10888391/error-link-fatal-error-lnk1123-failure-during-conversion-to-coff-file-inval

Unknown dijo...

Hola, me gustaria que me pudieras echar una mano, ya que estoy siguiendo este blog y me parece un gran trabajo y de gran ayuda.
el tema es que al compilar me sale este error:

LINK : fatal error LNK1104: no se puede abrir el archivo 'libsndfile-1.dll'

he buscado por ahi, y no se como solucionarlo, gracias y un saludo!!!

Unknown dijo...

Gracias por tu apoyo. Te falta copiar al directorio donde esta el ejecutable los archivos .dll que se encuentran en la carpeta SFML2/bin, son necesarios para que funcione el sonido.

Unknown dijo...

Muchas gracias, no leí bien ^^", me salieron algunos fallitos mas pero conseguí arreglarlo, gracias por la ayuda y por este blog, saludos!!!