Anda di halaman 1dari 59

APIS C++

Libreras
CAIRO ..3

Dark Game Development Kit (Dark GDK) ..9

FLTK .........................................................................................................................................9

GTK .....12

MINIWIN ....14

WXWIDGETS ....22

QT.............................................................................................................................................26

SDL + DEV .............................................................................................................................30

OPENGL......41

GRAPHICS...50

OPENGL Y GLUT...12

CAIRO
En informtica, Cairo es una biblioteca grfica de la API GTK+ usada para proporcionar
imgenes basadas en grficos vectoriales. Aunque Cairo es una API independiente de
dispositivos, est diseado para usar aceleracin por hardware cuando est disponible. Cairo
ofrece numerosas primitivas para imgenes de dos dimensiones.
A pesar de que est escrito en C, existen implementaciones en otros lenguajes de programacin,
incluyendo C++, C#, Common Lisp, Haskell, Java, Python, Perl, Ruby, Scheme (Guile, Chicken),
Smalltalk y muchos otros. Dada la doble licencia incluyendo la Licencia Pblica General
Reducida de GNU y la Licencia Pblica de Mozilla, cairo es software libre.
Modelo grfico de Cairo
Para poder explicar el modelo grfico que usa Cairo se tienen que definir los conceptos que se
utilizan. Se tienen los sustantivos y los verbos. Los sustantivos son objetos abstractos o entidades
en los cuales operan los verbos. Hay varios tipos de sustantivos y varios tipos de verbos.

Sustantivos
Destino. El destino es la superficie sobre la cual se dibuja. Puede ser una
matriz de pxeles, o un archivo SVG o PDF, o cualquier tipo de grfico. Esta
superficie colecciona los elementos de los grficos mientras se van aplicando,
permitiendo as construir un trabajo completo, de forma anloga a pintar
sobre un lienzo.
Fuente. Es la "pintura" sobre la cual se trabaja. Se muestra como una capa
superior (capa negra en la imagen). Puede ser totalmente de un color, un
patrn de colores, o incluso una superficie destino previamente creada. De
forma contraria a una pintura real, la fuente puede contener un canal de
transparencia.
Mscara. La mscara es la pieza ms importante pues controla la aplicacin
de la fuente al destino. En la imagen se muestra como una pala amarilla que
deja pasar la fuente. Cuando se aplica un verbo, es como si se adhiriera la
fuente al destino. Siempre que la mscara lo permita, la fuente es copiada, en
caso contrario, no sucede nada.
Ruta. Es cualquier cosa entre una parte de la mscara y una parte del
contexto. Se manipula por medio de los verbos de ruta.
Contexto. El contexto mantiene un registro de todo lo que un verbo afecta.
Mantiene una fuente, un destino y una mscara. Tambin mantiene muchas
variables de ayuda como el grosor de la lnea y el estido, el tipo de fuente de
letra y el tamao, etc. Tambin mantiene la ruta, la cual se transforma a una
mscara cuando se usan los verbos de dibujo. Antes de que se dibuje algo con
Cairo, se necesita crear un contexto. El contexto se almacena en el tipo de

dato cairo_t. Cuando se crea un contexto, debe de ser ligado a una superficie,
por ejemplo, una superficie de imagen si se desea crear un archivo PNG.

Verbos
Trazar. La operacin cairo_stroke() toma un lpiz virtual a travs de toda la
ruta. Permite transferir parte de la fuente (la lnea de la ruta) a travs de la
mscara, de acuerdo al ancho de la lnea, estilo, etc. que define el contexto.
Transfiere la mitad del ancho de lnea en cada lado de la ruta.
cairo_set_line_width (cr, 0.1);
cairo_set_source_rgb (cr, 0, 0, 0);
cairo_rectangle (cr, 0.25, 0.25, 0.5, 0.5);
cairo_stroke (cr);

Rellenar. La operacin cairo_fill() permite pasar un hoyo de la fuente (los


lmites de la ruta) a travs de la mscara. Al usar rutas complejas (rutas con
mltiples subrutas , como una dona, o rutas que se intersecan), estas se ven
influenciadas por las reglas de rellenado.
cairo_set_source_rgb (cr, 0, 0, 0);
cairo_rectangle (cr, 0.25, 0.25, 0.5, 0.5);
cairo_fill (cr);

Mostrar texto. La operacin cairo_show_text() forma la mscara desde


cierto texto. Se usa como atajo en vez de crear una ruta con
cairo_text_path() y luego usar cairo_fill() para transferirla.
cairo_text_extents_t te;
cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
cairo_select_font_face (cr, "Georgia",
CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
cairo_set_font_size (cr, 1.2);
cairo_text_extents (cr, "a", &te);
cairo_move_to (cr, 0.5 - te.width / 2 - te.x_bearing,
0.5 - te.height / 2 - te.y_bearing);
cairo_show_text (cr, "a");

Pintar. La operacin cairo_paint() usa una mscara que transfiere la fuente


completa al destino. Algunas personas la consideran como una mscara
infinitamente grande, otros no la consideran mscara, el resultado es el
mismo. La operacin similar cairo_paint_with_alpha() permite transferir la
fuente completa al destino, pero slo transfiere cierto porcentaje de color.
cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
cairo_paint_with_alpha (cr, 0.5);

Enmascarar. Las operaciones cairo_mask() y cairo_mask_surface()


permiten transferir de acuerdo al nivel de transparencia u opacidad. En las
partes transparentes de la superficie, la fuente se transfiere al destino. En las
partes opacas, nada se transfiere.
cairo_pattern_t *linpat, *radpat;
linpat = cairo_pattern_create_linear (0, 0, 1, 1);
cairo_pattern_add_color_stop_rgb (linpat, 0, 0, 0.3, 0.8);
cairo_pattern_add_color_stop_rgb (linpat, 1, 0, 0.8, 0.3);

5
radpat = cairo_pattern_create_radial (0.5, 0.5, 0.25, 0.5,
0.5, 0.75);
cairo_pattern_add_color_stop_rgba (radpat, 0, 0, 0, 0, 1);
cairo_pattern_add_color_stop_rgba (radpat, 0.5, 0, 0, 0, 0);
cairo_set_source (cr, linpat);
cairo_mask (cr, radpat);

Proceso de dibujo
Para poder crear una imagen, se tiene que preparar el contexto para cada uno de los verbos. Para
usar cairo_stroke() o cairo_fill() se necesita primero una ruta. Para usar cairo_show_text() se
tiene que posicionar el texto en su punto de insercin. Para usar cairo_mask() se necesita una
segunda superficie fuente. Para las dems operaciones, incluyendo cairo_paint() slo se
necesitan una fuente primaria.
Hay tres tipos de fuentes principales en Cairo: colores, gradientes e imgenes. Los colores son los
ms simples; usan un color uniforme en toda la fuente. Se pueden seleccionar colores sin previas
preparaciones con cairo_set_source_rgb() y cairo_set_source_rgba(). Usar
cairo_set_source_rgb(cr, r, g, b) es equivalente a usar cairo_set_source_rgba(cr, r, g, b,1.0), lo
cual pone el color fuente a su mximo nivel de opacidad.
Los gradientes describen una progresin de colores en funcin a su lugar de inicio y de fin,
adems de usar una serie de "paradas" a lo largo del camino. Los gradientes lineales se
construyen a partir de dos puntos que se pasan a travs de lneas paralelas, los cuales definen los
lugares de inicio y de fin. Los gradientes radiales se construyen tambin a partir de dos puntos,
pero cada uno tiene un radio asociado para el crculo que define los lugares de inicio y de fin. Las
paradas se agregan a los gradientes con cairo_add_color_stop_rgb() y
cairo_add_color_stop_rgba() que toman un color como cairo_set_source_rgb*() y un offset
para indicar donde se aplica a los lugares de referencia. Los colores entre las paradas adyacentes
se promedian en el espacio para mezclarlos de forma uniforme. El comportamiente entre los
lugares de referencia pueden ser controlados con cairo_set_extend().
Las imgenes pueden ser superficies cargadas desde archivos existentes con
cairo_image_surface_create_from_png() o tambin pueden ser superficies creadas con Cairo
en un destino anterior. La forma ms fcil de crear y usar un destino anterior como una fuente es
con cairo_push_group(), con cairo_pop_group() o con cairo_pop_group_to_source(). Se usa
cairo_pop_group_to_source() justo antes de seleccionar una nueva fuente, y
cairo_pop_group() cuando se desea guardarlo, as que se puede seleccionar uno y otra vez con
cairo_set_source().
Ejemplo de dibujo usando color

6
cairo_set_source_rgb (cr, 0, 0, 0);
cairo_move_to (cr, 0, 0);
cairo_line_to (cr, 1, 1);
cairo_move_to (cr, 1, 0);
cairo_line_to (cr, 0, 1);
cairo_set_line_width (cr, 0.2);
cairo_stroke (cr);
cairo_rectangle (cr, 0, 0, 0.5, 0.5);
cairo_set_source_rgba (cr, 1, 0, 0,
0.80);
cairo_fill (cr);
cairo_rectangle (cr, 0, 0.5, 0.5, 0.5);
cairo_set_source_rgba (cr, 0, 1, 0,
0.60);
cairo_fill (cr);
cairo_rectangle (cr, 0.5, 0, 0.5, 0.5);
cairo_set_source_rgba (cr, 0, 0, 1,
0.40);
cairo_fill (cr);

Ejemplo de dibujo usando gradientes


int i, j;
cairo_pattern_t *radpat, *linpat;
radpat = cairo_pattern_create_radial (0.25, 0.25, 0.1, 0.5,
0.5, 0.5);
cairo_pattern_add_color_stop_rgb (radpat, 0, 1.0, 0.8, 0.8);
cairo_pattern_add_color_stop_rgb (radpat, 1, 0.9, 0.0, 0.0);
for (i=1; i<10; i++)
for (j=1; j<10; j++)
cairo_rectangle (cr, i/10.0 - 0.04, j/10.0 - 0.04,
0.08, 0.08);
cairo_set_source (cr, radpat);
cairo_fill (cr);
linpat = cairo_pattern_create_linear (0.25, 0.35,
cairo_pattern_add_color_stop_rgba (linpat, 0.00,
cairo_pattern_add_color_stop_rgba (linpat, 0.25,
0.5);
cairo_pattern_add_color_stop_rgba (linpat, 0.50,
cairo_pattern_add_color_stop_rgba (linpat, 0.75,
0.5);
cairo_pattern_add_color_stop_rgba (linpat, 1.00,
cairo_rectangle (cr, 0.0, 0.0, 1, 1);
cairo_set_source (cr, linpat);
cairo_fill (cr);

0.75, 0.65);
1, 1, 1, 0);
0, 1, 0,
1, 1, 1, 0);
0, 0, 1,
1, 1, 1, 0);

Creacin de rutas
Cairo siempre tiene una ruta activa. Si se llama la funcin cairo_stroke() se dibujar la ruta. Si se
llama la funcin cairo_fill() se rellenar el interior de la ruta. Pero como la ruta inicial est vaca,
ambas llamadas a tales funciones no representarn cambios al destino. En cada llamada a
cairo_stroke() o a cairo_fill() la ruta se vaca para poder una nueva ruta.
Existen versiones alternativas de las funciones anteriores las cuales no vacan la ruta para que se
puede volver a utilizar, estas funciones son: cairo_stroke_preserve() y cairo_fill_preserve().
Proceso de creacin de rutas
Cuando se crean rutas, Cairo usa un sistema al estilo conecta los puntos.
Comienza en 1, traza una lnea a 2, luego a 3, y as sucesivamente. Cuando se
comienza una ruta o una subruta, se designa un punto el cual todava no tiene
ningn otro conectado, para esto se usa la funcin cairo_move_to(). Con esto
se cambia el punto de referencia actual sin realizar conexiones a otros puntos.
Tambin se puede mover el punto de forma relativa con
cairo_rel_move_to(). Despus de asignar el primer punto de referencia, se
usan otras operaciones las cuales actualizan el punto de referencia y lo
conectan de determinada forma.
cairo_move_to (cr, 0.25, 0.25);

Se pueden usar lneas rectas para unir los puntos de forma absoluta con
cairo_line_to() o de forma relativa con cairo_rel_line_to(). El nuevo punto
de referencia se actualiza, despus de tales operaciones se encuentra al final
de la lnea.
cairo_line_to (cr, 0.5, 0.375);
cairo_rel_line_to (cr, 0.25, -0.125);

Tambin se pueden usar arcos de un crculo para crear segmentos de ruta. En


este caso el punto que se especifica no est en la ruta, sino que es el centro
del crculo de tal arco. Ambos puntos, el punto inicial y el punto final del
crculo deben de especificarse, tales puntos se conectan en sentido de las
agujas del reloj con cairo_arc() y en sentido contrario con
cairo_arc_negative(). Si el punto de referencia anterior no est en la nueva
curva, se agrega una lnea recta donde el arco empieza. El punto de referencia
se actualiza a donde termina el arco. Slo existen versiones absolutas (no
nmero negativos).
cairo_arc (cr, 0.5, 0.5, 0.25 * sqrt(2), -0.25 * M_PI, 0.25 *
M_PI);

Tambin se pueden usar curvas de Bzier en Cairo. Si se usan, empiezan en el


punto de referencia actual y uniformemente sigue la direccin hacia otros dos
puntos, y finalmente llega a un tercer punto. Al igual que las lneas rectas,
existen dos versiones, una absoluta que es cairo_curve_to() y una relativa
que es cairo_rel_curve_to(). Cuando se usa la funcin relativa todos los
puntos son relativos al punto de referencia anterior, en vez de ser relativos

entre cada uno de ellos.

cairo_rel_curve_to (cr, -0.25, -0.125, -0.25, 0.125, -0.5, 0);

Cairo cierra la ruta trazando una lnea recta hacia el inicio de la ruta. Esta
lnea puede ser til para, por ejemplo, un polgono, pero no es til para
formas curvas. Una ruta abierta es una ruta continua que su punto inicial y su
punto final no se encuentran donde mismo.
cairo_close_path (cr);

Programa mnimo de ejemplo en C


#include <cairo.h>
int
main (int argc, char *argv[])
{
cairo_surface_t *surface;
cairo_t *cr;
surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 240, 80);
cr = cairo_create (surface);
cairo_select_font_face (cr, "serif", CAIRO_FONT_SLANT_NORMAL,
CAIRO_FONT_WEIGHT_BOLD);
cairo_set_font_size (cr, 32.0);
cairo_set_source_rgb (cr, 0.0, 0.0, 1.0);
cairo_move_to (cr, 10.0, 50.0);
cairo_show_text (cr, "Hello, world");
cairo_destroy (cr);
cairo_surface_write_to_png (surface, "hello.png");
cairo_surface_destroy (surface);
return 0;
}

Si tal archivo lo nombrramos como hello.c, la instruccin necesaria para compilarlo sera:
cc -o hello $(pkg-config --cflags --libs cairo) hello.c

Tras correr el programa hello el usuario obtendr una imagen PNG llamada hello.png con el
texto "Hello, world" escrito en color azul.

Dark Game Development Kit (Dark GDK)


Otra alternativa gratuita para su uso no comercial en la creacin de videojuegos 2D/3D. En este
caso NO se trata de un GAME ENGINE, sino de una libreria de comandos para visual c++ 2008.
En esta pgina encontrars informacin y enlaces de descarga
http://chesini.blogspot.com/2007/11/dark-gdk-game-creator.html

Antes de instalar el Dark GDK, debes instalar el Microsoft Visual C++ 2008 y el Directx 9.0c
SDK como explican en el video de la pgina oficial http://gdk.thegamecreators.com/.En esa
misma pgina viene un cdigo de programa donde carga un escenario 3D creado con el FPS
CREATOR al que aade un skybox. En la instalacin adems de la librera de comandos con su
documentacin, incluye DarkMatter 1 que es una coleccin de recursos
http://darkmatter.thegamecreators.com/
La documentacin clasifica los comandos por tema para su rpida localizacin. Los temas son:
Core, Text, Input, File, Display, Basic2D, Bitmap, Sound, Music, Sprite, Image, Light, Camera,
Basic3D, Matrix, World, Particles, 3D Maths, FTP, Memblocks, Multiplayer, System, Terrain.
Inicialmente no incluye capacidad de fsica 3D (deteccin de colisiones). Deberemos instalar otra
utilidad gratuita llamada Dark Physics compatible con Dark GDK desde aqui:
http://darkphysics.thegamecreators.com/downloads.php pero antes requiere tener instalado el
Ageia PhysX Runtime que se encuentra aqui:
http://www.nvidia.es/object/physx_8.09.04_whql_es.html
En este post viene un ejemplo de cdigo utilizando Ageia Physx
http://forum.thegamecreators.com/?m=forum_view&t=122652&b=22 (Busca en un post el botn
que pone '+ Code Snippet')
Sobre la inteligencia artificial (IA) del juego existe una herramienta llamada Dark A.I. pero no es
gratuita. http://gdk.thegamecreators.com/?f=dark_ai
La dificultad es mayor si lo comparamos al uso de un game engine como el RF, pero si lo que
queremos es crear un proyecto en un entorno 2D al que podremos incluir 3D, por ejemplo un
juego del tipo estrategia, puede ser aconsejable su uso, al ser el C++ un lenguaje de programacin
conocido por muchos y con muchos tutoriales en la red.
En cambio, para realizar un shooter no ser una opcin recomendable para la mayora.

FLTK
Fast, Light Toolkit (se pronuncia felteck) es una biblioteca de GUI multiplataforma,
desarrollada inicialmente por Bill Spitzak y luego mantenida por un grupo de desarrolladores
alrededor del mundo. La biblioteca fue desarrollada teniendo en cuenta programacin de grficos
3D en mente, para esto tiene una interfaz a OpenGL, pero es an apropiada para desarrollar
aplicaciones IGU de propsito general. Utilizando sus propios widgets, trazado de grficos 2D y
sistema de eventos (aunque FLTK2 ha ganado experimental soporte para usar opcionalmente la
biblioteca grfica cairo) desarrollados sobre el abstracto cdigo dependiente del sistema, lo cual
permite escribir programas que lucen idnticos cuando son compilados en cualquiera de los
sistemas operativos soportados.
FLTK es software libre, licenciado bajo LGPL con la clusula adicional que permite enlazado
esttico por aplicaciones con licencias incompatibles. Adems incluye a FLUID (del ingls,

10

FLTK User Interface Designer), una interfaz de diseo grfico de FLTK que genera los archivos
de cabecera y cdigo para una IGU desarrollada.
En contraste a otras bibliotecas como Qt y wxWidgets, FLTK aplica una estricta regla de
eficiencia antes de apariencia, lo que le cuesta restricciones a su apariencia y funcionalidad, pero
por otro lado, hace de FLTK una biblioteca que consume muy bajos recursos y muy pequea en
tamao. Esto se refleja en el pequeo tamao de los programas (el programa Hola, Mundo! en
FLTK solo ocupa alrededor de 100 KiB), y permite que sea usualmente estticamente enlazada,
aunque el enlace dinmico tambin est disponible. Lo que previene el uso de complicados
macros y pre procesamiento de cdigo separado, adems no hace uso de avanzadas caractersticas
de C++ como: plantillas, excepciones, RTTI. Las versiones FLTK 1.1.x no usan namespace. Por
lo anterior y combinado con el modesto tamao del paquete, requiere de una corta curva de
aprendizaje para los nuevos usuarios.
Pero estas ventajas como se coment anteriormente vienen con sus correspondiente desventajas.
FLTK ofrece menos widgets o menos efectos que otras que ms grandes bibliotecas grficas,
adems por usar widgets no nativos, no luce como las aplicaciones nativas que lucen y se siente
igual que la plataforma grfica del sistema.
Origen del nombre
FLTK fue originalmente diseada para ser compatible con la biblioteca Forms desarrollada para
sistemas SGI (un derivado de esta biblioteca se conoce como XForms que an es
frecuentemente utilizada). En esa biblioteca todas las funciones y estructuras inician con fl_.
Este estilo fue extendido a todos los nuevos mtodos y widgets en las bibliotecas C++, y el
prefijo FL fue tomado como nombre de la biblioteca. Despus que FL fue liberada como
cdigo abierto, fue descubierto que fue imposible buscar por FL en Internet, debido al hecho
que es la abreviacin usada para Florida. Despus de muchos debates y buscado por un nuevo
nombre para la biblioteca, la cual fue para entonces utilizada por muchos desarrolladores y
usuarios, Su creador Bill Spitzak tuvo la idea de usar FLTK, con la explicacin que significaba
la abreviacin para la frase en ingls Fast Light Tool Kit, que traduce Herramientas de
Software Rpidas y Livianas.
Desarrollando aplicaciones con FLTK

Desarrollando aplicaciones con FLUID.

11

FLTK fue principalmente diseada para, y escrita en, el lenguaje de programacin C++. Sin
embargo, diferentes interfaces existen para otros lenguajes de programacin orientada a objetos,
por ejemplo Python1 y Ruby.2
El siguiente ejemplo para FLTK 1.x crea una ventana con el texto "Hola, Mundo!" sobre un
botn:
# include <FL/Fl.H>
# include <FL/Fl_Window.H>
# include <FL/Fl_Button.H>
int main(int argc, char *argv[]) {
Fl_Window* w = new Fl_Window(330, 190);
new Fl_Button(110, 130, 100, 35, "Hola, Mundo!");
w->end();
w->show(argc, argv);
return Fl::run();
}

Software desarrollado sobre FLTK

El progama de retoque fotogrfico CinePaint actualmente migrando de GTK+ a FLTK.

flwm, un Gestor de ventanas para el sistema de ventanas X

Nuke, un software de produccin digital (ingls)

Progama para la impresin de posters PosteRazor (Windows, Mac OS X, Linux).

El BVH editor Avimator para la creacin y edicin de avatares 3D

Dillo es un pequeo navegador web

Gmsh, un generador de mallas para clculos de Elementos finitos (ingls)

EDE - Entorno del escritorio Equinox (ingls)

Open Movie Editor Entorno abierto de edicin de pelculas (ingls)

12

GTK
GTK "GIMP Tool Kit" es una biblioteca del equipo GTK+, la cual contiene los objetos y
funciones para crear la interfaz grfica de usuario. Maneja widgets como ventanas, botones,
mens, etiquetas, deslizadores, pestaas, etc.

Ventanas
GTK define varias clases para construir ventanas.
Clase
GtkDialog
GtkInvisible
GtkMessageDialog
Una ventana que puede contener
otros widgets.
GtkWindowGroup
GtkAboutDialog
GtkAssistant

Descripcin
Crea una ventana popup.
Un widget que no es mostrado.
Una ventana de mensaje.

Una ventana como la anterior pero con funciones limitadas.


Muestra informacin sobre una aplicacin
Un widget que se usa para guiar a los usuario a travs de
operaciones de varios pasos (asistente).

Widgets sencillos
Los siguientes widgets slo muestran informacin y no permiten la entrada de datos.
Clase

Descripcin

Etiqueta que muestra informacin de


GtkAccelLabel una tecla aceleradora a la derecha del
texto

GtkImage

Widget que permite mostrar una


imagen.

GtkLabel

Widget que permite mostrar una


pequella o mediana cantidad de texto.

Imagen

13

GtkProgressBar

Widget que indica el estado de un


progreso.

GtkStatusbar

Reporta mensajes de menor


importancia al usuario en la barra de
estado.

GtkStatusIcon

Muestra un cono en el rea de


notificacin del sistema.

Botones
Clase
GtkButton

Descripcin
Botn convencional. Crea una seal
cuando se da click sobre l.

Etiqueta con un botn el cual puede


GtkCheckButton estar en dos estados: seleccionado o
no seleccionado.

GtkRadioButton

Opcin de una lista mltiple de


opciones.

GtkToggleButton

Botn convencional el cual puede


mantener su estado.

Imagen

14

GtkLinkButton

Botn que enlaza a una URL.

GtkScaleButton

Botn que hace aparecer una


escala.

GtkVolumeButton

Botn que hace aparecer un control


de volumen.

MINIWIN
MiniWin es super-simple: slo es un miniconjunto de funciones. Para usar MiniWin solamente
hay que seguir 2 pasos importantes:
Poner arriba del programa principal:

#include "miniwin.h"
using namespace miniwin;
Fjate en que hay comillas dobles y no ngulos alrededor de miniwin.h en el #include . El using
namespace miniwin te ser familiar por su equivalente con std .
Hacer la funcin main as:

int main() {
return 0;
}
Es decir, sin parmetros y devolviendo int . El return 0 es obligatorio. Aparte de eso se trata de
utilizar las funciones que se comentan a continuacin.

Control de la ventana

15

En MiniWin, al ejecutar el programa principal siempre se crear una sola ventana, a la que nos
referiremos como la ventana. Esta ventana no se puede redimensionar con el ratn (solamente
con la accin vredimensiona() ) y mantiene el dibujo que pintas aunque la minimices. Algunas
funciones utilizan coordenadas en esta ventana. Las coordenadas son un par ordenado de valores,
donde el primer valor es x y el segundo es y:

La esquina superior-izquierda es el orgen, con coordenadas (0,0).

A medida que nos desplazamos a la derecha la coordenada x crece.

A medida que nos desplazamos hacia abajo la coordenada y crece.


El diagrama sera el siguiente:

Hay 3 funciones relacionadas con las dimensiones de la ventana.


void vredimensiona (int ancho, int alto)
Accin que cambia las dimensiones (en pxeles) de la ventana. El primer parmetro indica
la anchura y el segundo la altura, ambos son enteros. Por ejemplo:
vredimensiona(800, 600); cambiar las dimensiones de la ventana a 800 por 600 pxeles.
El hecho de redimensionar la ventana implica que sta se borrar, como si hicisemos
borra() justo despus del vredimensiona().
int vancho ()
Funcin que averigua el ancho de la ventana en pxeles, devolviendo un entero. Por
ejemplo, el siguiente cdigo utiliza la funcin vancho():
int a = vancho();
if (a > 500) {
cout << "El ancho de la ventana es mayor que 500" << endl;
}

16

int valto ()
Funcin que averigua la altura de la ventana en pxeles, devolviendo un entero. Es similar
a vancho().
void vcierra ()
Accin que cierra la ventana y termina el programa. Si no se llama esta accin, cuando
acaba la funcin main la ventana se queda abierta mostrando el dibujo que hayamos
hecho, y hay que cerrarla manualmente. Esto nos puede interesar para observar el dibujo
que hayamos hecho.

Pintar en la ventana
Para pintar en la ventana hay que utilizar alguna de las acciones linea(), rectangulo(), circulo(),
etc. y luego hay que invocar la accin refresca(). Esencialmente, todo lo que se pinta se acumula
en un buffer y luego la accin refresca() hace visible en la ventana lo que se haya pintado
previamente. Esto tiene una ventaja y un inconveniente. La ventaja es que permite pintar muchas
cosas y luego refrescar solo una vez, que es importante cuando se hacen juegos. El inconveniente
es que si se olvida la llamada a refresca(), entonces no aparece por pantalla nada de lo que se ha
pintado y puede parecer que no funciona nuestro programa. En definitiva, es importante recordar
llamar a :cpp:func:`refresca` al acabar de pintar.
Para cambiar el color con el que se pinta, hay que llamar a la funcin color() antes de pintar, es
decir, todo lo que se pinta despus de la instruccin:
color(ROJO);
saldr en color rojo.
Por ejemplo, el siguiente programa
#include "miniwin.h"
using namespace miniwin;
int main() {
vredimensiona(200, 200);
lnea (0, 0, 100, 100);
color (AZUL);
rectngulo (10, 10, 50, 50);
color (ROJO);
circulo (100, 50, 20);
color (AZUL);
circulo_lleno (50, 100, 20);

17

color (VERDE);
rectangulo_lleno (50, 50, 100, 100);
refresca ();
}
Muestra el siguiente dibujo:

En MiniWin disponemos de las siguientes acciones para pintar objetos:


void punto(float x, float y)
Pinta un solo punto de la pantalla, en la posicin (x, y). En funcin de la resolucin de la
pantalla esto puede costar un poco de ver.
Por ejemplo:
color(AMARILLO);
punto(10, 10);
punto(9, 10);
punto(10, 9);
punto(10, 11);
punto(11, 10);
refresca();
Pinta una minicruz centrada en la posicin (10, 10).
void linea(float x_ini, float y_ini, float x_fin, float y_fin)
Dibuja una lnea desde el punto (izq, arr), o sea izquierda-arriba hasta el punto (der, aba)
o sea, derecha-abajo.
Dos lneas paralelas son, por ejemplo:
linea(0, 0, 100, 0);
linea(0, 10, 100, 10);
void rectangulo(float izq, float arr, float der, float aba)

18

Dibuja el borde de un rectngulo con coordenadas horizontales (las x) izq y der y


verticales (las y) arr y aba.
void rectangulo_lleno(float izq, float arr, float der, float aba)
Dibuja un rectngulo relleno con coordenadas horizontales (las x) izq y der y verticales
(las y) arr y aba.
void circulo(float x_cen, float y_cen, float radio)
Dibuja una circumferencia con el centro en (x_cen, y_cen) y con un cierto radio. Si
llamamos:
circulo(50, 100, 20);
Aparecer un crculo de radio 20 con centro en el punto (50, 100)
void circulo_lleno(float x_cen, float y_cen, float radi)
Dibuja un crculo (relleno) con el centro en (x_cen, y_cen) y con un cierto radio.
void texto(float x, float y, const std::string& texto)
Pinta un texto a partir de la posicin (x, y) con el contenido del parmetro texto.
Para cambiar el color tenemos las 2 acciones siguientes:
void color(int c)
Cambia el color a partir de un nmero entre 0 y 7 ambos incluidos. MiniWin define las
siguientes 8 constantes para no tener que recordar a qu color corresponde cada nmero:
NEGRO, ROJO, VERDE, AZUL, AMARILLO, MAGENTA, CYAN y BLANCO.
void color_rgb(int r, int g, int b)
Cambia el color a un valor RGB arbitrario. Los valores de los parmetros r, g y b deben
estar entre 0 y 255 ambos incluidos. Por ejemplo:
color_rgb(128, 0, 0);
selecciona un color rojo apagado.
Despus de llamar a las funciones para pintar objetos, es muy importante llamar a la accin
refresca():
void refresca()

19

Pone en la ventana todos los objetos pintados acumulados. Muy importante llamar a esta
accin despus de pintar. Por ejemplo, para pintar una lnea (que se aade a todo lo
anterior:
linea(0, 0, 100, 100);
refresca();
void borra()
Borra el buffer interno de pintado. Todo lo que se pinte despus se pintar sobre un
fondo negro, como al principio. Para borrar la pantalla y dejarla negra, habra que llamar a
refresca() despus de llamar a borra(). O sea, para borrar la pantalla completamente y
hacerlo visible:
borra();
refresca();

Funciones para teclas


En MiniWin se puede determinar si el usuario acaba de presionar una tecla (o hace un rato), con
la funcin tecla(). Esta funcin no espera a que el usuario presione una tecla ya que esto
interrumpira el programa totalmente. Por eso uno de los valores que puede devolver tecla() es el
valor NINGUNA para indicar que el usuario no ha presionado una tecla recientemente. Las
teclas que se presionan se guardan en un buffer y cada llamada a tecla() las retorna una por una.
int tecla()
Devuelve un entero para indicar si se acaba de presionar una tecla. Si se han presionado
varias, se puede llamar a tecla() varias veces y se irn obteniendo las teclas presionadas
por orden.
Si no se ha presionado ninguna tecla, se devuelve la constante NINGUNA
Para evitar tener que recordar qu enteros representan a cada tecla, MiniWin define las
siguientes constantes:
Tecla

Constante

Ninguna tecla

NINGUNA

Esc

ESCAPE

Barra espaciadora

ESPACIO

20
Tecla

Constante

Return

RETURN

Flecha Arriba

ARRIBA

Flecha Abajo

ABAJO

Flecha Derecha

DERECHA

Flecha Izquierda

IZQUIERDA

Teclas de Funcin

F1 , F2

hasta F10

Para las letras y los nmeros, el cdigo devuelto es el mismo cdigo ASCII. Para los nmeros
entre 48 y 57 y para las letras entre 65 y 90 (las maysculas).
El siguiente ejemplo detecta la presin de una tecla y si es la letra A se muestra un mensaje:
int t = tecla();
if (t == int('A')) {
mensaje("Has presionado la tecla 'A'");}
Funciones para el ratn
En MiniWin se puede saber dnde est situado el puntero del ratn y tambin si los botones
derecho y/o izquierdo estan presionados. Las funciones disponibles son las siguientes:
bool raton(float& x, float& y)
Obtiene las coordenadas de la posicin del ratn (x e y), y adems devuelve un Booleano
que indica si el ratn se encuentra dentro de la ventana. Si el ratn est fuera de la ventana
los valores x e y no sern reales y hay que ignorar su valor.
bool raton_dentro()
Retorna un valor Booleano indicando si el ratn se encuentra dentro de la ventana. Es
importante llamar a esta funcin antes de obtener las coordenadas de la posicin del ratn
ya que estas son correctas solamente cuando el ratn est dentro de la ventana.
float raton_x()
Devuelve la coordenada x de la posicin del ratn. Esta posicin es vlida si el ratn se
encuentra dentro de la ventana, por eso es necesario antes llamar a raton_dentro() o
llamar directamente a raton().

21

float raton_y()
Devuelve la coordenada y de la posicin del ratn. Esta posicin es vlida si el ratn se
encuentra dentro de la ventana, por eso es necesario antes llamar a raton_dentro() o
llamar directamente a raton().
void raton_botones(bool& izq, bool& der)
Obtiene el estado de los botones derecho e izquierdo del ratn. Si el valor Booleano izq
es cierto el botn izquierdo est presionado, y lo mismo ocurre para der con el botn
derecho.
bool raton_boton_izq()
Retorna un booleano indicando si el botn izquierdo est presionado.
bool raton_boton_der()
Retorna un booleano indicando si el botn derecho est presionado.

Funciones para mensajes


En MiniWin se puede mostrar un mensaje al usuario a travs de una pequea ventana. Tambin se
puede hacer una pregunta (tipo S/No) usando una ventanita especial.
void mensaje(string msj)
Muestra una pequea ventana auxiliar con el mensaje msj y espera que se presione el
botn Ok. [Esta funcin an no est implementada en Linux]
Por ejemplo, si llamas a la accin as:
mensaje("MiniWin es fcil");
aparecer una ventana como la siguiente:

bool pregunta(string msj)


Muestra una ventana auxiliar con la pregunta que se pasa en msj y devuelve true o false
en funcin de la contestacin del usuario. [Esta funcin an no est implementada en
Linux]
Por ejemplo, si llamas a la accin as:

22

pregunta("MiniWin te parece fcil?");


aparecer una ventana como la siguiente:

WXWIDGETS
Las wxWidgets son unas bibliotecas multiplataforma y libres, para el desarrollo de interfaces
grficas programadas en lenguaje C++. Estn publicadas bajo una licencia LGPL, similar a la
GPL con la excepcin de que el cdigo binario producido por el usuario a partir de ellas, puede
ser propietario, permitiendo desarrollar aplicaciones empresariales sin coste de licencias.
Las wxWidgets proporcionan una interfaz grfica basada en las bibliotecas ya existentes en el
sistema (nativas), con lo que se integran de forma ptima y resultan muy portables entre distintos
sistemas operativos. Estn disponibles para Windows, MacOS, GTK+, Motif, OpenVMS y OS/2.
Tambin pueden ser utilizadas desde otros lenguajes de programacin, aparte del C++: Java,
JavaScript, Perl, Python, Smalltalk, Ruby.

Breve historia
Fue diseado por Julian Smart en la universidad de Edinburgo 1992. Julian diseaba la
herramienta meta-CASE llamada Hardy que necesitaba correr en Windows, as como en
estaciones de trabajo de X-Unix, las herramientas existentes y comerciales multiplataforma eran
costosas para un proyecto experimental, as que su nica alternativa era crear su propia
herramienta. Inicialmente se llamaba wxWindows pero tuvo que cambiar al nombre por
wxWidgets debido a que la empresa Microsoft interpuso una demanda a finales de 2003 por una
posible confusin con el nombre de su sistema operativo.
WxWidgets (W para Windows y la X para X-Unix) es un framework parecido a MFC,
especializado en el desarrollo de aplicaciones multiplataforma en lenguaje C++ aunque tambin
existen bindings para Python y Perl, es multiplataforma, soporta Windows, Linux, Mac OS X ,
Unix y sus variantes, Solaris, Plataformas Embedded (inicios de investigacin ), tambin en
plataformas mviles como Microsoft Pocket PC, y Palm OS; se distribuye bajo licencia
wxWindows License (compatible con Open Source y LGPL) permitiendo utilizarla para
desarrollos comerciales, siempre y cuando estos desarrollos no usen cdigo distribuido bajo
alguna licencia GNU.
Cuenta con una parte denominada wxBase que incluye clases como wxString, clases para el
manejo de archivos y directorios de manera independiente del sistema, funcionalidades como:

23

grficos 2D, 3D con OpenGL, Bases de Datos (ODBC), Redes, Impresin, Hilos, visin e
impresin del HTML, un sistema de archivos virtual y cuenta con algunos IDEs.
La razones por las que se podra elegir wxWidgets son adems de sus ya mencionadas
caractersticas es que cuenta con soporte, documentacin en Internet, ayuda en lnea, foros,
tutoriales en diversos formatos, desarrolladores en la red por lo que se percibe inters y un futuro,
cuenta con un libro de 1000 pginas imprimibles de documentacin y en lnea, sistema flexible a
eventos, llamadas a grficos como lneas, rectngulos con esquinas redondeadas, etc. Soporte de
MDI (Multiple Document Interface), puede crear DLL sobre Windows, y bibliotecas dinmicas
en Unix.
Licencia
wxWidgets es distribuido bajo una licencia personalizada wxWindows License, similar a la
Licencia Pblica General Reducida de GNU, con la excepcin de que trabajos derivados en
forma binaria pueden ser distribuido bajo los trminos del usuario. Esta licencia est aprobada
por la Open Source Initiative,1 haciendo de wxWidgets software libre.2 Su nombre ser cambiado
por wxWidgets Licence.
Soporte oficial
Compatibilidad de plataformas
wxWidgets es compatible en las siguientes plataformas.

Windows - wxMSW (Windows 95/98/ME, NT, 2000, XP, y Vista)

Linux/Unix wxGTK+, wxX11, wxMotif

Mac OS X - wxMac (10.3 usando Carbon)

OS/2 - wxOS2, wxPM, wxWidgets para GTK+ o Motif puede ser compilado en OS/2

Plataformas Empotradas - wxEmbedded

Otras plataformas

Amiga - wxWidgets-AOS: AmigaOS port

Compiladores compatibles
Est confirmado que wxWidgets funciona correctamente con los siguientes compiladores.
wxMSW

wxGTK

24
Compilador
Microsoft Visual Studio - Visual C++
Borland C++
Borland C++ Builder
Watcom C++, OpenWatcom
CodeWarrior
Cygwin
MinGW
Digital Mars C/C++ compiler

Versin Compilador
5.0 +
g++
5.5 +
Sun Studio C/C++
2006 + HP aC++
10.6 + IBM XL C/C++
7+
1.5 +
2.0 +
8.40 +

Versin
2.95 +
5.9
3.80
8.00

Implementaciones

wxPython logo
La biblioteca wxWidgets adems de estar implementada originalmente en C++, cuenta con
implementaciones (bindings) para varios lenguajes de programacin utilizados comnmente.
Algunos de ellos.
Lenguaje
Python
PHP
Erlang
Haskell
Tcl
Lua
Perl
Ruby
Smalltalk
Basic
BlitzMax
C
D
Euphoria
.NET Framework
Java
JavaScript
JavaScript

wxWidgets es mejor descrito como un conjunto de herramientas nativo debido a que provee una
fina capa de abstraccin a los controles nativos de una plataforma, contrario a la emulacin de
controles utilizando grficos primitivos. Utilizar un control nativo en las plataformas existentes

25

nos permite conseguir resultados visuales ms nativos para la interface grfica que otras
bibliotecas como Swing (para Java), adems de ofrecer mejor rendimiento y otros beneficios.
wxWidgets no solo se restringe al desarrollo de interfaces grficas, esto debido a que la biblioteca
cuenta con una capa de inter-procesos de comunicacin, funcionalidades para la red como
sockets, y mucho ms.

IDE y RAD para wxWidgets

CodeLite en Windows XP
Hay muchas herramientas de Desarrollo Rpido de Aplicaciones (RAD) y Entornos de Desarrollo
Integrado (IDE) disponibles, entre ellos.

Boa Constructor (Python)

Code::Blocks (mediante el plugin wxSmith)

CodeLite

wxDev-C++ (Plugin)

wxGlade

wxFormBuilder

Aplicaciones desarrolladas con wxWidgets

26

Audacity ejecutando en Ubuntu


Aplicaciones populares que utilizan wxWidgets:

Amaya - Desarrollo web

aMule - Aplicacin de intercambio de archivos

Audacity - Editor de audio

BitTorrent - Aplicacin de intercambio de archivos

Code::Blocks - C/C++ IDE

CodeLite - Editor simple para C++ (Coleccin de herramientas Gratuitas, implementadas


mediante plugins)

Dolphin - Emulador de Nintendo GameCube, Wii, y Triforce

Digsby - Aplicacin multiprotocolo de mensajera instantnea

FileZilla - Cliente FTP

RapidSVN - Client SVN

TortoiseCVS - Cliente CVS

OpenCPN - Chart Plotter (Visualizador de Cartografa Nutica y posicionamiento


mediante el uso de GPS)

QT
Qt es una biblioteca multiplataforma ampliamente usada para desarrollar aplicaciones con
interfaz grfica de usuario, as como tambin para el desarrollo de programas sin interfaz grfica,
como herramientas para la lnea de comandos y consolas para servidores.
Qt es desarrollada como un software libre y de cdigo abierto a travs de Qt Project, donde
participa tanto la comunidad, como desarrolladores de Nokia, Digia y otras empresas.2
Anteriormente, era desarrollado por la divisin de software de Qt de Nokia, que entr en vigor
despus de la adquisicin por parte de Nokia de la empresa noruega Trolltech, el productor
original de Qt, el 17 de junio de 2008.3 Qt es distribuida bajo los trminos de GNU Lesser
General Public License (y otras). Por otro lado, Digia est a cargo de las licencias comerciales de
Qt desde marzo de 2011.

27

Qt es utilizada en KDE, entorno de escritorio para sistemas como GNU/Linux o FreeBSD, entre
otros. Qt utiliza el lenguaje de programacin C++ de forma nativa, adicionalmente puede ser
utilizado en varios otros lenguajes de programacin a travs de bindings. Tambin es usada en
sistemas informticos empotrados para automocin, aeronavegacin y aparatos domsticos como
frigorficos.
Funciona en todas las principales plataformas, y tiene un amplio apoyo. El API de la biblioteca
cuenta con mtodos para acceder a bases de datos mediante SQL, as como uso de XML, gestin
de hilos, soporte de red, una API multiplataforma unificada para la manipulacin de archivos y
una multitud de otros para el manejo de ficheros, adems de estructuras de datos tradicionales.
Qt es utilizada principalmente en Autodesk Maya,5 6 The Foundry's Nuke,7 Adobe Photoshop
Album, Google Earth, Skype,8 VLC media player,9 VirtualBox, Dassault DraftSight,10 11 y
Mathematica,12 y por la Agencia Espacial Europea,13 DreamWorks,14 15 HP,16 KDE,17 Lucasfilm,18
19
Panasonic,20 Philips,21 Samsung,22 Siemens,23 Volvo,24 Walt Disney Animation Studios25 y
Research In Motion.26

Historia
Fue desarrollado inicialmente por Haavard Nord (CEO de Trolltech) y Eirik Chambe-Eng
(presidente de Trolltech). Haavard y Eirik se reunieron en el Instituto Noruego de Tecnologa de
Trondheim, donde ambos se graduaron con una maestra en ciencias de la computacin. El kit de
herramientas se llam Qt porque la letra Q luca atractiva en la fuente Emacs la cual era muy
usada por Haavard en su trabajo, y "t" se inspir en Xt, el kit de herramientas X "X Tool kit".
Inicialmente Qt apareci como biblioteca desarrollada por Trolltech (en aquel momento Quasar
Technologies) en 1992 siguiendo un desarrollo basado en el cdigo abierto, pero no
completamente libre. Originalmente permita desarrollo de software cerrado mediante la compra
de una licencia comercial, o el desarrollo de software libre usando la licencia Free Qt. Esta ltima
no era una licencia real de software libre dado que no permita redistribuir versiones modificadas
de Qt. Se us activamente en el desarrollo del escritorio KDE (entre 1996 y 1998), con un notable
xito y rpida expansin, camino de convertirse en uno de los escritorios ms populares de
GNU/Linux.
Este hecho causaba preocupacin desde el proyecto GNU, ya que vean como una amenaza para
el software libre que uno de los escritorios libres ms usados se apoyase en software propietario.
Para contrarrestar esta situacin se plantearon dos ambiciosas iniciativas: por un lado el equipo
de GNU en 1997 inici el desarrollo del entorno de escritorio GNOME con GTK+ para
GNU/Linux. Por otro lado se intent hacer una biblioteca compatible con Qt pero totalmente
libre, llamada Harmony.
En 1998 desarrolladores de KDE se reunieron con Trolltech para establecer la KDE Free Qt
Foundation, que estableca que si Trolltech dejaba de desarrollar la versin gratuita y semi-libre
de Qt la propia Fundacin podra liberar la ltima versin publicada de la biblioteca Qt bajo una
licencia tipo BSD28 Con la versin 2.0 se cambi a la licencia Q Public License, considerada de

28

cdigo abierto. Este cambio pretenda acallar las crticas a Qt y KDE que alegaban que no era
software libre. Sin embargo, QPL no era compatible con la licencia GPL que usaba KDE, por lo
que hubo voces que afirmaban que se estaba violando la licencia GPL al mezclar software QPL
(la biblioteca Qt) con software GPL (KDE).29
El 4 de septiembre de 2000, Trolltech comenz a ofrecer la biblioteca Qt en su versin 2.1 bajo la
licencia GPL en su versin para Linux. La versin para Mac OS X no se public bajo GPL hasta
junio de 2003, mientras que la versin para Windows fue publicada bajo la licencia GPL en junio
de 2005.
El 18 de enero de 2008, Trolltech anunci que tambin ofrecera Qt bajo la licencia GPL v3.
En junio de 2008, Nokia adquiri Trolltech, para desarrollar aplicaciones de escritorio y para
dispositivos mviles. Esta ltima fue integrada a Nokia como Qt Software.3
El 14 de enero de 2009, Nokia anunci que Qt v4.5 se licenciara adicionalmente bajo la licencia
LGPL 2.1, con el lema Qt Everywhere.30
Nokia anunci que va a detener sus desarrollos en Symbian para usar la plataforma de Microsoft
para sus telfonos inteligentes en febrero de 2011.
El 9 de agosto de 2012, Digia anunci un acuerdo con Nokia para la adquisicin de Qt. Algunos
de los planes de Digia son el desarrollo de Qt para Android, iOS y Windows 8.31
Qt cuenta actualmente con un sistema de triple licencia: GPL v2/v3 para el desarrollo de software
de cdigo abierto y software libre, la licencia de pago QPL para el desarrollo de aplicaciones
comerciales, y a partir de la versin 4.5 una licencia gratuita pensada para aplicaciones
comerciales, LGPL.

Plataformas
Qt se encuentra disponible para sistemas tipo unix con el servidor grfico X Window System
(Linux, BSDs, Unix), para Apple Mac OS X, para sistemas Microsoft Windows, para Linux
empotrado (en ingls Embedded Linux), para sistemas empotrados como PDA, Smartphone, etc.
y para dispositivos que utilizan Windows CE32
Qt Software anunci el 20 de octubre de 2008 una versin de Qt para la plataforma S60.33 34
Adicionalmente tambin est disponible QSA (Qt Scripts for Applications), que, basndose en
ECMAScript/JavaScript, permite introducir y crear scripts en las aplicaciones creadas con Qt.
Hay tres ediciones de Qt disponibles en cada una de estas plataformas, llamadas:

29

GUI Framework edicin con nivel reducido de GUI, orientado a redes y bases de
datos.

Full Framework edicin completa comercial

Open Source edicin completa Open Source

Bindings
Qt dispone de una serie de bindings para diversos lenguajes de programacin:

PyQt Bindings GPL/Comercial para Python.

PySide35 LGPL bindings para Python de OpenBossa (subsidiario de Nokia).

PythonQt36 LGPL bindings para Python.

Qyoto37 Bindings para C# u otros lenguajes.NET. Existe un conjunto adicional de


bindings Kimono38 para KDE.

QtRuby39 Bindings para Ruby. Existe un conjunto adicional de bindings, Korundum


para KDE.

Qt Jambi40 Bindings para Java.

QtAda41 Bindings para Ada.

FreePascal Qt442 Bindings para Pascal.

Perl Qt443 Bindings para Perl.

PHP-Qt Bindings para PHP.

Qt Haskell44 Bindings para Haskell.

lqt45 Bindings para Lua.

DaoQt46 Bindings para Dao.

QtD47 Binding para D.

Ejemplo de programacin

30

Otro ejemplo del programa Hola Mundo!


El siguiente es un ejemplo usando Qt del conocido programa Hola Mundo!, donde se crea una
ventana con una etiqueta (QLabel) mostrando el texto Hola Mundo!
/******** Hola.cpp **********/
#include <QtGui/QApplication>
#include <QtGui/QLabel>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QLabel label("Hola Mundo!");
label.show();
return app.exec();
}

Compilacin y ejecucin
1. Se crea la carpeta Hola
2. Se crea el archivo Hola.cpp en la carpeta Hola
3. En un emulador de terminal descender a la carpeta Hola y ejecutar:
a) qmake -project
b) qmake
c) make/gmake/nmake - segn el sistema operativo o de compilacin
4. Para ejecutar el programa:
d) ./release/Hola (en Windows: release\Hola.exe)

Aplicaciones escritas en Qt
Ejemplos de aplicaciones populares que usan Qt:

Adobe Photoshop Album, aplicacin para organizar imgenes.8

Avidemux, programa libre para la edicin y procesamiento de video.

Doxygen, API generadora de documentacin.

31

Gadu-Gadu, popular cliente polaco de mensajera instantnea.

Google Earth, simulador de mapas en 3D.

KDE, popular entorno de escritorio para sistemas operativos tipo-Unix.


o KDELibs, una biblioteca base para gran cantidad de aplicaciones KDE,
incluyendo Amarok, K3b, KDevelop, KOffice, etc.

Last.fm Player, el cliente de escritorio para la popular comunidad web de msica y radio
por internet.

Launchy, programa de cdigo abierto para ejecutar aplicaciones para Windows.

LMMS, secuenciador y sintetizador de msica.

LyX, un GUI para LaTeX.

Mathematica, la versin de Linux usa Qt para el GUI.

MythTV, grabador de vdeo digital de cdigo abierto.

Psi, cliente de mensajera instantnea para XMPP.

Qt Creator, el entorno de desarrollo integrado, software libre y multiplataforma de Nokia.

Quantum GIS, sistema de Informacin Geogrfica.

Scribus, aplicacin para la publicacin de escritorio.

Skype, aplicacin VOIP.9

TeamSpeak, aplicacin multiplataforma para la comunicacin con voz.

Tlen.pl, popular cliente polaco de mensajera instantnea.

TOra, herramienta para la administracin de bases de datos.0

VirtualBox, aplicacin de cdigo abierto para la virtualizacin x86.

VLC Media Player, reproductor multimedia de cdigo abierto.

32

sMovieDB, catalogador/gestor de pelculas.

SDL+DEV
Hoy traigo algo muy interesante para los que les gusta trabajar con graficas en cualquier lenguaje,
en esta entrada nos concentraremos exclusivamente en la utilizacin de la librera SDL (Simple
DirectMedia Layer), esta es una librera grafica que se traba tanto en lenguaje C como en C++,
por lo cual es muy util a la hora de hacer algunas maravillas.
Empezare dando a conocer ms sobre esta librera tan poderosa y simple de usar, ya que ms
adelante publicare algunos ejemplo que he realizado, y asi se interesen ms en trabajar con esta
sorprendente librera. SDL es una librera o biblioteca de desarrollo multiplataforma que fue
diseado para proporcionar acceso de bajo nivel a todos los dispositivos de nuestra computadora,
es decir, audio, teclado, ratn, joystick, y los grficos de hardware a travs del conocido OpenGL
o Direct3D. Los que utilizan esta librera son softwares de reproduccin de video, emuladores y
juegos populares.
SDL oficialmente est disponible para plataformas como Windows, Mac OS X, Lunix, iOS y
Android. Adems en la pgina oficial dice que se ofrece soporte para otras plataformas pero este
se encuentra exclusivamente en cdigo fuente. SDL como los softwares ms potentes est escrito
en lenguaje C, y funciona de forma nativa en nuestros PCs incluyendo por supuesto C++, adems
hay disponibles en la web enlaces para otros idiomas de programacin como C# y Python, por lo
que hace a esta librera mucho muy potente. SDL ya se encuentra en su versin 2.0 y se
distribuye bajo la licencia de zlib, esta licencia hace nos permite utilizar la librera de forma
totalmente libre en cualquier software.
Por otro lado SDL se le pueden incorporar componentes adicionales, los que complementan las
funcionalidades y capacidades de la biblioteca base.

SDL Mixer: Extiende las capacidades de SDL para la gestin y uso de sonido y msica en
aplicaciones y juegos. Es compatible con formatos de sonido comoWave, MP3 y OGG, y
formatos de msica como MOD, S3M, IT, y XM.
SDL Image: Extiende notablemente las capacidades para trabajar con diferentes formatos
de imagen. Los formatos compatibles son los
siguientes: BMP, JPEG,TIFF, PNG, PNM, PCX, XPM, LBM, GIF, y TGA,
SDL Net: Proporciona funciones y tipos de dato multiplataforma para programar
aplicaciones que trabajen con redes.
SDL RTF: Posibilita el abrir para leer en aplicaciones SDL archivos de texto usando el
formato Rich Text Format RTF.
SDL TTF: Permite usar tipografas TrueType en aplicaciones SDL.

33

Capas de abstraccin de SDL en distintas plataformas


Dentro de los ejemplos que les tengo preparados con esta librera, se encuentras un simulador de
control de sondas, y mostrar grficos de barra y circulares con datos obtenidos desde una base de
datos MySQL, as que atentos si quieres aprender algo nuevo. Cabe destacar que todo lo que les
enseare estar desarrollado en Windows Dev-cpp y en ubuntu con el compilador gcc que trae
por defecto, sin embargo el cdigo fuente funciona en ambas plataformas, dicho esto explicare
como agregar la librera SDL al IDE Dev-cpp (Dev-C++).
Dev-C++ es un IDE de desarrollo integrado para los lenguajes de programacin C u C++, en este
IDE oficialmente cuanta con su versin 4.9.9.2, esta versin solo es compatible en la versin de
Windows solo hasta con Windows 7, si tienes Windows 8 existe hasta la fecha la versin 5.4.2.
Simplificando esto, una vez instalado Dev-C++ ah que proseguir algunos pasos sencillos.
Descargar lo siguiente:
seccin Runtime Libraries: descargar el que corresponda a su sistema operativo. Este
contiene el DLL en el caso de Windows para su funcionamiento
seccin Development Libraries: Descargar el SDL para el desarrollo, para windows
descargar SDL-devel-1.2.15-mingw32.tar.gz
Una vez descargado los componentes necesarios, hay que agregarlo a nuestro IDE, por
consiguiente descomprimiremos SDL-devel-1.2.15-mingw32.tar.gz en mi caso, en la raz de
nuestro sistema operativo y le cambiaremos el nombre de la carpeta que nos deje a "SDL" por lo
que quedara la ruta C:\SDL. Enseguida descomprimir SDL-1.2.15-win32.zip que es el DLL para
windows, el cual pegaremos en la carpeta system32 que se encuentra en la ruta
C:\windows\system32.

DEV-C + SDL en Windows


Versin que funciona correctamente hasta Windows 7

34

Descargar DEV-C++ 4.9.9.2


Versin que funciona correctamente en Windows 8
Descargar DEV-C++ 5.4
Asegurarse de que SDL-devel-1.2.15-mingw32.tar.gz se descomprimi en la raz de nuestro
sistema operativo, y renombrar la carpeta a "SDL"

Una vez hecho esto abriremos el IDE Dev-C++, y las herramientas (tools), elegimos opciones de
compilador (compilator option), luego tiqueaos aadir estos comandos a la lnea de comandos
linker (add these commands to the linker command line) y agregamos estas lneas:

35

En esa misma ventana nos dirigimos a Directorios (directories) y en binarios agregamos la ruta de
nuestro SDL\bin donde aparece el examinar quedara de la siguiente manera C: \SDL\bin,
enseguida en libreras aadimos la ruta SDL\lib de esta forma C:\SDL\lib y por ltimo en
cabeceras C aadimos la ruta SDL\incluida de tal forma que quede as C:\SDL\include. Una vez
hecho estos pasos estamos listos para nuestro primer programa con SDL.

36

37

38

Realizar los mismos pasos para agregar las siguientes Direcciones

39

40

SDL en Ubuntu + gcc


Enseguida mostrare el proceso de compilacin y ejecucin del el ejemplo de prueba pero esta
vez en un sistema operativo Linux, donde se compilara con el compilador que este trae por
defecto gcc, para la edicin del cdigo lo hare en Geany que es un IDE para varios lenguajes de
programacin
Si desean instalar Geany deben de teclear apt-get install geany
Instalar SDL en distribuciones Linux sudo apt-get install libsdl1.2-dev libsdl1.2debian
Ahora les mostrare como compilar el Ejemplo de prueba que se presenta ms adelante.

Para compilar se agrega el comando -lSDL - lpthread a la linea de compilacion tradicional del
gcc.

Para ejecutar el archivo ya compilado se prodece a ejecutar. /nombrearchivo en este


caso./ejemploPrueba

41

Ejemplo de prueba:
#include <stdio.h>
#include <SDL/SDL.h>
void imprimir_rectangulo (SDL_Surface *screen, int x,int y)
{
SDL_Rect rect = {x, y, 50, 50};
Uint32 a = SDL_MapRGB(screen->format, 255, 200, 100);
SDL_FillRect(screen, &rect, a);
SDL_UpdateRect(screen, rect.x, rect.y, rect.w, rect.h);
}
int main(int argc, char *argv[])
{
SDL_Surface *screen;
SDL_Event event;
if (SDL_Init(SDL_INIT_VIDEO) == -1)
{
printf("Error: %s\n", SDL_GetError());
return 1;
}
screen = SDL_SetVideoMode(320, 240, 16, SDL_SWSURFACE);
if (screen == NULL)
{
printf("Error: %s\n", SDL_GetError());
return 1;
}
SDL_WM_SetCaption("Ejemplo bsico", NULL);
imprimir_rectangulo(screen, 20, 30);
while (SDL_WaitEvent(&event))
{
if (event.type == SDL_QUIT)
break;
}
SDL_Quit();
return 0;
}

42

Resultado del cdigo de prueba


En Windows

OPENGL
OpenGL es una interface de software para el hardware grfico, esta interface consiste de una
larga serie de comandos para manipulacin de objetos y operaciones sobre estos los cuales
permiten controlar la implementacin realizada en la forma de una mquina de estados finitos,
donde cada una de las variables que determinan el estado se aplican a partir de ese punto hasta
que se indique explcitamente el cambio, asi las variables de estado de OpenGL que vamos a
utilizar ms comnmente son:

Color (de dibujo y de borrado).


Matrices de Transformacin (GL_MODELVIEW, GL_PROYECTION).
Patrones (de lneas y de relleno).
Modo de dibujo de polgonos.
Buffers de dibujo.
Buffer de Stencil.
Buffer de profundidad (z-Buffer).
Buffer de acumulacin.

Funcionamiento de OpenGL:

43

Para poder trabajar con OpenGL, primero se debe crear un contexto de trabajo, este contexto
contiene el estado actual de maquina finita, as como las referencias a los diferentes buffers de
trabajo, estos buffers se pueden ver como zonas de memoria correspondiendo a la pantalla en las
cuales OpenGL va a dibujar, en general a parte del buffer de color (GL_COLOR_BUFFER) que
es el buffer en el cual se van a dibujar las primitivas, existen otro tipo de buffers ms
especializados.
La configuracin en memoria de estos buffers (cuantos bits representan un pixel, etc) depende de
la manera como fue creado el contexto OpenGL y de las limitaciones del hardware, por esto no se
puede acceder directamente sino solo a travs de las primitivas OpenGL.
OpenGL puede funcionar adicionalmente de dos maneras, de modo directo o indirecto:

Modo directo: las primitivas se van dibujando a medida que se van definiendo.
Instruccion -> Buffer de Color = Pantalla
Modo indirecto: las primitivas se guardan en una lista y solo se dibujan cuando el usuario
decida o la lista este llena, esto permite optimizar la fase de dibujo.
Instruccion-> Pila de instrucciones-> flush -> Buffer de Color = Pantalla

En este modo cuando se desea que OpenGL pinte lo que est en la lista se utiliza la instruccin
glFlush(): esta instruccion obliga a pintar y no espera a que el hardawre termine para continuar
con el programa, analogamente la glFinish() obliga a pintar pero espera a que el hw termine antes
de continuar con el programa.
En el modo indirecto, OpenGL permite definir dos buffers de colores (doublebuffer), asi un
buffer corresponde a lo que se ve en pantalla y otro al buffer donde se est pintando, de esta
manera una vez que se ha pintado todo lo deseado y se quiere que esto aparezca en pantalla se
intercambian los buffers, esta instruccion depende del sistema operativo para esto se utilizara la
instruccin de la librera portable glut: glutSwapBuffers() (esta ejecuta implcitamente glFlush o
glFinish), en este modo glFlush y glFinish obligan a pintar en el buffer de dibujo pero esto NO
sera visible hasta intercambiar buffers.

Primitivas de dibujo:
En OpenGL solo se pueden dibujar primitivas muy simples, tales como puntos lneas, cuadrados,
tringulos y polgonos, a partir de estas primitivas es posible construir primitivas ms complejas
como arcos y crculos aproximndolos por polgonos.
Toda primitiva de dibujo se construye con un par: glBegin(tipo_de_primitiva); glVertex2f(); ...
glEnd(); donde tipo_de_primitiva puede ser cualquiera de las siguientes:
GL_POINTS: Cada vrtice es un punto
GL_LINES: Cada par de vrtices sucesivos es una lnea
GL_LINE_STRIP: lneas conectadas.
GL_LINE_LOOP: lneas conectadas donde el ultimo y el primer vrtice indican una lnea
cerrando el polgono.

44

GL_POLYGON: polgono (relleno o no) donde los vrtices sucesivos componindolo se dan el
sentido contrario de las manecillas del reloj.
GL_QUADS: cuadrilteros separados, cada 4 vrtices hacen un quad.
GL_QUAD_STRIP: tira de cuadrados unidos, cada par de vrtices sucesivos forman un cuadrado
con el par anterior.
GL_TRIANGLES: Tringulos separados, cada 3 vrtices hacen un tringulo.
GL_TRIANGLE_STRIP: tira de tringulos unidos (similar quad_strip).
GL_TRIANGLE_FAN: Grupo de tringulos con un nico vrtice comn a todos.

Dentro del par glBegin, glEnd solo pueden ir instrucciones OpenGL para definir objetos tales
como vertices, y colores (existen otras ms complejas como normales y materiales) y no
transformaciones ni cambios de estado (diferentes a los especificados), adicionalmente dentro del
par pueden ir instrucciones de programacion del lenguaje tales que ciclos, condicionales,
llamados a funciones, etc. Siempre y cuando no usen alguna de las funciones OpenGL no
permitidas, i.e.:
glBegin(GL_POLYGON);
glColor3f(1.0, 0.0, 0.0); // rojo

45

for(int i=0; i<10; i++){


glVertex3f(1.0/i, i*i, 0.0);
}
glColor3f(0.0, 1.0, 0.0); // verde
glVertex3f(1.0, 0.0, 0.0);
glColor3f(0.0, 0.0, 1.0); // azul
glVertex3f(1.0, 1.0, 0.0);
glEnd();
muchas primitivas bsicas tiene sufijos indicando el tipo del valor o variable que se le pasan
como parmetro, as como el nmero de parmetros, as una instruccin como p.ej. glVertex
puede tener 2,3 o 4 parmetros, as como recibir tipos enteros, flotantes, etc. O un vector
conteniendo esos parmetros Entonces en los manuales se escribe como: glVertex[234][sifd][v]
quiere decir que se le pueden pasar 2,3 o 4 parmetros ms el tipo o un vector, como mnimo
debe tener el nmero de parmetros y el tipo i.e.: glVertex2f(1.0,0.0). o si se usa un vector v
Glfloat v[3]={1.0,0.5} entonces seria glVertex2fv(v); los tipos de datos tambin se pueden usar
para definir variables, estos son:
b entero 8 bits GLbyte
s entero 16 bits GLshort
i entero 32 bits Glint
f float 32 bits GLfloat
d flotante 64 bits GLdouble
ub entero sin signo 8 bits GLubyte
us entero sin signo 16 bits GLushort
ui entero sin signo 32 bits GLuint
Las primitivas ms basicas de dibujo son entonces:
glRect[sid][v]: dibuja un rectangulo, NO puede estar en bloque glBegin/glEnd
glColor3[f][v]: para cambiar el color actual de dibujo, puede estar en bloque glBegin/glEnd
glVertex[234][sifd][v]: vertice de un punto,linea o poligono, SOLO puede estar entre
glBegin/glEnd
Variables de estado que afectan las primitivas anteriores (NO puede estar en bloque
glBegin/glEnd):
glPointSize(size): size= flotante indicando el tamao de dibujo de un punto > 0.0, 1.0 por
defecto.
glLineWidth(size): size= flotante indicando el ancho de dibujo de una linea > 0.0, 1.0 por
defecto.
glLineStipple(factor,patron): factor = entero indicando un factor de escalamiento, patron= short
sin signo conteniendo el patron de bits par pintar la linea (punteado,etc..)..
glPolygonMode(cara,modo): cara corresponde al lado del poligono, si el que esta hacia el
usuario
(pantalla) (GL_FRONT) o hacia el otro lado (GL_BACK) o los dos
(GL_FRONT_AND_BACK), el modo puede ser: relleno (GL_FILL), solo los vertices
(GL_POINT), o solo el borde (GL_LINE).

46

Otras funciones y variables de estado:


glClearColor(r,g,b): r,g,b son flotantes y definen el color de borrado de la pantalla (fondo).
glClear(mask): mask = GL_COLOR_BUFFER_BIT borra el buffer de dibujo con el color de
fondo definido.
Transformaciones:
Las trasformaciones se realizan multiplicando por las matrices y se aplican en sentido inverso al
que se escriben, esto es si quiero rotar y luego trasladar un objeto en el cdigo, primero traslado,
luego roto y luego si pinto mi objeto (es tambin en sentido inverso al que se lee el cdigo),
OpenGL trabaja con dos matrices diferentes:
GL_MODELVIEW: es la matriz donde se trabajan con las transformaciones.
GL_PROJECTION: es donde se define la relacin mundo viewport.
Para cambiar de matriz a utilizar se usa la instruccin: glMatrixMode(modo): es uno de los dos
modos de matriz.
Adicionalmente, la matriz en uso se puede guardar y eliminar de una pila:
glPushMatrix(): coloca la matriz en la pila.
glPopMatrix(): quita la matriz de la pila.
La pila de la matriz de proyeccin tiene un lmite mximo de 2 en la mayora de las
implementaciones.
Para trabajar con la matriz directamente se tiene:
glLoadIdentity(): inicializa la matriz actual con una matriz identidad.
glMultMatrix(matriz): matriz = vector de 16 flotantes con el que multiplica la matriz actual.
glLoadMatrix(matriz): matriz = vector de 16 flotantes con el que reemplaza la matriz actual.
glGetFloatv(modo,m): modo = uno de los modos de matriz. matriz = vector de 16 flotantes en el
que se recupera la matriz actual de OpenGL.
Para no tener que generar sus propias matrices, se proveen instrucciones de transformacin:
glRotate[fd](a,x,y,z): rota un ngulo a alrededor del vector x,y,z
glTranslate[fd](x,y,z): traslada una cantidad x,y,z.
glScale[fd](sx,sy,sz): multiplica cada coordenada por el valor de escalamiento correspondiente.
Estructura de un programa OpenGL
Para la creacion de programas OpenGL se va a utilizar la librera GLUT, esta librera permite
olvidarse de los problemas especificos de cada plataforma, La estructura general de un programa
utilizando la librera GLUT es la siguiente (en C o C++ es las funciones de opengl son las
mismas):
#include<GL/gl.h>
#include<GL/glut.h>
voidinit(void)
{
glClearColor(0,0,0,0);//iniciarestadoglobal(colordeborrado
}

47

voidreshape(intw,inth)
{
glViewport(0,0,w,h);//coloqueelviewportaltamanodela
ventana
glMatrixMode(GL_PROJECTION);//modomatrizdeproyeccion
glLoadIdentity();//inicializelamatriz
glOrtho(0,w,0,h,1,1);//tranformaciondirectaapantalla
glScalef(1,1,1);//inviertaYparaquevayaparaabajo
glTranslatef(0,h,0);//corraelorigenalapartesuperior
izq.
glMatrixMode(GL_MODELVIEW);//modomatrizdetransformacion
glLoadIdentity();//inicializelamatriz
}
voiddisplay(void)//pinte....
{
glClear(GL_COLOR_BUFFER_BIT);//borrelapantalla
glBegin(GL_TRIANGLES);//pinte
glColor3f(0.0,0.0,1.0);
glVertex3f(0,1,0);
glVertex3f(0,0,0);
glVertex3f(0,1,0);
glEnd();
glutSwapBuffers();//cambiebuffers...
}
voidkeyboard(unsignedcharc,intx,inty)
{
switch(c){//aquiadicionarloscasosparalasdiferentes
teclas.
case27:exit(0);
break;
}
glutPostRedisplay();//pintesisecambiaronvariablesque
afectaneldibujo
}
voididle(void)
{
//modifiquevariables
glutPostRedisplay();//pinte
}
voidmain(intargc,char**argv)
{
glutInit(&argc,argv);//inicielalibreriaGLUT

48

glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE);//inicieelmodode
video
glutInitWindowSize(w,h);//inicietamanodelaventana
glutInitWindowPos(x,y);//inicieposiciondelaventana
glutCreateWindow("nombreventana");
init();//iniciarvariablesyestadoglobal
glutDisplayFunc(display);//instalelafunciondedisplay
glutReshapeFunc(reshape);//instalelafunciondetamao.
glutKeyboardFunc(keyboard);//instalelafunciondeteclado
glutIdleFunc(idle);//funciondeanimacion.
glutMainLoop();//cicloinfinito
Manejo de Buffers
Para utilizar los diferentes tipos de buffers de OpenGL estos se deben crear al crear el contexto
opengl, en el caso de la utilizacin de la librera glut, al llamar la funcin: glutInitDisplayMode
(buffers), buffers es una combinacin de valores indicando que buffers se deben crear i.e. para
crear un contexto con doble buffer rgba y z-buffer buffers seria = GLUT_RGBA |
GLUT_DOUBLE | GLUT_DEPTH, los valores para crear otro tipos de buffers son:
GLUT_STENCIL = buffer de stencil.
GLUT_ACCUM = buffer de acumulacion.
Todos los buffers deben ser activados o desactivados dependiendo de la utilizacin con el
comando
glEnable(param) o glDisable(param), donde param corresponde al tipo de test que se activa, i.e
param=
GL_STENCIL_TEST para el buffer de stencil, o param=GL_DEPTH_TEST para el buffer de
profundidad (activado por defecto).
Los buffers de stencil, acumulacion y profundidad funcionan aplicando una serie de operaciones
y funciones sobre los valores que se van a escribir en el buffer, asi para manejar la funcion del
buffer de profundidad se utiliza la funcion glDepthFunc(funcion), donde funcion indica cuando
pasa el test de profundidad (GL_EQUAL, GL_LESS, GL_LEQUAL (por defecto),
GL_NOTEQUAL, GL_GREATER, GL_GEQUAL). En el caso de la funcion de test, se define
glStencilFunc(funcion, mascara), donde funcion son las mismas que para la profundidad, y
mascara indica que bits del stencil se utilizan. Adicionalmente a la funcion de stencil, se utiliza la
operacion de stencil glStencilOp(fallo,zfallo,zpaso) que especifica cmo se modifica el buffer de
stencil dependiendo de si la funcion del buffer stencil y z fallaron o pasaron, pueden ser
GL_KEEP,GL_ZERO, GL_REPLACE, GL_INCR, GL_DECR, GL_INVERT.
Manejo de Animacion y Timers
Opengl no maneja animacion ni timers directamente ya que esto depende del sistema operativo,
OpenGL solo se preocupa de colocar poligonos en la pantalla, y solo seria cuestion de ordenarle
de manera ciclica el repintar la pantalla con paramentros nuevos, el problema se encuentra
cuando se desea que la animacion se no bloqueante, la libreria GLUT nos facilita el manejo de la
animacion de dos maners independientemente del Sistema operativo de manera no bloqueante:

49

1. Funcin de animacin Idle, GLUT nos permite manejar la animacion definiendo una
funcion de animacion con la funcion glutIdleFunc(funcname), donde funcname es el
nombre de la funcin que se va a llamar para realizar la animacion, esta funcion no recibe
ni retorna parametro alguno, esta funcion se debe encargar de calcular los parametros de
la animacion y luego llamar la funcion de dibujo, esta no se debe llamar directamente sino
con la funcion glutPostRedisplay() que quiere decir que solo se llama una vez se acabe
de calcular la funcion idle, esta funcion idle no se ejecuta de manera regular, solo se
ejecuta una vez se hallan procesado todos los eventos que recibe la aplicacion tales como
teclado, repintar, etc. Por lo tanto la velocidad de la animacin resultante puede no ser
constante.
2. Funciones de Timers, para evitar el problema de la velocidad de animacion irregular y
para tener mas control sobre el tiempo de ejecucion de la funcion de animacion, glut nos
permite definir timers de a loscuales le asignamos una funcion que se debe ejecutar cada
cierto tiempo definido por el timer, para definirestos timers se utiliza la funcion:
glutTimerFunc(tiempo,funciontimer,valor), donde tiempo es el tiempo en milisegundos
del timer, funciontimer es la funcion a llamar la cual no devuelve nada pero recibe un
parametro entero (valor), valor es el parametro que se le va a pasar a la funcion. Esta
funcion se ejecuta dentro del tiempo determinado y termina, si se desea que se vuelva a
llamar, al final de la funcion se debeinstalar de nuevo el timer. El valor sirve para
seleccionar diferentes acciones la proxima vez que se llame el timer, como estas funciones
no reciben parametros, de cualquier resultado debe ser devuelto por una variable global.
Compilacion de aplicaciones OpenGL en Windows
Para compilar un programa OpenGL suponiendo que se est en un sistema operativo MSWindows, con el compilador VisualC++, se debe recuperar la librera glut para windows (glut.h
glut32.lib y glut32.dll), los archivos .h y . lib se deben colocar en el directorio respectivo para
includes y librerias del VisualC, el archivo glut32.dll se debe colocar en el directorio system32 de
windows idealmente o en su defecto en el directorio donde va a quedar el ejecutable. En el
VisualC se debe crear un proyecto nuevo de tipo win32 o win32 consola (si se va a utilizar GLUT
NO! se debe crear proyecto de tipo MFC) En las opciones de compilacin del proyecto, en el
tabulador de encadenamiento, se debe adicionar las siguientes libreras en este orden especfico:
glut32.lib glu32.lib opengl32.lib.
Compilacin de aplicaciones OpenGL en Linux
Para compilar un programa OpenGL suponiendo que se esta en sistema operativo UNIX o Linux
con las libreras instaladas en lugares estndar se debe dar el siguiente comando suponiendo que
todo el programa est en un solo archivo:
Programa est en C:
gcconombre_ejecutablenombre_programa.clglutlGLUlGLlm
Programa esta en C++:
g++onombre_ejecutablenombre_programa.clglutlGLUlGLlm
Si el programa esta compuesto por varios modulos C o C++ se debe realizar un archivo llamado:
Makefile, este archivo debe ser de la manera siguiente:

50

CC = gcc
CXX = g++
INCDIR = -I./ -I/usr/local/include
# XLIBS = -lX11 -lXt -lXext -lXm -lXmu -lXi
GL_LIBS= -lglut -lGLU -lGL -lm
LIBDIR = -L/usr/X11/lib -L/usr/X11R6/lib -L/usr/local/lib
CFLAGS = -O
DOCDIR = doc
OBJECTS= modulo1.o modulo2.o
PROGS = nombreprograma
.SUFFIXES: .c .cc .cpp
.c:
$(CC) -o $@ $(CFLAGS) $(INCDIR) $< $(LIBDIR) $(GL_LIBS) $(XLIBS)
.cc:
$(CXX) -o $@ $(CFLAGS) $(INCDIR) $< $(LIBDIR) $(GL_LIBS) $(XLIBS)
.cpp:
$(CXX) -o $@ $(CFLAGS) $(INCDIR) $< $(LIBDIR) $(GL_LIBS) $(XLIBS)
all: $(OBJECTS) $(PROGS)
nombreprograma: modulo1.c modulo2.cpp
$(CC) -o $@ $(CFLAGS) $(INCDIR) $(OBJECTS) $(LIBDIR) $(GL_LIBS) $(XLIBS)
Ojo: Las identaciones en el archivo son tabulador no espacios en blanco!
Solo se debe cambiar nombre programa por el nombre del archivo que contiene la funcin main,
y modulo1, modulo2, etc por los nombres de los otros archivos conteniendo otras funciones del
programa, para compilar solo basta dar en la linea de comandos el comando:
Make
Para correr el programa ya sea que se haya compilado con la ayuda de make o directamente a
mano con
gcc/g++ solo basta dar el comando:
./nombredeprograma
Para ms informacin sobre el comando make dar el comando: manmakeo en caso que este
falle:
infomake
Para ms informacin sobre opciones gcc/g++ dar el comando: mangcco mang++

51

GRAPHICS
Funciones
void far arc(int x, int y, int comienzo_angulo, int final_angulo, int radio);
Esta funcin crear un arco circular. El arco tiene como centro el punto especificado por los
argumentos x e y, y es dibujado con el radio especificado: radio. El arco no est rellanado, pero es
dibujado usando el color actual. El arco comienza al ngulo especificado por el argumento
comienzo_angulo y es dibujado en la direccin contraria al de las agujas del reloj hasta llegar al
ngulo especificado por el argumento final_angulo. La funcin arc usa el este (extendindose
hacia la derecha del centro del arco en la direccin horizontal) como su punto de 0 grados. La
funcin setlinestyle puede usarse para establecer el grosor del arco. La funcin arc, sin embargo,
ignorar el argumento trama de la funcin setlinestyle.
void far bar(int izquierda, int superior, int derecha, int inferior);
Esta funcin dibujar una barra rectangular y rellenada de dos dimensiones. La esquina superior
izquierda de la barra rectangular est definida por el argumento izquierdo y superior. Estos
argumentos corresponden a los valores x e y de la esquina superior izquierda. Similarmente, los
argumentos derecha e inferior definen la esquina inferior derecha de la barra. La barra no tiene
borde, pero es rellenada con la trama de relleno actual y el color de relleno como es establecido
por la funcin setlinestyle.
void far bar3d(int izquierda, int superior,int derecha, int inferior, int profundidad, int
banderin_tapa);
Esta funcin crear una barra rectangular y rellenada de tres dimensiones. La esquina superior
izquierda de la barra rectangular ms frontal est definida por el argumento izquierdo y superior.
Estos argumentos corresponden a los valores x e y de la esquina superior izquierda del rectngulo
ms frontal. Similarmente, los argumentos derecha e inferior definen la esquina inferior derecha
del rectngulo ms frontal. La barra tiene borde, en todas las tres dimensiones, rellenada con el
color y estilo de lnea actuales. El rectngulo ms frontal es rellenado usando la trama de relleno
actual y el color de relleno como es establecidopor la funcin setlinestyle. El argumento
banderin_tapa es usado para especificar si es o no es posible apilar varias barras encima de cada
una. Si banderin_tapa tiene un valor distinto a cero, entonces la barra est "tapada". Si
banderin_tapa tiene un valor de cero, entonces la barra no est "tapada", permitiendo otras barras
ser apiladas encima de sta.
void far circle(int x, int y, int radio);
Esta funcin se usas para dibujar un crculo. Los argumentos x e y definen el centro del crculo,
mientras que el argumento radio define el radio del crculo. El crculo no es rellenado pero es
dibujado usando el color actual. El grosor de la circunferencia puede ser establecido por la
funcin setlinestyle; sin embargo, el estilo de la lnea es ignorado por la funcin circle. La
proporcin anchura-altura para el modo actual es considerado cuando se calcula el crculo. Por
esta razn, alterando los valores de defecto x e y de los factores de anchura-altura afectar el
crculo (ya no seguir siendo redondo).

52

void far cleardevice(void);


Esta funcin es usada para despejar una pantalla grfica. La funcin cleardevice usa el color de
fondo actual, como es establecido por la funcin setbkcolor, para rellenar la pantalla. La posicin
del cursor grfico es la esquina superior izquierda de la pantalla - posicin (0,0) - despus de que
la pantalla haya sido borrado.
void far clearviewport(void);
Esta funcin es usada para rellenar la pantalla actual del usuario con el color de fondo actual. El
color de fondo puede ser establecido con la funcin setbkcolor. La posicin del cursor grfico es
la esquina superior izquierda de la pantalla actual del usuario. Esta posicin es (0,0) segn la
pantalla actual del usuario.
void far closegraph(void);
Esta funcin es usada para cerrar el sistema grfico como es iniciada por la funcin initgraph. La
funcin closegraph libera toda la memoria usada por el sistema grfico y luego restaura el modo
de vdeo al modo de texto que estaba en uso anteriormente a la llamada a la funcin initgraph.
void far detectgraph(int far *driver, int far *modo);
Esta funcin es usada para detectar el adaptador grfico y el modo ptimo para usar con el
sistema en uso. Si la funcin detectgraph no puede detectar ningn dispositivo grfico, el
argumento *driver es asignado grNotDetected (-2). Una llamada a graphresult resultar en un
valor de retorno de -2, o grNotDetected.
Existen varios valores que indican los diferentes dispositivos grficos que pueden ser usados por
el argumento *driver. Un valor de 0, o DETECT, inicia la funcionalidad de autodeteccin, el cual
determina el driver ptimo a usar.
Para cada dispositivo existen varios valores que indican los diferentes modos grficos que pueden
ser usados por el argumento *modo. Sin embargo, si el argumento *driver es asignado el valor de
0, o DETECT, el argumento *modo es automticamente establecido al modo de resolucin ms
alto para el driver.
void far drawpoly(int numpuntos, int far *puntos);
Esta funcin es usada para crear un polgono con un nmero especificado de puntos. El
argumento numpuntos es usado para definir el nmero de puntos en el polgono. Para la funcin
drawpoly, el nmero de puntos debe ser el nmero actual de puntos ms 1 para poder crear un
polgono cerrado. En otras palabras, el primer punto debe ser igual al ltimo punto. El argumento
*puntos apunta a un array de nmeros de longitud numpuntos multiplicado por 2. Los dos
primeros miembros del array identifica las coordenadas x e y del primer punto, respectivamente,
mientras que los dos siguientes especifican el siguiente punto, y as sucesivamente. La funcin
drawpoly dibuja el permetro del polgono con el estilo de lnea y color actuales, pero no rellena
el polgono.

53

void far ellipse(int x, int y, int comienzo_angulo,int final_angulo, int x_radio, int y_radio);
Esta funcin es usada para dibujar un arco elptico en el color actual. El arco elptico est
centrado en el punto especificado por los argumentos x e y. Ya que el arco es eilptco el
argumento x_radio especifica el radio horizontal y el argumento y_radio especifica el radio
vertical. El arco elptico comienza con el ngulo especificado por el argumento comienzo_angulo
y se extiende en un sentido contrario a las agujas del reloj al ngulo especificado por el
argumento final_angulo. La funcin ellipse considera este - el eje horizontal a la derecha del
centro del elipse - ser 0 grados. El arco elptico es dibujado con el grosor de lnea actual como es
establecido por la funcin setlinestyle. Sin embargo, el estilo de lnea es ignorado por la funcin
ellipse.
void far fillellipse(int x, int y, int x_radio, int y_radio);
Esta funcin es usada para dibujar y rellenar una elipse. El centro de la elipse es especificado por
los argumentos x e y. El argumento x_radio especifica el radio horizontal y el argumento y_radio
especifica el radio vertical de la elipse. La elipse es dibujado con el permetro en el color actual y
rellenada con el color de relleno y la trama de relleno actuales.
void far fillpoly(int numpuntos, int far *puntos);
Esta funcin es usada para crear un polgono rellenado. El argumento numpuntos es usado para
definir el nmero de puntos en el polgono. Al contrario que la funcin drawpoly, la funcin
automticamente cierra el polgono. El argumento *puntos apunta a un array de nmeros de
longitud numpuntos multiplicado por 2. Los dos primeros miembros del array identifica las
coordenadas x e y del primer punto, respectivamente, mientras que los dos siguientes especifican
el siguiente punto, y as sucesivamente. La funcin fillpoly dibuja el permetro del polgono con
el estilo de lnea y color actuales. Luego, el polgono es rellenado con la trama de relleno y color
de relleno actuales.
int far getbkcolor(void);
Esta funcin es usada para obtener el valor del color de fondo actual. El color de fondo, por
defecto, es el color 0. Sin embargo, este valor puede cambiar con una llamada a la funcin
setbkcolor.
Existen varios valores para ciertos colores de fondo.
La funcin getbkcolor retorna el valor del color de fondo actual.
Constante

Valor

Significado

BLACK

Negro

BLUE

Azul

GREEN

Verde

CYAN

Can

RED

Rojo

54

MAGENTA

Magenta

BROWN

Marrn

LIGHTGRAY

Gris Claro

DARKGRAY

Gris Oscuro

LIGHTBLUE

Azul Claro

LIGHTGREEN

10

Verde Claro

LIGHTCYAN

11

Can Claro

LIGHTRED

12

Rojo Claro

LIGHTMAGENTA 13

Magenta Claro

YELLOW

14

Amarillo

WHITE

15

Blanco

int far getcolor(void);


Esta funcin obtiene el valor del color actual. El color actual es el color usado para dibujar lneas,
arcos, etc... Este color no es el mismo que el color de relleno. El valor del color obtenido es
interpretado segn el modo que est en uso.
Existen varios valores para ciertos colores de fondo.
Valor de retorno:
La funcin getcolor retorna el valor del color actual.
int far getmaxx(void);
Esta funcin es usada para obtener la coordenada mxima de la pantalla en la direccin
horizontal. Este valor suele ser la resolucin horizontal mxima menos 1.
Valor de retorno:
La funcin getmaxx retorna la coordenada mxima de la pantalla en la direccin horizontal.
int far getmaxy(void);
Esta funcin es usada para obtener la coordenada mxima de la pantalla en la direccin vertical.
Este valor suele ser la resolucin vertical mxima menos 1.
Valor de retorno:
La funcin getmaxy retorna la coordenada mxima de la pantalla en la direccin vertical.
unsigned far getpixel(int x, int y);

55

Esta funcin es usada para obtener el valor del color del pxel especificado por los argumentos x
e y. Estos argumentos especifican las coordenadas de la pantalla del pxel a ser evaluado. Cuando
se evala el valor del color retornado, el modo grfico en uso debe ser considerado.
int far getx(void);
Esta funcin es usada para obtener la posicin, en la direccin horizontal, del cursor grfico. El
valor retornado especifica el lugar del pxel horizontal del cursor grfico (la coordenada x),
relativo a la pantalla del usuario actual.
Valor de retorno:
La funcin getx retorna la coordenada x del cursor grfico.
int far gety(void);
Esta funcin es usada para obtener la posicin, en la direccin vertical, del cursor grfico. El
valor retornado especifica el lugar del pxel vertical del cursor grfico (la coordenada y), relativo
a la pantalla del usuario actual.
Valor de retorno:
La funcin gety retorna la coordenada y del cursor grfico.
void far initgraph(int far *driver, int far *modo, int far *path);
Esta funcin es usada para cargar o validar un dispositivo grfico y cambiar el sistema de vdeo a
modo grfico. La funcin initgraph debe ser llamada antes de cualesquier funciones que generan
una salida grfica sean usadas.
Existen varios valores a ser usados para el argumento *driver. Si *driver es asignado a DETECT,
0, la funcin detectgraph es llamada, y un dispositivo y modo grfico apropiados son
seleccionados. Asignando a *driver cualquier otro valor predefinido inicia la carga del dispositivo
grfico correspondiente.
Existen varios valores a ser usados para el argumento *modo. Estos valores deberan
corresponder al dispositivo especificado en el argumento *driver.
El argumento *path especificad el directorio donde los dispositivos grficos estn localizados. La
funcin initgraph buscar el dispositivo primeramente en este directorio. Si no es encontrado, la
funcin buscar en el directorio de inicio. Cuando el argumento *path es NULL, solamente el
directorio de inicio es buscado.
Otra forma para evitar cargando el dispositivo desde el disco cada vez que el programa es
ejecutado es ligarlo o enlazarlo al dispositivo apropiado en un programa ejecutable.
Valor de retorno:
La funcin initgraph no retorna ningn valor. Sin embargo, cuando la funcin initgraph es
llamada, el cdigo de error interno es activado. Si la funcin initgraph termina con xito, el
cdigo es asignado un 0. Si no, el cdigo es asignado as:

56

-2

grNotDetected

La tarjeta grfica no se encontr

-3

grFileNotFound

El fichero del dispositivo no se encontr

-4

grInvalidDriver

El fichero del dispositivo es invlido

-5

grNoLoadMem

No hay suficiente memoria para cargar el dispositivo

void far line(int x1, int y1, int x2, int y2);
Esta funcin es usada para conectar dos puntos con una lnea recta. El primer punto es
especificado por los argumentos x1 e y1. El segundo punto es especificado por los argumentos x2
e y2. La lnea se dibuja usando el estilo de lnea actual, el grosor, y el color actual. La posicin
del cursor grfico no es afectada por la funcin line.
void far linerel(int dx, int dy);
Esta funcin es usada para dibujar una lnea recta a una distancia y direccin predeterminadas
desde la posicin actual del cursor grfico. El argumento dx especfica el nmero relativo de
pxels para atravesar en la direccin horizontal. El argumento dy especfica el nmero relativo de
pxels para atravesar en la direccin vertical. Estos argumentos pueden ser tanto valores positivos
como negativos. La lnea se dibuja usando el estilo de lnea actual, el grosor, y el color actual
desde la posicin actual del cursor grfico a travs de la distancia relativa especificada. Cuando la
lnea est terminada, la posicin del cursor grfico es actualizada al ltimo punto de la lnea.
void far lineto(int x, int y);
Esta funcin es usada para dibujar una lnea recta desde la posicin actual del cursor grfico hasta
el punto especificado por los argumentos x e y. La lnea se dibuja usando el estilo de lnea actual,
el grosor, y el color actual. Despus de que la lnea recta haya sido dibujado, la posicin del
cursor grfico es actualizado a la posicin especificado por los argumentos x e y (el punto final
de la lnea).
void far moveto(int x, int y);
Esta funcin es usada para colocar el cursor grfico al punto especificado por los argumentos x e
y. Ya que el cursor es movido desde su posicin anterior al punto especificado por los argumentos
x e y, no hay dibujo alguno.
Esta funcin es usada para mostrar una cadena de caracteres. El argumento *cadena_texto define
la cadena de texto a ser mostrado. La cadena es mostrado donde est el cursor grfico
actualmente usando el color actual y fuente, direccin, valores, y justificaciones de texto. La
posicin del cursor permanece sin ser cambiado al menos que la justificacin horizontal actual es
LEFT_TEXT y la orientacin del texto es HORIZ_DIR. Cuando esto sea el caso, la posicin del
cursor es colocada horizontalmente a la anchura del pxel de la cadena de texto. Adems, cuando
se use la fuente por defecto, cualquier texto que se extiende a fuera del rea grfica actual es
truncado.
Aunque la funcin outtext est diseada para texto sin formato, texto con formato puede ser
mostrada a travs del uso de un bfer de caracteres y la funcin sprintf.

57

void far outtextxy(int x, int y, char far *cadena_texto);


Esta funcin es usada para mostar una cadena de caracteres. El argumento *cadena_texto define
la cadena de texto a ser mostrado. La cadena es mostrada en la posicin descrita por los
argumentos x e y usando el color actual y fuente, direccin, valores, y justificaciones de texto.
Cuando se use la fuente por defecto, cualquier texto que se extiende fuera del rea grfica actual
es truncado.
Aunque la funcin outtextxy est diseada para texto sin formato, texto con formato puede ser
mostrada a travs del uso de un bfer de caracteres y la funcin sprintf.
void far putpixel(int x, int y, int color);
Esta funcin es usada para asignar el valor del color a un pxel en particular. La posicin del pxel
en cuestin est especificado por los argumentos x e y. El argumento color especfico el valor del
color del pxel.
void far rectangle(int izquierda, int superior, int derecha, int inferior);
Esta funcin dibujar un rectngulo sin rellenar su interior usando el color actual. La esquina
superior izquierda del rectngulo est definida por el argumento izquierdo y superior. Estos
argumentos corresponden a los valores x e y de la esquina superior izquierda. Similarmente, los
argumentos derecha e inferior definen la esquina inferior derecha del rectngulo. El permetro del
rectngulo es dibujado usando el estilo y grosor de lnea actuales.
void far setbkcolor(int color);
Esta funcin es usada para asignar el color de fondo al valor del color de fondo especificado por
el argumento color.
void far setfillpattern(char far *trama, int color);
Esta funcin es usada para seleccionar una trama de relleno definido por el usuario. El argumento
*trama apunta a una serie de ocho bytes que representa una trama de relleno de bits de 8 x 8.
Cada byte representa una fila de ocho bits, donde cada bit est encendido o no (1 0). Un bit de 0
indica que el pxel correspondiente ser asignado el color de relleno actual. Un bit de 0 indica que
el pxel correspondiente no ser alterado. El argumento color especfica el color de relleno que
ser usado para la trama.
void far setfillstyle(int trama, int color);
Esta funcin es usada para seleccionar una trama predefinida y un color de relleno. El argumento
trama especifica la trama predefinida, mientras que el argumento color especifica el color de
relleno.
Existen trece valores ya definidos para tramas. Sin embargo, la trama USER_FILL (valor 12) no
debera usarse para asignar unla trama definida por el usuario. En su lugar, se debera usar la
funcin setfillpattern.
void far setlinestyle(int estilo, unsigned trama, int grosor);

58

Esta funcin es usada para definir las caractersticas de lneas para lneas rectas.
El argumento estilo especifica la trama de lnea predefinida para su uso. El argumento trama es
una trama de 16 bits que describe el estilo de lnea cuando el argumento estilo es
USERBIT_LINE, 4. Un bit 1 en esta trama indica que el pxel correspondiente ser asignado el
color actual. Un bit 0 indica que el pxel correspondiente no ser alterado. El argumento grosor
define el grosor de la lnea.
Estilos de Lneas
Constante

Valor

Significado

SOLID_LINE

Lnea continua

DOTTED_LINE

Lnea hecha con puntos

CENTER_LINE

Lnea centrada

DASHED_LINE

Lnea discontinua

USERBIT_LINE

Lnea definida por el usuario

NORM_THICK

Grosor es de 1 pxel

THICK_WIDTH

Grosor es de 3 pxels

Grosores para Lneas

void far settextstyle(int fuente, int orientacion, int tam_caracter);


Esta funcin es usada para especificar las caractersticas para la salida de texto con fuente. El
argumento fuente especifica la fuente registrada a usar. La fuente ha de estar registrada para
resultados predecibles; es decir, usa registerbgifont antes de usar esta funcin. El argumento
orientacion especifica la orientacin en que el texto ha de ser mostrado. La orientacin por
defecto es HORIZ_DIR. El argumento tam_caracter define el factor por el cual la fuente actual
ser multiplicada. Un valor distinto a 0 para el argumento tam_caracter puede ser usado con
fuentes escalables o de bitmap. Sin embargo, un valor distinto a 0 para el argumento
tam_caracter, el cual selecciona el tamao del carcter definido por el usuario usando la funcin
setusercharsize, solamente funciona con fuentes escalables. El argumento tam_caracter puede
agrandar el tamao de la fuente hasta 10 veces su tamao normal.
Fuentes para Texto
Constante

Valor

Significado

DEFAULT_FONT

Fuente bitmap de 8x8

TRIPLEX_FONT

Fuente escalable de tipo triple

SMALL_FONT

Fuente escalable pequea

SANS_SERIF_FONT

Fuente escalable de tipo sans serif

59

GOTHIC_FONT

Fuente escalable de tipo gtico

SCRIPT_FONT

Fuente escalable de tipo manuscrito

SIMPLEX_FONT

Fuente escalable de tipo manuscrito simple

TRIPLEX_SCR_FONT

Fuente escalable de tipo manuscrito triple

COMPLEX_FONT

Fuente escalable de tipo complejo

EUROPEAN_FONT

Fuente escalable de tipo europeo

BOLD_FONT

10

Fuente escalable en negrita

Orientaciones para Texto


Constante

Valor

Significado

HORIZ_DIR

Texto horizontal

VERT_DIR

Texto vertical

int far textheight(char far *texto);


Esta funcin es usada para determinar la altura, en pxels, de la cadena de texto especificada por
el argumento *texto. La altura del texto se determina usando la fuente actual y el tamao del
carcter.
int far textwidth(char far *texto);
Esta funcin es usada para determinar la anchura, en pxels, de la cadena de texto especificada
por el argumento *texto. La anchura del texto se determina usando la fuente actual y el tamao
del carcter.
Valor de retorno:
La funcin textwidth retorna la anchura, en pxels, del texto especificado por el argumento.