jueves, 30 de junio de 2011

C++: Uso del string

Hola, recientemente que estuve trabajando en un proyecto con cadenas de texto me encontré con ciertos detalles que se deben tener en cuenta:

1. Para trabajar con "strings" se puede utilizar la cabecera string, es decir, #include < string >
Cabe aclarar que no es lo mismo que ya que este ultimo no posee la declaración "string".
2. Usar "using namespace std" o utilizar "std::string"

Si se utiliza el archivo de cabecera iostream no es necesario incluir el archivo string

el código quedaría así:

#include <string>

using namespace std;
...
...

string [[nombre del objeto]];

Hasta pronto.

martes, 28 de junio de 2011

Dibujar círculos con OpenFrameworks

Volviendo del fin de semana y casi que continuando la practica del sonido, vuelvo a coger OpenFrameworks para dibujar figuras en pantalla y esta ves le toco al circulo.

Voy a montar una clase que hice para esta practica (si a alguien le interesa complementarlo, bienvenido sea, pero espero que se vuelva a montar lo que se complementó para que sea como un repositorio, la idea es aprender).

La clase se puede descargar desde esta url: https://sites.google.com/site/notasof/circulos-of

para iniciar la clase hay que escribir en la clase "testApp.cpp"...

En el metodo setup:

vector2D* center_pos = new vector2D(ofGetWidth()/2, ofGetHeight()/2);
Circle* aux_circle = new Circle(5, *center_pos, [[radio maximo permitido para los circulos como parametro]]);
circle = *aux_circle;
circle.setup();

En el metodo update:

circle.update([[incremento del radio de los circulos como parametro]]);

En el metodo draw:

circle.draw();

La clase esta debidamente comentada por si cualquier duda.
Gracias.

jueves, 23 de junio de 2011

Depurar accediendo a los archivos de la carpeta data

Esto es algo importante y que no había tenido en cuenta (ni si quiera sabia como solucionarlo) para poder reproducir un sonido desde el mismo debug de la aplicación en el IDE... y el problema era que no me estaba cargando un archivo .mp3 que estaba en la carpeta "bin/data/sounds" y cuando ejecutaba la aplicación directamente fuera del IDE efectivamente estaba cargando el recurso.
Pues la solución es la siguiente:

1. Abrir la ventana de propiedades del proyecto
2. Click en Depuración
3. Escribir en la casilla de "Directorio de trabajo" lo siguiente: "$(ProjectDir)/bin" (sin comillas)
4. Aplicar y Aceptar

Ya con esta configuración el Debug de la aplicación en el mismo IDE cargará el recurso que se desea cargar.

Configurar las directivas de salida en VS2010

1. Click derecho en el proyecto principal de la solución del panel "Explorador de soluciones"
2. Click en propiedades
Muestra la ventana de propiedades del proyecto
3. Click en General > Directorio de salida
copiar "bin\" (sin comillas)
4. Click en General > Directorios intermedios
copiar "obj\$(Configuration)\" (sin comillas)
5. Click en General > Nombre de destino
copiar "$(ProjectName)_debug"
6. Click en Aplicar y Aceptar

ya esta...

Proyecto 1 - Aprendiendo con sonidos

Antes de iniciar a trabajar con un nuevo proyecto, seguir este enlace:

Programando main.cpp:

#include
#include
#include"testApp.h"

int main()
{
ofAppGlutWindow window; //define un objeto ofAppGlutWindow
ofSetupOpenGL(&window, 800, 600, OF_WINDOW); //establece el modo de visualización
ofRunApp(new testApp());//arranca la aplicación
}

OF_WINDOW = es una constante entera que le indica a OpenGL arrancar la aplicación en modo ventana.
OF_FULLSCREEN = es una constante entera que le indica a OpenGL arrancar la aplicación en modo pantalla completa.

Programación de testApp.h y testApp.cpp:

primero hay que agregar una nueva clase, al realizar esta acción configuramos el nombre de la clase con el wizard que nos facilita el IDE y automáticamente nos crea los archivos de cabecera y de código, en este caso como se la clase se llama "testApp" entonces crea los archivos "testApp.h" y "testApp.cpp", teniendo la siguiente estructura:
archivo testApp.h:

#pragma once
class testApp
{
public:
testApp(void);
~testApp(void);
};

lo primero que se debe hacer es codificar la siguiente condición:
#idndef _TEST_APP
#define _TEST_APP
...
#endif

quedaría de la siguiente manera:
#idndef _TEST_APP
#define _TEST_APP

#include

#pragma once
class testApp
{
public:
testApp(void);
~testApp(void);
};
#endif

Notar que se hizo una inclusión del archivo de cabecera "ofMain.h" para poder utilizar el framework

Adicionalmente a esto, esta clase debe ir heredada de la clase interna del framework "ofBaseApp"

quedaría de la siguiente manera:
#idndef _TEST_APP
#define _TEST_APP

#include

#pragma once
class testApp: public ofBaseApp
{
public:
testApp(void);
~testApp(void);
};
#endif

Para poder iniciar a programar OpenFrameworks como tal hay que tener en cuenta estos métodos:
Setup: Método para establecer los valores y las condiciones iniciales de la aplicación.
Update: Método para actualizar constantemente la aplicación durante su ejecución.
Draw: Método para "dibujar" los elementos gráficos que hay en el escenario de la aplicación.

Quedaría de la siguiente manera con la definición de los métodos anteriores:
#idndef _TEST_APP
#define _TEST_APP

#include

#pragma once
class testApp: public ofBaseApp
{
public:
testApp(void);
~testApp(void);
void setup(void);
void update(void);
void draw(void);
};
#endif

Programación testApp.cpp:

Cuando el IDE crea el archivo muestra la siguiente estructura inicial:
#include "testApp.h"

testApp::testApp(void){}
testApp::~testApp(void){}

aquí se programan todos los método que tenga la clase (coloco esto por si alguien es newbie en c++ con poo).
Escribimos lo siguiente:
#include "testApp.h"

testApp::testApp(void){}
testApp::~testApp(void){}
void testApp::setup(void){}
void testApp::update(void){}
void testApp::draw(void){}

definir el siguiente objeto en el archivo testApp.h con cualquier tipo de encapsulamiento, en este caso se colocara como privado:

private:
ofSoundPlayer test_sound;

En testApp.cpp programar lo siguiente:

void testApp::setup(void)
{
test_sound.loadSound([direccion o ruta donde este el sonido]);
test_sound.play();
}
void testApp::update(void)
{
ofSoundUpdate();//Actualiza todos los sonidos
}

compilar y ejecutar...

NOTA:
tener en cuenta configurar las directivas de salida
tener en cuenta configurar el debug para poder acceder a archivos de la carpeta data

Este proyecto se quedará aquí por el momento.
Espero que sea de su agrado y cualquier problema lo discutiremos en este mismo post

Andrés Camilo
24 de Junio de 2011

9 pasos para configurar OpenFrameworks en Ubunutu

Hola nuevamente estoy escribiendo ya que por fin pude compilar un proyecto de prueba en Ubuntu con code::blocks y estoy emocionado ya que primero que todo soy "primiparo" con linux el cual siempre me ha parecido algo complejo de manipular y de entenderlo después de llevar 25 años manejando puro windows (siempre he creído que linux es exclusivamente para profesionales) y segundo que todo por que me estoy cogiendo un poco mas de confianza con el sistema operativo y esa es una buena señal.

Entrando en materia, primero quiero decir que es un poco complejo de explicar esta parte ya que como no conosco muy bien ubuntu como tal, he decidido descomprimir los archivos del framework en un directorio que se puede visualizar desde windows, esto puede ser un problema al entender pero instale ubuntu encima de windows.

Descarga de OpenFrameworks para linux

(recordar que ya debe de estar instalado codeblocks)

1. Descargar el framework desde la página: http://www.openframeworks.cc/download en el link que dice "code blocks FAT" por si se tiene un procesador de 32 bits y "(64 bit) code blocks FAT" por si se tiene un procesador de 64 bits.
2. Descomprimir los archivos en el directorio donde se quiera trabajar.
Tener en cuenta que en la carpeta "apps" es donde deben ir los proyectos propios, y recordar que para mayor comodidad y orden con los proyectos, crear una carpeta (con cualquier nombre) dentro de "apps" para crear todos lo proyectos propios ahí.

Configurar OpenFrameworks en Codeblocks

3. Crear un nuevo proyecto vacío con codeblokcs
4. click derecho en el "iconito" del proyecto en el panel "Projects" (proyectos) - Add Files Recursively...
Muestra un cuadro de exploración donde tenemos que buscar los headers del framework con la ruta "libs/openframeworks"
5. Click en Abrir
Muestra un cuadro de dialogo mostrando todos los directorios que van a agregar al proyecto y dar click en Aceptar.
Muestra un segundo cuadro de dialogo mostrando los blancos a los que queremos incluir los archivos, seleccionamos "Debug" y "Release" y clickear en Aceptar.
Se agregan todos los headers del framework en el siguiente orden:
-Workspace:
---[Nombre del proyecto]:
--------Headers:
------------libs:
---------------openFrameworks:
---------------------app
---------------------communication
---------------------events
---------------------graphics
---------------------sound
---------------------utils
---------------------video
---------------------ofMain.h (archivo el cual tenemos que incluir en nuestro archivo main.cpp

6. Crear nuevo archivo main.cpp
7. escribir en main.cpp:

#include

int main()
{
}

Si compilamos nos va a salir este error:
|1|fatal error: ofMain.h: No existe el fichero o el directorio|

esto quiere decir que nos falta vincular los archivos headers o .h en la compilación:
para hacer esto vamos a hacer lo siguiente:

8. Click derecho en el icono del proyecto - Build Options... - (muestra un cuadro de propiedades) - [Seleccionar el nombre del proyecto dentro del cuadro de dialogo] - Search Directories - Compiler
9. Click en Add
Muestra un cuadro de dialogo donde tenemos que listar los directorios que contienen los headers:
-libs:
----openFrameworks
----openFrameworks/apps
----openFrameworks/communication
----openFrameworks/events
----openFrameworks/graphics
----openFrameworks/sound
----openFrameworks/utils
----openFrameworks/video

Con estos directorios no basta para poder compilar correctamente ya que nos saldrán los siguientes errores:
../../../libs/openFrameworks/utils/ofConstants.h|100|fatal error: GLee.h: No existe el fichero o el directorio|

Esto quiere decir que hay que agregar los demas directorios que estan en "libs":
-libs:
----fmodex/include
----FreeImage/include
----freetype/include
----glee/include
----gstappsink/include
----rtAudio/include
----poco/include/Poco
----poco/include

Al parecer todo esta bien, pero si compilamos mostrará el siguiente error:
../../../libs/openFrameworks/video/ofGstUtils.h|4|fatal error: gst/gst.h: No existe el fichero o el directorio|

hay que incluir estos directorios:
del directorio usr:
------include
------include/gstreamer-0.10
------include/glib-2.0
------include/lib/x86_64-linux-gnu/glib-2.0/include
------include/libxml2

Si compilamos ya no obtendremos ningun problema, hasta ahora...

Ya con esto OpenFrameworks queda instalado y configurado para ubuntu con codebloks, cualquier problema se puede discutir en este mismo post.
Ojala que les sea de su agrado.

Andrés Camilo
Junio 23 de 2011