Anuncios Google

Creacion de ventanas

Tutoriales de Programacionmx

Bienvenidos, en este primer tutorial explicaré como crear una ventana usando el lenguaje C++ en conjunto con las librerias SDL. Si quieres adentrarte en el mundo de la programación con librerias para crear objetos en 2D, te invito a que leas este tutorial.

Se parte del hecho de que se tiene un conocimiento mínimo de el lenguaje C++, se dispone de un editor, un compilador y las librerías necesarias instaladas.

Sin mas comencemos....

Este es el código de nuestra primera aplicación SDL:

#include <iostream>
#include <SDL/SDL.h>
 
SDL_Surface *screen = NULL;
 
int main(int argc, char* args[]) {
	SDL_Init(SDL_INIT_EVERYTHING);
 
	screen = SDL_SetVideoMode(480, 272, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
 
	SDL_WM_SetCaption("Creacion de una ventana", NULL);
 
	SDL_Delay(5000);
 
	SDL_Flip(screen);
 
	return 0;
}

 


#include

#include <iostream>
#include <SDL/SDL.h>

Si has estudiado algo de C/C++ enseguida sabras de que se trata.

Los #include  indican qué librerías queremos usar así como la ubicación de estas, los valores debes ajustarlos de manera que apunten a la ubicación correcta, el ejemplo que he puesto sería para llamar a las librerias bajo un sistema GNU/Linux.


SDL_Surface

//Superficies
SDL_Surface *screen = NULL;

Para SDL una superficie es un es un objeto que se puede pintar en pantalla y sobre el cual se pueden pintar otros objetos, es por ello que para poder hacer uso nuestra pantalla necesitamos declarar una superficie de manera que SDL sepa que se puede pintar ahí.

Como se trata de un puntero, lo apuntamos a NULL de manera que prevengamos errores de memoria inesperados.


main

//Funcion main
main (int argc, char *args[]) {

Ahora pasamos a nuestra función main, quizá notes algo raro en ella, argc y args son formas de interactuar con la línea de comandos, mediante ellas se pasan argumentos, ahora mismo no haremos uso de ellas.

argc define el número de argumentos y argv los argumentos que se pueden pasar.


SDL_Init

//Iniciar SDL
SDL_Init(SDL_INIT_EVERYTHING);

Con esta función podemos iniciar SDL, la sintaxis es sencilla:SDL_Init(Uint32 flags);

Entre las flags disponibles tenemos:

  • SDL_INIT_TIMER: Subsistema para manejar tiempo.
  • SDL_INIT_AUDIO: Subsistema para manejar audio.
  • SDL_INIT_VIDEO: Subsistema para manejar vídeo.
  • SDL_INIT_CDROM: Subsistema para manejar la bandeja de CD/DVD.
  • SDL_INIT_JOYSTICK: Subsistema para manejar dispositivos de entrada.
  • SDL_INIT_EVERYTHING: Inicia todo lo anterior.
  • SDL_INIT_NOPARACHUTE: Hace que SDL no atrape señales fatales.
  • SDL_INIT_EVENTTHREAD: Corre el manejador de eventos en un hilo separado.

Dependiendo de lo que quieras hacer necesitarás usar unas u otras, escoge con cuidado ;-)


screen

//Nuestra pantalla
screen = SDL_SetVideoMode(480, 272, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);

¿Recuerdas que antes habiamos definido una superficie llamada "screen" y que la habíamos apuntado a "NULL"? Bien, es hora de darle su verdadero valor, la sintaxis es muy sencilla: SDL_SetVideoMode(int ancho, int alto, int bpp, Uint32 Flags)

Entre las flags disponibles tenemos:

  • SDL_SWSURFACE: Crea la superficie en la memoria del sistema (RAM).
  • SDL_HWSURFACE: Crea la superficie en la memoria de video (Tarjeta de video).
  • SDL_ASYNCBLIT: Habilita el uso del volcado asíncrono a la superficie de visualización. Esto provocará usualmente la ralentización del volcado en máquinas de una única CPU, pero puede aumentar la velocidad en sistemas SMP.
  • SDL_ANYFORMAT: Normalmente, si una superficie de video de la profundidad requerida (bpp) no está disponible, SDL emulará una con una superficie en sombras (shadow surface). Pasando SDL_ANYFORMAT se evita esto y causa que SDL use la superficie de vídeo, independiente de la profundidad.
  • SDL_HWPALETTE: Permite el acceso exclusivo a la paleta. Sin este flag no siempre podrás obtener colores utilizando las funciones SDL_SetColors() y SDL_SetPalette().
  • SDL_DOUBLEBUF: Habilita la utilización de búfer doble. Una llamada a SDL_Flip() intercambiará los búferes y actualizará la pantalla. Si la utilización de búfer doble no se encuentra habilitada, entonces SDL_Flip() simplemente realizará un SDL_UpdateRect() en toda la pantalla.
  • SDL_FULLSCREEN: SDL intentará usar el modo a pantalla completa. Esto no siempre es posible.
  • SDL_OPENGL: Crea un contexto de renderizado OpenGL. Se deben haber establecido previamente los atributos OpenGL con SDL_GL_SetAttribute().
  • SDL_OPENGLBLIT: Como el anterior pero permite operaciones de volcado normales.
  • SDL_RESIZABLE: Crea una ventana de tamaño modificable. Si la ventana cambia de tamaño se generará el evento.
  • SDL_VIDEORESIZE: y se puede llamar nuevamente a la función SDL_SetVideMode(), para cambiar al nuevo tamaño.
  • SDL_NOFRAME: Si es posible, SDL crea un ventana sin barra de título u otras decoraciones. El modo FullScreen activa automáticamente este flag.

Igual que con SDL_Init, dependiendo de lo que busques deberás usar unas flags u otras.


...

El resto del programa es fácil de explicar, y no presenta mayores complicaciones, por lo que lo comentaré en un solo bloque.

SDL_WM_SetCaption("Creacion de una ventana", NULL);

Esto lo que hace es ponerle nombre a nuestra ventana, el primer parámetro es el nombre de la ventana y el segundo el nombre de la ventana iconizada.

SDL_Delay(5000);

Esto lo que hace es decirle a SDL que "duerma" una determinada cantidad de tiempo, si no lo pusiéramos, a falta de un bucle infinito, no lograríamos ver nada en nuestra pantalla.

SDL_Flip(screen);

Simplemente "vuelca" los buffers, de manera que podamos ver lo que hemos estado haciendo en pantalla.


Ahora simplemente compila el programa y lanzalo, deberás poder ver una ventana, con el nombre que le has puesto, sin ningún contenido, pero al fin y al cabo es el primer paso.

4.375
Tu voto: Ninguno Votos totales: 4.4 (48 votos)

Anuncios Google

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

No he aprendido C++ por

No he aprendido C++ por falta de tutos!! Gracias, espero más tutos!!

Imagen de the dragon lives

Todo se andara

La verdad es que es un campo que queremos ir completando poco a poco, pero actualmente xXZeroXx es el único editor con conocimientos y cualidades para seguir completando esos tutoriales. Desafortunadamente también es de los pocos que pueden probar aplicaciones para Linux, y tutoriales de Linux, por tanto se irán creando a medida que el pueda.

Son bien acogidos posibles tutriales de cualquier lenguaje de programación que quieran aportar los usuarios, saludos.

Pero mas bien se debería

Pero mas bien se debería llamar "Creación de ventana", en singular, porque SDL solo soporta una ventana...

Imagen de Churristian8

Pero por poder

Pero por poder puedes hacer mas de una ventana aunque sea en varios proyectos.

No se pone el acento por la url.

Saludos

Imagen de xx.zodiark.xx

Ups

no se me ocurrió lo de la url.

saludos

Imagen de xx.zodiark.xx

y de paso

ponen el acento.

 

Buen tuto saludos.

Imagen de burnxez

No se me pasó

Simplemente no lo puse, o más bien, no debería ponerlo porque se carga la URL, en cuanto al título, yo no le veo mayor problema, se entiende que el tuto será para aprender a crear ventanas, no para que corran varias ventanas a la vez...

Saludos.

Imagen de sarutoby

Oye, que yoya estoy empoyanmelo, pero..

pero tu a lo tuyo, cuando quieras haces otro...xD   siempre y cuando sean de C++ y no de C... ... que a mi el C...  ...digamos que prefiero C++


I like:

¿Algún motivo en concreto

¿Algún motivo en concreto para que no te guste C? Todo el código que ha puesto en este tutorial es válido tanto en C como en C++, salvo el include de "iostream", que no ha usado para nada y que podría quitar de ahí sin hacer daño a nadie.

 

Por cierto, SDL está en C.

Imagen de sarutoby

Algun motivo

pos muy simple, por que C++ es mejor que C, bueno, esa era la finalidad de la creacion de C++, mejorar el C, y el resultado fué C++

Esa es la razon, pos por que C++ es mejor, no cres?


I like:

Imagen de burnxez

Jamás

Ningún lenguaje es mejor que otro, cada uno tiene sus dotes y sus errores pero ninguno es mas malo que otro...

C++ es "C" con "++" es decir, "mejorado" hasta cierto punto, orientado a objetos y demás, pero C++ no nos brinda un nivel bajo de programación cosa que C si hace, ale, enseñamen un kernel que haya sido programado enteramente en C++, simple, no existe pues C++ no da el ancho para llamadas a funciones de bajo nivel.

Linux esta hecho en C, GNOME esta hecho en C, gran parte de Mac esta hecho en C orientado a objetos ( que no es C++)

Jamás desprecies un lenguaje, ninguno es mejor que otro, cada uno es bueno en su area de aplicación.

Saludos.

Imagen de the dragon lives

Segun el partido que le saques

Si nos guiamos por tus comentarios de que C++ es mejor que C porque se creo para mejorar C, yo puedo decirte que D es mejor que C++, porque el lenguaje de programación en D se creo para simplificar las tareas a los programadores, con la peculiaridad de que si sabes C puedes programar con C/D en un compilador de D (ademas de ser influido por lenguajes como java, C# y Eiffel.

La programación en D a sido un gran avance para los que han sabido aprovechar dicho lenguaje (que porcierto a sido creado por el programador principal de un compilador nativo de C++, Zortech C++ (más tarde Symantec C++, ahora Digital Mars C++). Su ultima obra, esta que te digo, programación en D y su compilador, con sus propias librerías estándar.

Ahora llego hasta donde quería llegar .... que lenguaje es mejor para un programador que a diseñado y aprendido desde sus comienzos en Python, Pascal y JavaScript. ¿C++ o python? a mi juicio este programador le sacara mas partido a Python que a C++,pero si eres capaz de presentarme a algún programador que nunca allá visto C++ que sea capaz de sacarle mas partido a C++ que a Python que es el lenguaje que domina ....

Imagen de sarutoby

Si tu teoria de lo de Python, es cierta

entonces un programador le poderia sacar un enorme partido a lenguage GO, poderian hacerse cosas realmente potentes, pero solo se aprobecharian a una mitad, no cres?

Lenguage GO es formado a partir de Python y C, si dices que a Python se le saca probecho y a C/C++ no, entonces a GO, sus aplicaciones solo aprobecharian la mitad del potencial del lenguage en que están programadas, no?

Al igual que...   ...(no se como se llama) ha dicho, no hay un lenguagemejor queotro, pero como el ha dicho, C++ es ÇC, pero mejorado, que es lo que he dicho yo, y yo creo que si un progamador domina C++, puede llegar a dominar muchos lenguages, ya que muchos lenguages, tienen parecencias a C++ y en gran parte a C. Yo no se Python, peor seguro que tambien comparte caracteristicas, variables y funciones con C++, asin que creo que C++ es un lenguage muy util con el que se pueden hacer miles de cosas y por tiempo que pase, creo que C++ siempre será un lenguage recomendado para aprender.


I like:

Pues por ejemplo a mi me

Pues por ejemplo a mi me gusta más C que C++, y te puedo dar motivos de verdad, no un simple "es que se creó C++ para mejorar C". Por ejemplo, yo no utilizaría para nada las clases, o lo de sobrecargar operadores que C++ permite. Y dado que no voy a usar sus mejoras, pues prefiero quedarme con C, que es más simple, y el compilador podrá hacer mejor su trabajo si ignora todo lo que no voy a usar.

 

Los lenguajes interpretados como python no se pueden comparar a los compilados como C/C++. Cada uno tiene su función. La de los compilados es la de centrarse en velocidad, la de los interpretados la de centrarse en que sea compatible con todas las plataformas posibles y abstraer el hardware todo lo posible. Java, por ejemplo, está entre medias. Se compila, pero no para un procesador en específico, sino para un procesador imaginario que luego se interpreta en la máquina virtual. Es más rapido que interpretar todo el texto, pero sigue siendo más lento que algo compilado directamente.

 

Por cierto, lo de que C++ es de más alto nivel es relativo, puedes hacer todo lo que hace C y además usar las mejoras que incluye C++, pero eso no quiere decir que las cosas de bajo nivel desaparezcan. De hecho, puedes incluir código en ensamblador en C++, que es lo de más bajo nivel que se puede hacer en C.

Imagen de carlosgs

O_o

No sabes qué bien me viene esto, para saber un poco qué forma darles a las funciones de MultiTasKing :-P

Aunque la versión actual de MultiTasKing ya tiene las funciones aquí mencionadas (o funciones similares), me interesan especialmente las funciones de crear botones, cuadros de texto... etc

No sé si esto último es posible en SDL

Muchas gracias por este tutorial :-P

Saludos!

 

Imagen de burnxez

Objetos

Pues SDL no maneja a por ejemplo, un boton como un "objeto", sino que es una imagen, igual a como se maneja en Lua, pones una imagen, defines el rango de interacción con el mouse y asocias una acción cuando el mouse de click sobre el rango definido.

Si buscas algo para creación de ventanas "reales" recomendaría wxWidgets, algo mas sencillo wxPython, pero creo que no existiria la posibilidad de correrlo en PSP.

Me alegra que te sea de utilidad.

Saludos.

Imagen de carlosgs

ok

es lo que imaginaba ;-)

Pues lo de este tutorial es similar a lo que se puede hacer en multitasking :-P

buscaré algun tuto de creacion de botones de sistema y eso

 

gracias de nuevo

salu2

Imagen de sarutoby

Me has dado

la alegria mas grande de todo lo que llevamos de 2010!!

Llevo meses buscando un tutorial que me enseñe a hacer cosas con ventanas en C++, pero nada, y aora vas tu, y pones uno en SB, aleluya!!

Bueno, gracias, pero una cosa:

¿Esto funciona en Linux, si no me has matado de un golpe...?

Gracias por el tutorial, de verdad, gracias...


I like:

Imagen de burnxez

Esto funciona

En cualquier plataforma, son las ventajas de usar librerias libres y estandar :D

Saludos.

Imagen de sarutoby

Me has dado una alegria

Es que saves en el pos de "Necesito sustitutos..." Era por que me queria pasar a linux. Ya he hecho la migracion, tengoinstalado MAndriva y Mac OS 10.6 snow Leopard. Pero uso mas el Mandriva que otro...xD

Bueno, la cuestion es que queria continuar mis proyectosC++ en Linux, y si esto no funciona en linux, pues el tutorial no me ayudava, pero si dices que si, perfecto!!

Gracias!!


I like:

Imagen de moikop

Gracias.

Muy buen tuto.Muy bien explicado.

Muchas gracias xXZeroXx.

Un saludo.

Imagen de the dragon lives

Me gusta

Me gusta ver que los tutos siguen creciendo, yo actualmente estoy aprendiendo HTML, después de este lenguaje a ver si entro en otro que ya este dirigido a objetos

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.