tag:blogger.com,1999:blog-16030292535263552432024-02-19T06:42:47.982-08:00Tutorial de Genie / Vala. Genie ProgrammingUn blog de auxilio a los que quieren empezar con Genie y no saben como.Gontzal Uriartehttp://www.blogger.com/profile/12210198332710363093noreply@blogger.comBlogger19125tag:blogger.com,1999:blog-1603029253526355243.post-64624994779746977182014-11-17T15:34:00.000-08:002014-11-17T15:35:42.195-08:00Frame archivos prediseñado<span style="color: blue;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: x-small;"><span style="color: black;">No nos hace falta crear una ventana que muestre directorios para después elegir archivos. Gtk lo hace por nosotros/as usando FileChooserDialog...</span></span></span></span><br />
<span style="color: blue;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: x-small;"><span style="color: black;"><br /></span></span></span></span>
<br />
<span style="color: blue;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: x-small;"><span style="color: black;"><span style="color: red;">valac -o "archivos" *.gs --pkg gtk+-3.0</span> </span> </span></span></span><br />
<br />
<br />
<span style="color: blue;"><span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: x-small;">[indent=4]<br />uses Gtk<br />init<br /> Gtk.init (ref args) // inicializa gtk<br /> var prueba = new ventana () // crea el objeto prueba<br /> prueba.show_all () // muestra todo<br /> Gtk.main (); // comienza con el loop<br /><br />class ventana : Window // Crea una clase de ventana<br /> init<br /> title = "Ventana de prueba" // escribe el titulo<br /> default_height = 250 // anchura<br /> default_width = 250 // altura<br /> window_position = WindowPosition.CENTER // posición<br /> <br /> // creamos un boton con la siguiente etiqueta<br /> var button = new Button.with_label ("Pulsa este botón")<br /> // Une el evento de clic de raton con la funcion pulsado<br /> button.clicked.connect (pulsado)<br /> <br /> // si pulsamos la x de la barra saldrá del loop<br /> destroy.connect(Gtk.main_quit)<br /><br /> // añade el boton a la ventana<br /> add(button)<br /><br /> def pulsado (btn : Button)<br /> var FC= new FileChooserDialog ("Elige un archivo para abrir", this, Gtk.FileChooserAction.OPEN,<br /> "_Abrir",Gtk.ResponseType.ACCEPT,<br /> "_Cerrar",Gtk.ResponseType.CANCEL);<br /> FC.select_multiple = false;<br /> FC.set_modal(true)<br /> case FC.run ()<br /> when Gtk.ResponseType.CANCEL<br /> FC.hide()<br /> FC.close()<br /> when Gtk.ResponseType.ACCEPT<br /> FC.hide()<br /> var direccion=FC.get_filename ();<br /> print direccion</span></span></span>Gontzal Uriartehttp://www.blogger.com/profile/12210198332710363093noreply@blogger.com19tag:blogger.com,1999:blog-1603029253526355243.post-90494162429826448802013-07-03T05:35:00.002-07:002013-07-03T05:36:23.784-07:00Array unidimensionales y multidimensionalesSi no deseamos usar la librería libgee podemos usar el siguiente tipo de listas llamados arrays y que son de fácil uso para arrays de tipo int,string,char, etc..<br />
<span style="font-size: x-small;"><br /></span>
<span style="font-size: x-small;"><span style="color: blue;">[indent=4]</span></span><br />
<span style="font-size: x-small;"><span style="color: blue;">arr : array of string[,] // declaramos el array de dos dimensiones<br />init<br /> arr = new array of string[1,1] // marcamos el numero de entradas.<br /> arr[0,0] = "esto" <br /> arr[1,1] = "es"<br /> arr[0,1] = "un"<br /> arr[1,0] = "array"<br /> stderr.printf("%s %s %s %s\n", arr[0,0], arr[1,1],arr[0,1], arr[1,0])</span></span><br />
<br />
<br />
Para compilar no es necesario usar libgee solo <span style="color: red;">valac -o array array.gs</span><br />
<br />
Agur.Gontzal Uriartehttp://www.blogger.com/profile/12210198332710363093noreply@blogger.com0tag:blogger.com,1999:blog-1603029253526355243.post-39071869941237452592012-08-22T09:51:00.000-07:002012-08-22T10:41:00.775-07:00Listas complejasSi lo que queremos es crear listas mas complejas conteniendo datos de diferentes tipos yo recomiendo crear un objeto y después crear una lista de este objeto. <br />
<b><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"></span></b><br />
// complila con valac nombre.gs --pkg gee-1.0<br />
<br />
<b><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><span style="color: blue;">[indent=4]</span><br style="color: blue;" /><span style="color: blue;">uses Gee</span><br style="color: blue;" /><span style="color: blue;">//creamos la clase casa </span></span></b><br />
<b><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><span style="color: blue;">class casa: Object</span><br style="color: blue;" /><span style="color: blue;"> Portal: int</span><br style="color: blue;" /><span style="color: blue;"> Piso:int</span><br style="color: blue;" /><span style="color: blue;"> Puerta:string</span><br style="color: blue;" /><span style="color: blue;"> Calle:string</span></span></b><br />
<b><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><span style="color: blue;"></span><br style="color: blue;" /><span style="color: blue;">casa0:casa</span><br style="color: blue;" /><span style="color: blue;">init</span><br style="color: blue;" /><span style="color: blue;"> var lista_de_casas = new list of casa</span><br style="color: blue;" /><span style="color: blue;"> </span></span></b><br />
<b><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><span style="color: blue;"> //Instanciamos el objeto casa</span><br style="color: blue;" /><span style="color: blue;"> casa0= new casa()</span><br style="color: blue;" /><span style="color: blue;"> //Introducimos datos</span><br style="color: blue;" /><span style="color: blue;"> casa0.Portal=4</span><br style="color: blue;" /><span style="color: blue;"> casa0.Piso=3</span><br style="color: blue;" /><span style="color: blue;"> casa0.Puerta="A"</span><br style="color: blue;" /><span style="color: blue;"> casa0.Calle ="Calle Mayor"</span><br style="color: blue;" /><span style="color: blue;"> //Introducimos en la lista</span><br style="color: blue;" /><span style="color: blue;"> lista_de_casas.add(casa0)</span><br style="color: blue;" /><span style="color: blue;"> </span><br style="color: blue;" /><span style="color: blue;"> // Si queremos obtener un nuevo item en la lista deberemos reinstanciar </span><br style="color: blue;" /><span style="color: blue;"> // el objeto casa y lo podemos hacer con el mismo nombre</span><br style="color: blue;" /><span style="color: blue;"> casa0= new casa()</span><br style="color: blue;" /><span style="color: blue;"> casa0.Portal=6</span><br style="color: blue;" /><span style="color: blue;"> casa0.Piso=7</span><br style="color: blue;" /><span style="color: blue;"> casa0.Puerta="B"</span><br style="color: blue;" /><span style="color: blue;"> casa0.Calle ="Calle Menor"</span><br style="color: blue;" /><span style="color: blue;"> lista_de_casas.add(casa0)</span><br style="color: blue;" /><span style="color: blue;"> </span><br style="color: blue;" /><span style="color: blue;"> for var e in lista_de_casas</span><br style="color: blue;" /><span style="color: blue;"> print e.Calle+" "+e.Portal.to_string()+ "-"+ e.Piso.to_string()+ " "+e.Puerta+ " "</span><br style="color: blue;" /><span style="color: blue;"> // este for tiene un warning consigo fallo de la librería gee</span><br style="color: blue;" /><span style="color: blue;"> </span></span></b><br />
<br />
<br />
En este tipo de listas podríamos introducir tipos de variables creados por nosotros desde otros objetos o usar otros que ya están creados como los de las librerías SDL. Por ejemplo : Rect y Surface. Es decir, podemos anidar objetos dentro de otros y todos meterlos en una lista. En el siguiente ejemplo Introduciremos un objeto dentro de otro objeto, es decir el objeto persona lo introduciremos dentro del objeto casa. Pero claro esta que los objetos necesitan instanciarse para ser usados y si el objeto casa quiere usar el objeto persona este debe de haber sido correctamente instanciado. Lo haré mediante el constructor de casa. Aún así lo podría haber hecho a través de init. ¿Para que sirve el constructor? Es el que recoge las variables de construccion del objeto cuando lo instanciamos con <span style="color: red;">new</span>. En este caso no tiene ninguna. <span style="color: red;">init</span> al igual que <span style="color: red;">construct</span> se ejecutan cuando instanciamos el objeto con new. Sin embargo se dispara antes que construct. Pero bueno, dejemos esto de la construccion de objetos para otro capítulo.<br />
<br />
<span style="color: blue; font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">[indent=4] </span></span><br />
<span style="color: blue; font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">uses Gee</span></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><b><br style="color: blue;" /><span style="color: blue;">class persona: Object</span><br style="color: blue;" /><span style="color: blue;"> Nombre:string</span><br style="color: blue;" /><span style="color: blue;"> Apellidos:string</span><br style="color: blue;" /><span style="color: blue;"> </span><br style="color: blue;" /><span style="color: blue;">class casa: Object</span><br style="color: blue;" /><span style="color: blue;"> Portal: int</span><br style="color: blue;" /><span style="color: blue;"> Piso:int</span><br style="color: blue;" /><span style="color: blue;"> Puerta:string</span><br style="color: blue;" /><span style="color: blue;"> Calle:string</span><br style="color: blue;" /><span style="color: blue;"> Persona:persona</span><br style="color: blue;" /><span style="color: blue;"> construct () // también se podría haber puesto init aquí.</span><br style="color: blue;" /><span style="color: blue;"> Persona= new persona()</span><br style="color: blue;" /><span style="color: blue;">casa0:casa</span><br style="color: blue;" /><span style="color: blue;">e:Collection</span><br style="color: blue;" /><span style="color: blue;">init</span><br style="color: blue;" /><span style="color: blue;"> var lista_de_casas = new list of casa</span><br style="color: blue;" /><span style="color: blue;"> //Instanciamos el objeto casa</span><br style="color: blue;" /><span style="color: blue;"> casa0= new casa()</span><br style="color: blue;" /><span style="color: blue;"> //Introducimos datos</span><br style="color: blue;" /><span style="color: blue;"> casa0.Portal=4</span><br style="color: blue;" /><span style="color: blue;"> casa0.Piso=3</span><br style="color: blue;" /><span style="color: blue;"> casa0.Puerta="A"</span><br style="color: blue;" /><span style="color: blue;"> casa0.Calle ="Calle Mayor"</span><br style="color: blue;" /><span style="color: blue;"> casa0.Persona.Nombre="Gorka"</span><br style="color: blue;" /><span style="color: blue;"> casa0.Persona.Apellidos="Santos Garmendia"</span><br style="color: blue;" /><span style="color: blue;"> </span><br style="color: blue;" /><span style="color: blue;"> //Introducimos en la lista</span><br style="color: blue;" /><span style="color: blue;"> lista_de_casas.add(casa0)</span><br style="color: blue;" /><span style="color: blue;"> </span><br style="color: blue;" /><span style="color: blue;"> // Si queremos obtener un nuevo item en la lista deberemos reinstanciar </span><br style="color: blue;" /><span style="color: blue;"> // el objeto casa y lo podemos hacer con el mismo nombre</span><br style="color: blue;" /><span style="color: blue;"> casa0= new casa()</span><br style="color: blue;" /><span style="color: blue;"> casa0.Portal=6</span><br style="color: blue;" /><span style="color: blue;"> casa0.Piso=7</span><br style="color: blue;" /><span style="color: blue;"> casa0.Puerta="B"</span><br style="color: blue;" /><span style="color: blue;"> casa0.Calle ="Calle Menor"</span><br style="color: blue;" /><span style="color: blue;"> casa0.Persona.Nombre="Gaizka"</span><br style="color: blue;" /><span style="color: blue;"> casa0.Persona.Apellidos="Sanchez Soler"</span><br style="color: blue;" /><span style="color: blue;"> lista_de_casas.add(casa0)</span><br style="color: blue;" /><span style="color: blue;"> </span><br style="color: blue;" /><span style="color: blue;"> for e in lista_de_casas</span><br style="color: blue;" /><span style="color: blue;"> print e.Persona.Nombre + " " +e.Persona.Apellidos</span><br style="color: blue;" /><span style="color: blue;"> print e.Calle+ " "+ e.Portal.to_string()+ "-"+ e.Piso.to_string()+ " "+ e.Puerta+ " \n"</span><br style="color: blue;" /><span style="color: blue;"> </span><br style="color: blue;" /><span style="color: blue;"> // este for tiene un warnin consigo fallo de la librería gee</span><br style="color: blue;" /><span style="color: blue;"> </span></b></span><br />
<br />
<div style="color: black; font-family: inherit;">
<br /></div>
<div style="font-family: inherit;">
<span style="font-size: x-small;"><span style="color: blue;"><span style="font-family: inherit; font-size: small;">Si lo necesitamos también podemos incluir <u>listas</u> dentro de los objetos. Imaginemos que dentro del objeto persona introducimos una lista de los nombres de los hijos, el resultado sería el siguiente.<span style="color: red;"> No olvideís que las listas dentro de las clases también tienen que ser inicializadas.</span></span></span></span></div>
<br />
<span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><span style="color: blue;"><span style="font-family: inherit; font-size: small;"><b><span style="color: blue; font-family: "Courier New",Courier,monospace; font-size: x-small;"><br />uses Gee<br /><br />class persona: Object<br /> Nombre:string<br /> Apellidos:string<br /> Hijos:new list of string<br /> init<br /> Hijos= new list of string <span style="color: red;">//inicializamos la lista de hijos así.</span><br style="color: red;" /> <br />class casa: Object<br /> Portal: int<br /> Piso:int<br /> Puerta:string<br /> Calle:string<br /> Persona:persona<br /> init<br /> Persona= new persona()<br />casa0:casa<br />e:Collection<br />init<br /> var lista_de_casas = new list of casa<br /> //Instanciamos el objeto casa<br /> casa0= new casa<br /> //Introducimos datos<br /> casa0.Portal=4<br /> casa0.Piso=3<br /> casa0.Puerta="A"<br /> casa0.Calle ="Calle Mayor"<br /> casa0.Persona.Nombre="Gorka"<br /> casa0.Persona.Apellidos="Santos Garmendia"<br /> casa0.Persona.Hijos.add("Felipe") <span style="color: red;">// introducimos los hijos dentro de la sublista</span><br /> casa0.Persona.Hijos.add("Rosa")<br /> casa0.Persona.Hijos.add("Marta")<br /><br /> <br /> //Introducimos en la lista<br /> lista_de_casas.add(casa0)<br /> <br /> // Si queremos obtener un nuevo item en la lista deberemos reinstanciar <br /> // el objeto casa y lo podemos hacer con el mismo nombre<br /> casa0= new casa()<br /> casa0.Portal=6<br /> casa0.Piso=7<br /> casa0.Puerta="B"<br /> casa0.Calle ="Calle Menor"<br /> casa0.Persona.Nombre="Gaizka"<br /> casa0.Persona.Apellidos="Sanchez Soler"<br /> casa0.Persona.Hijos.add("Leire")<br /> casa0.Persona.Hijos.add("Agurtzane")<br /> lista_de_casas.add(casa0)<br /> <br /> for e in lista_de_casas<br /> print e.Persona.Nombre + " " +e.Persona.Apellidos<br /> for hijo in e.Persona.Hijos <span style="color: red;">// imprimimos la lista de hijos</span><br /> print "Hijo:"+hijo<br /> <br /> print e.Calle+ " "+ e.Portal.to_string()+ "-"+ e.Piso.to_string()+ " "+ e.Puerta+ " \n"<br /> <br /> // este for tiene un warnin consigo fallo de la librería gee</span></b> </span></span><b><span style="color: blue;"><br /></span></b></span>Gontzal Uriartehttp://www.blogger.com/profile/12210198332710363093noreply@blogger.com0tag:blogger.com,1999:blog-1603029253526355243.post-50337971085661637052012-08-05T06:36:00.001-07:002012-08-05T13:51:50.650-07:00Conversión de variablesDe INT o DOUBLE a STRING<br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">[indent=4]</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">a: int</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">init </span><span style="color: blue; font-family: "Courier New",Courier,monospace;"></span> <br />
<div style="color: blue; font-family: "Courier New",Courier,monospace;">
a=1 </div>
<div style="color: blue; font-family: "Courier New",Courier,monospace;">
print " numero: " + a.<b>to_string()</b> //imprimira la cadena 1</div>
<br />
De STRING a INT<br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">[indent=4]</span><br style="color: blue; font-family: "Courier New",Courier,monospace;" /><span style="color: blue; font-family: "Courier New",Courier,monospace;">c : string</span><br style="color: blue; font-family: "Courier New",Courier,monospace;" /><span style="color: blue; font-family: "Courier New",Courier,monospace;">init</span><br style="color: blue; font-family: "Courier New",Courier,monospace;" /><span style="color: blue; font-family: "Courier New",Courier,monospace;"> c="123"</span><br style="color: blue; font-family: "Courier New",Courier,monospace;" /><span style="color: blue; font-family: "Courier New",Courier,monospace;"> print "%i", <b>int.parse(c)</b></span><br style="color: blue; font-family: "Courier New",Courier,monospace;" /><br style="color: blue; font-family: "Courier New",Courier,monospace;" />De STRING a DOUBLE<br />
<br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">[indent=4]</span><br style="color: blue; font-family: "Courier New",Courier,monospace;" />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">c : string</span><br style="color: blue; font-family: "Courier New",Courier,monospace;" />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">init</span><br style="color: blue; font-family: "Courier New",Courier,monospace;" />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> c="123.3"</span><br style="color: blue; font-family: "Courier New",Courier,monospace;" />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> print "%f",<b> double.parse(c)</b></span><br style="color: blue; font-family: "Courier New",Courier,monospace;" />
<br />
De DOUBLE a INT<br />
<div style="color: blue; font-family: "Courier New",Courier,monospace;">
numero : double</div>
<div style="color: blue; font-family: "Courier New",Courier,monospace;">
init </div>
<div style="color: blue; font-family: "Courier New",Courier,monospace;">
numero = 2584833</div>
<div style="color: blue; font-family: "Courier New",Courier,monospace;">
print "%i", <b>(int)</b>numero </div>
<div style="color: blue; font-family: "Courier New",Courier,monospace;">
</div>
<br />
De DOUBLE a INT<br />
<div style="color: blue; font-family: "Courier New",Courier,monospace;">
numero : int</div>
<div style="color: blue; font-family: "Courier New",Courier,monospace;">
init </div>
<div style="color: blue; font-family: "Courier New",Courier,monospace;">
numero = 2584</div>
<div style="color: blue; font-family: "Courier New",Courier,monospace;">
print "%f", <b>(double)</b>numero <br />
</div>
<div style="color: blue; font-family: "Courier New",Courier,monospace;">
<br /></div>
<div style="color: blue; font-family: "Courier New",Courier,monospace;">
<br /></div>Gontzal Uriartehttp://www.blogger.com/profile/12210198332710363093noreply@blogger.com1tag:blogger.com,1999:blog-1603029253526355243.post-42757781544092606742012-07-25T06:24:00.002-07:002012-07-27T03:33:54.954-07:00Gtk_Timeout - Pon un timer en tu vida.<br />
En esta ejemplo hemos añadido al ejemplo de TextView una función que es llamada por el Timer de Gtk. Con ello hemos conseguido crear un texto animado. Cuando pulsamos el boton activamos el Timer.<br />
<span style="color: blue; font-family: "Courier New",Courier,monospace; font-size: x-small;"><b>Timeout.add(50, mover)</b> --> Llama a mover con velocidad de 50 ticks<b><br /></b></span><br />
Atención puesto que "mover" tiene que ser una funcion de tipo booleano y retornar true para continuar en funcionamiento.<br />
<br />
Nota: Booleano es de tipo lógico y sus valores posibles son<span style="color: lime;"> true</span> o <span style="color: lime;">false</span> <br />
<br />
Muy sencillo:<br />
<br />
<br />
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"><span style="color: blue;">[indent=4]</span></span></div>
<span style="color: blue; font-family: "Courier New",Courier,monospace; font-size: x-small;">uses<br /> Gtk<br />init<br /><br /> Gtk.init (ref args)<br /> var test = new Miventana ()<br /> test.show_all ()<br /> <br /> Gtk.main ()<br /> <br /> <br />class Miventana : Window<br /> texto1: Gtk.TextView = new TextView<br /> <br /> rojo: Gtk.TextTag<br /> blanco: Gtk.TextTag<br /> ti1: Gtk.TextIter; ti2: Gtk.TextIter; ti3: Gtk.TextIter; ti4: Gtk.TextIter<br /> <br /> acolor : Gdk.Color<br /> <br /> boton1: Button= new Button.with_label ("Pulsa este botón")<br /> contador: int = 0<br /> frase:string ="La casa esta rota, pero ya la estamos arreglando. La casa esta rota, pero ya la estamos arreglando."<br /> vbox : VBox = new VBox (true, 5)<br /> <br /> init<br /> Gdk.Color.parse("#1F2AF1", out acolor)<br /> rojo=texto1.buffer.create_tag("rojo", "foreground-gdk", acolor);<br /> blanco=texto1.buffer.create_tag("blanco", "foreground", "White");<br /> <br /> texto1.editable = false<br /> texto1.cursor_visible = false<br /> title = "Ventana de prueba"<br /> default_height = 360<br /> default_width = 560<br /> window_position = WindowPosition.CENTER<br /> boton1.clicked.connect (pulsado)<br /> <br /> destroy.connect(Gtk.main_quit)<br /> vbox.add (boton1)<br /> vbox.add(texto1) <br /> add (vbox)<br /> texto1.set_size_request(100, 200)<br /> boton1.set_size_request(100,10)<br /> texto1.buffer.text = frase<br /> texto1.buffer.get_iter_at_mark (out ti1, texto1.buffer.get_insert ())<br /> texto1.buffer.get_iter_at_mark (out ti2, texto1.buffer.get_insert ())<br /> texto1.buffer.get_iter_at_mark (out ti3, texto1.buffer.get_insert ())<br /> texto1.buffer.get_iter_at_mark (out ti4, texto1.buffer.get_insert ())<br /> <br /> <b>Timeout.add(50, mover)</b><br /> <br /> def pulsado (btn : Button)<br /> contador=0<br /> <br /> <b>def mover():bool<br /> contador+=1<br /> <br /> ti1.set_offset(0)<br /> ti2.set_offset(contador)<br /> ti3.set_offset(contador+5)<br /> ti4.set_offset(longitud(frase))<br /> <br /> texto1.buffer.remove_all_tags (ti1,ti4)<br /> texto1.buffer.apply_tag (blanco,ti1,ti2)<br /> texto1.buffer.apply_tag (rojo,ti2,ti3)<br /> texto1.buffer.apply_tag (blanco,ti3,ti4)<br /> return true</b></span><br />
<br />
<br />Gontzal Uriartehttp://www.blogger.com/profile/12210198332710363093noreply@blogger.com2tag:blogger.com,1999:blog-1603029253526355243.post-18575844938009845372012-07-25T00:44:00.001-07:002012-07-25T00:53:48.438-07:00Gtk + Textview y variables de claseEn este ejemplo también vamos a ver como podemos inicializar ciertas variables de una clase y las podrémos usar por toda la clase. Ejemplo: texto1, rojo, blanco,contador. Estas variables las declararemos antes del init de la clase.<br />
<br />
Como vemos mucho del texto no es sintaxis propia de vala sino la de GTK+. Por lo tanto para alguien experimentado en Python Gtk (pygtk) o quien haya programado en este interface antes en uno u otro idioma la dinámica es parecida.<br />
<br />
Este ejemplo es un pequeño programa en el cual cuando pulsamos el botón el texto se va descubriendo hacia la derecha. Lo conseguimos usando un contador de posición y creando "tags" que son estilos de texto:(subrayado, negrita,fuente, color...)<br />
e insertando esos estilos en ciertos "Iters" que son por así decirlo punteros para el texto del buffer.<br />
<br />
<br />
<span style="color: blue; font-family: "Courier New",Courier,monospace; font-size: x-small;"><b>[indent=4]<br />uses<br /> Gtk<br />init<br /><br /> Gtk.init (ref args)<br /> var test = new TestWindow ()<br /> test.show_all ()<br /> Gtk.main ();<br /> <br /> <br />class TestWindow : Window<br /> texto1: Gtk.TextView = new TextView<br /> <br /> rojo: Gtk.TextTag<br /> blanco: Gtk.TextTag<br /> ti1: Gtk.TextIter<br /> ti2: Gtk.TextIter<br /> ti3: Gtk.TextIter<br /> ti4: Gtk.TextIter<br /> <br /> acolor : Gdk.Color<br /> cont:int=0<br /> boton1: Button= new Button.with_label ("Pulsa este botón")<br /> contador: int = 0<br /> palabras: new array of string<br /> frase:string ="La casa esta rota, pero ya la estamos arreglando"<br /> vbox : VBox = new VBox (true, 5)<br /> <br /> init<br /> Gdk.Color.parse("#1F2AF1", out acolor)<br /> rojo=texto1.buffer.create_tag("rojo", "foreground-gdk", acolor);<br /> blanco=texto1.buffer.create_tag("blanco", "foreground", "White");<br /> <br /> texto1.editable = false<br /> texto1.cursor_visible = false<br /> palabras= frase.split(" ")<br /> title = "Ventana de prueba"<br /> default_height = 360<br /> default_width = 560<br /> window_position = WindowPosition.CENTER<br /> boton1.clicked.connect (pulsado)<br /> <br /> destroy.connect(Gtk.main_quit)<br /> vbox.add (boton1)<br /> vbox.add(texto1) <br /> add (vbox)<br /> texto1.set_size_request(100, 200)<br /> texto1.buffer.text = frase<br /> texto1.buffer.get_iter_at_mark (out ti1, texto1.buffer.get_insert ())<br /> texto1.buffer.get_iter_at_mark (out ti2, texto1.buffer.get_insert ())<br /> texto1.buffer.get_iter_at_mark (out ti3, texto1.buffer.get_insert ())<br /> texto1.buffer.get_iter_at_mark (out ti4, texto1.buffer.get_insert ())<br /> <br /> def pulsado (btn : Button)<br /> <br /> contador++<br /> ti1.set_offset(0)<br /> ti2.set_offset(contador)<br /> ti3.set_offset(contador+5)<br /> ti4.set_offset(longitud(frase))<br /> <br /> texto1.buffer.remove_all_tags (ti1,ti4)<br /> texto1.buffer.apply_tag (blanco,ti1,ti2)<br /> texto1.buffer.apply_tag (rojo,ti2,ti3)<br /> texto1.buffer.apply_tag (blanco,ti3,ti4)</b></span><br />
<br />Gontzal Uriartehttp://www.blogger.com/profile/12210198332710363093noreply@blogger.com0tag:blogger.com,1999:blog-1603029253526355243.post-66147216334961602602012-07-23T06:51:00.004-07:002012-07-24T16:11:49.973-07:00ArchivosPara abrir archivos tenemos una serie de métodos como estos: <a href="http://references.valadoc.org/#%21api=glib-2.0/GLib.FileStream">http://references.valadoc.org/#!api=glib-2.0/GLib.FileStream</a> . En este caso<br />
hemos creado una variable f que será el archivo en modo lectura. Los datos se meterán en "a" a través del método f.gets(a) y nosotros los pasamos a una cadena creada con StringBuilder (Constructor de cadenas) en la variable bu y lo metemos una lista de Gee(atención al compilar usar <b style="color: cyan;">--pkg gee-1.0 </b>). <br />
<br />
Para aprender el funcionamiento de Stringbuilder. Por ejemplo para crear una cadena a partir de variables tipo caracter. <a href="http://references.valadoc.org/#%21api=glib-2.0/GLib.StringBuilder">http://references.valadoc.org/#!api=glib-2.0/GLib.StringBuilder</a><br />
<br />
<div style="color: blue; font-family: "Courier New",Courier,monospace;">
<b><br /></b></div>
<pre style="color: blue; font-family: "Courier New",Courier,monospace;"><div>
<b>[indent=4]
uses Gee
init
var f = FileStream.open("/home/gontzal/for","r")
var a = new array of char[1000]
var bu = new StringBuilder ()
var lista =new list of string
while f.gets(a)!= null
for s in a do bu.append_c(s)
lista.add (bu.str)
bu.erase()
for h in lista
stdout.printf(h)
</b></div>
</pre>
<script language="javascript" src="http://www.blogtrog.com/scripts/bt_code.js" type="text/javascript">
</script><script language="javascript" type="text/javascript">
bt_code_init('1be0179b-b2bd-4287-bbd1-af948f93b893');
</script>Gontzal Uriartehttp://www.blogger.com/profile/12210198332710363093noreply@blogger.com6tag:blogger.com,1999:blog-1603029253526355243.post-12235031562902237222012-07-23T04:13:00.002-07:002012-07-24T16:11:05.179-07:00Importar librerias propiasCuando nuestro código es muy grande o cuando creamos unas pequeñas librerías para crear un código más limpio llevamos estas funciones o clases a otro fichero. Lo aplicaremos al ejemplo de las cadenas unicode que se ha expuesto en el capítulo 4.<br />
<br />
En el archivo "cadenas.gs" escribiremos las siguientes funciones:<br />
<pre id="bt_plainText" style="border: 0px none; color: blue; font-family: "Courier New",Courier,monospace; margin: 0px; padding: 0px;"><b> </b></pre>
<pre id="bt_plainText" style="border: 0px none; color: blue; font-family: "Courier New",Courier,monospace; margin: 0px; padding: 0px;"><b>[indent=4]
def toma_cadena (a:string,i :int,f:int=-1):string
b: string
var bu = new StringBuilder ();
if f==-1
bu.append_unichar(a.get_char(a.index_of_nth_char(i)))
b=bu.str
else
for var p =i to f
bu.append_unichar(a.get_char(a.index_of_nth_char(p)))
b=bu.str
return b
def longitud (a:string):int
return a.char_count()</b></pre>
<pre id="bt_plainText" style="border: 0px none; color: blue; font-family: "Courier New",Courier,monospace; margin: 0px; padding: 0px;"><b> </b></pre>
En el archivo "principal.gs" escribiremos el siguiente código:<br />
<br />
<pre style="color: blue; font-family: "Courier New",Courier,monospace;"><div>
<b>[indent=4]
a: string
init
a="áéíóú"
stdout.printf ("%i",longitud (a) )
print ("\n")
stdout.printf( "%s\n",toma_cadena(a,0,1))
</b></div>
</pre>
<br />
<br />
Y para compilar haremos lo siguiente en Geany:<br />
<div style="color: blue;">
<b>valac -o "%e" cadenas.gs "%f" </b></div>
<div style="color: black;">
o lo que es lo mismo:</div>
<div style="color: blue;">
<b>valac -o principal cadenas.gs principal.gs</b><b> </b></div>
<div style="color: blue;">
<b><br /></b></div>
<br />
Esto creará un archivo ejecutable que se llamará principal y usará como fuentes ambos archivos. Por lo tanto no dará error al compilar puesto que las funciones que le faltan en el archivo principal.gs las encontrará en cadenas.gs<br />
<br />
<br />Gontzal Uriartehttp://www.blogger.com/profile/12210198332710363093noreply@blogger.com0tag:blogger.com,1999:blog-1603029253526355243.post-22386046350058745992012-07-22T14:04:00.001-07:002012-08-27T02:36:57.468-07:00Cadenas<span style="color: blue; font-family: "Courier New",Courier,monospace;"><span style="color: black;">Si deseamos trabajar con cadenas, nuestro acometido será muy similar al de python. Por ejemplo, si queremos unir dos cadenas simplemente usaremos el símbolo "+". Si lo que deseamos es obtener una subcadena usaremos los corchetes []. En el interior de los corchetes la sintaxis es la siguiente [inicio:fin]. Por lo tanto si queremos crear una subcadena con los dos primeros caracteres haremos lo siguiente [0:2] </span><span style="background-color: black;"></span> </span><br />
<div style="color: black;">
<br /></div>
<span style="color: blue; font-family: "Courier New",Courier,monospace; font-size: x-small;">[indent=4]</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace; font-size: x-small;">a: string</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace; font-size: x-small;">b: string </span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace; font-size: x-small;">c: string </span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace; font-size: x-small;">init</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace; font-size: x-small;"> a="hola."</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace; font-size: x-small;"> b=",mundo"</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace; font-size: x-small;"> a= a[0:4] //transformaremos a en hola sin punto </span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace; font-size: x-small;"> c= a+b </span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace; font-size: x-small;"> print c</span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"></span><br />
<div style="color: black;">
<br /></div>
<div style="color: black;">
<span style="font-family: "Courier New",Courier,monospace;">Ojo!! Si lo que deseamos es sacar un solo caracter con formato tipo "char" usaremos esto : cadena[posición]. Lo cual no podremos imprimir con un simple print puesto que solo sirve para cadenas.</span></div>
<div style="color: black;">
<span style="font-family: "Courier New",Courier,monospace;">Ahora bien tendrémos que especificar que es un Char de este modo "%c",a[0]</span><br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">Ejemplo:</span></div>
<div style="color: blue;">
<span style="font-size: x-small;"><br /></span></div>
<div style="color: blue;">
<span style="font-family: "Courier New",Courier,monospace; font-size: x-small;">[indent=4]</span></div>
<div style="color: blue;">
<span style="font-family: "Courier New",Courier,monospace; font-size: x-small;">a: string<br />init<br /> a="hola"<br /> print a[0:1] //Sacamos la "h" en forma string <br /> print "%c",a[0] //especificamos que "h" será un char</span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> print a[0:a.length] //Escribe todo hasta la longitud total</span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> print a[0:a.index_of("o",0)+1] // imprime hasta la o</span><br />
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: x-small;"> print print a.replace("h","m") // escribe "mola" en vez de "hola" </span></span><br />
<span style="font-family: "Courier New",Courier,monospace;"><br /></span>
<span style="font-family: "Courier New",Courier,monospace;"><br /></span>
<span style="font-family: "Courier New",Courier,monospace;"><span style="color: black;">Pero como en Python también tenemos la opción de separar una cadena dados ciertos separadores o unirla.</span></span><br />
<br />
<span style="font-family: "Courier New",Courier,monospace;"><span style="color: black;">Ejemplo:</span></span><br />
<br />
<div style="color: blue;">
<span style="font-family: "Courier New",Courier,monospace; font-size: x-small;">[indent=4]<span style="color: black;"> </span></span></div>
<span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><span style="color: black;"><span style="color: blue;">a: string</span><br style="color: blue;" /><span style="color: blue;">f : new array of string</span><br style="color: blue;" /><span style="color: blue;">init</span><br style="color: blue;" /><span style="color: blue;"> a="hola que tal estas"</span><br style="color: blue;" /><span style="color: blue;"> f=a.split(" ")</span><br style="color: blue;" /><span style="color: blue;"> for i in f</span><br style="color: blue;" /><span style="color: blue;"> print i // se imprimirá cada palabra por separado</span><br style="color: blue;" /> <br /><span style="color: black;"> </span></span><span style="color: blue;">//Después se pueden unir usando joinv, las uniremos con ":"</span></span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> m= m.joinv(":",f)<br /> print m</span><br />
<span style="font-family: "Courier New",Courier,monospace;"><br /></span>
<div style="color: black;">
<span style="font-family: "Courier New",Courier,monospace;"><br /></span></div>
<div style="color: black;">
<span style="font-family: "Courier New",Courier,monospace;">Glib aporta una serie de métodos para tratar las cadenas como UTF8. Ejemplo:</span></div>
<span style="font-family: "Courier New",Courier,monospace;"><br /></span>
<div style="color: blue;">
<span style="font-family: "Courier New",Courier,monospace; font-size: x-small;">[indent=4]<span style="color: black;"> <br />
</span></span></div>
<span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><span style="color: black;"><span style="color: blue;">a: string</span><br style="color: blue;" /><span style="color: blue;">f : new array of string</span><br style="color: blue;" /><span style="color: blue;">init</span><br style="color: blue;" /><span style="color: blue;"> a="á"</span><br style="color: blue;" /><span style="color: blue;"> </span><span style="color: blue;">print a</span></span></span><br />
<div style="color: blue;">
<span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> print a.length // El valor es 2 puesto que cuenta los valores crudos.</span></div>
<div style="color: blue;">
<span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> print a.char_count() // Este método se usa para Unicode. el resultado es 1. </span></div>
<br />
<br />
<span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><span style="color: black;">Mayormente usaremos char_count para así poder usar unicode sin problemas.</span></span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><span style="color: black;">Python sigue siendo bastante más sencillo para usar unicode. En este ejemplo tomaré una cadena unicode y la imprimiré de unicode en unicode.</span></span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><span style="color: black;">Estas son las nuevas funciones que he usado: </span></span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><span style="color: black;">a.get_char(int) Toma un unichar de la cadena en la posición cruda int</span></span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><span style="color: black;">a.index_of_nth_char(int) Indexa la posición Unicode de int, no usa la cruda.</span></span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><span style="color: black;">a.char_count() Cuenta los caracteres unicode de la cadena.</span></span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><span style="color: black;">He empleado también StringBuilder <a href="http://references.valadoc.org/#%21api=glib-2.0/GLib.StringBuilder"><b style="font-family: "Courier New",Courier,monospace;">http://references.valadoc.org/#!api=glib-2.0/GLib.StringBuilder</b></a> que nos puede servir para conformar cadenas a través de variables de tipo caracter o unicode-caracter</span></span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><span style="color: black;"></span></span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><span style="color: black;"></span></span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><span style="color: black;"></span></span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><span style="color: black;"></span></span><br />
<span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><span style="color: black;"><br /><span style="color: blue;">a: string</span><br style="color: blue;" /><span style="color: blue;">i: int</span><br style="color: blue;" /><br style="color: blue;" /><span style="color: blue;">def toma_cadena (a:string,i :int ):string</span><br style="color: blue;" /><span style="color: blue;"> b: string</span><br style="color: blue;" /><span style="color: blue;"> var bu = new StringBuilder ();</span><br style="color: blue;" /><span style="color: blue;"> bu.append_unichar(a.get_char(a.index_of_nth_char(i)))</span><br style="color: blue;" /><span style="color: blue;"> b=bu.str</span><br style="color: blue;" /><span style="color: blue;"> return b</span><br style="color: blue;" /><span style="color: blue;">def longitud (a:string):int</span><br style="color: blue;" /><span style="color: blue;"> return a.char_count()</span><br style="color: blue;" /><br style="color: blue;" /><span style="color: blue;">init</span><br style="color: blue;" /><span style="color: blue;"> a="1h2á3o4ó5ú"</span><br style="color: blue;" /><span style="color: blue;"> print "%i",longitud (a) </span><br style="color: blue;" /><span style="color: blue;"> </span><br style="color: blue;" /><span style="color: blue;"> for i =0 to (longitud(a))</span><br style="color: blue;" /><span style="color: blue;"> stdout.printf( "%s\n",toma_cadena(a,i))</span><br style="color: blue;" /> </span></span><br />
<br />
<div style="color: black;">
¿Que quiero decir con posición cruda y unicode?</div>
<div style="color: black; font-family: inherit;">
<br /></div>
<div style="color: black; font-family: inherit;">
Tenemos que entender que el unicode es una forma de notar todos los caracteres que están fuera de ASCII. Es decir los caracteres con acentos, dieresis, etc.</div>
<div style="color: black; font-family: inherit;">
Estos caracteres toman formas crudas como \x3 por ejemplo. Por lo tanto ocuparán diferente espacio; "a" ocupa un espacio pero "á" ocupa dos. Puesto que la notación unicode para la acentuada ocupa dos espacios. Tenemos que tener en cuenta que dentro de UTF-8,16 o 32 (unicode) hay caracteres rusos, chinos etc. Y Ascii solo tiene 256. Es por eso que para el español se necesita el unicode puesto que los ingeleses no incluyeron los acentos dentro de ascii. Ahora bien cuando hablo de posición o longitud cruda de "á" hablo de 2 y cuando hablo de longitud unicode de "á" diré 1. Lógicamente yo siempre usaré unicode por la cuenta que me trae. Eso quiere decir que muchas de las ventajas de usar corchetes desaparecen puesto que usan las cadenas crudas y no unicode.</div>
<div style="color: black; font-family: inherit;">
Por lo tanto para similar los corchetes [] yo crearía las siguientes funciones para facilitar mi código. Aunque se podría mejorar para incluir las funciones de resta -1 para coger todo menos el último carácter, etc. Pero aquí no me voy a liar.</div>
<div style="color: black;">
<br /></div>
<div style="color: blue; font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;">[indent=4]</span></div>
<div style="color: black;">
<span style="color: blue; font-family: "Courier New",Courier,monospace; font-size: x-small;">a: string</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace; font-size: x-small;">i: int</span><br />
<div style="color: blue; font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"><br /></span></div>
<span style="font-size: x-small;"><span style="color: blue; font-family: "Courier New",Courier,monospace;">def toma_cadena (a:string,i :int,f:int=-1):string</span><br style="color: blue; font-family: "Courier New",Courier,monospace;" /><span style="color: blue; font-family: "Courier New",Courier,monospace;"> b: string</span><br style="color: blue; font-family: "Courier New",Courier,monospace;" /><span style="color: blue; font-family: "Courier New",Courier,monospace;"> </span><br style="color: blue; font-family: "Courier New",Courier,monospace;" /><span style="color: blue; font-family: "Courier New",Courier,monospace;"> var bu = new StringBuilder ();</span><br style="color: blue; font-family: "Courier New",Courier,monospace;" /><span style="color: blue; font-family: "Courier New",Courier,monospace;"> if f==-1</span><br style="color: blue; font-family: "Courier New",Courier,monospace;" /><span style="color: blue; font-family: "Courier New",Courier,monospace;"> bu.append_unichar(a.get_char(a.index_of_nth_char(i)))</span><br style="color: blue; font-family: "Courier New",Courier,monospace;" /><span style="color: blue; font-family: "Courier New",Courier,monospace;"> b=bu.str</span><br style="color: blue; font-family: "Courier New",Courier,monospace;" /><span style="color: blue; font-family: "Courier New",Courier,monospace;"> else</span><br style="color: blue; font-family: "Courier New",Courier,monospace;" /><span style="color: blue; font-family: "Courier New",Courier,monospace;"> if f>0</span><br style="color: blue; font-family: "Courier New",Courier,monospace;" /><span style="color: blue; font-family: "Courier New",Courier,monospace;"> var p=i</span><br style="color: blue; font-family: "Courier New",Courier,monospace;" /><span style="color: blue; font-family: "Courier New",Courier,monospace;"> while p<f</span><br style="color: blue; font-family: "Courier New",Courier,monospace;" /><span style="color: blue; font-family: "Courier New",Courier,monospace;"> bu.append_unichar(a.get_char(a.index_of_nth_char(p)))</span><br style="color: blue; font-family: "Courier New",Courier,monospace;" /><span style="color: blue; font-family: "Courier New",Courier,monospace;"> p++</span><br style="color: blue; font-family: "Courier New",Courier,monospace;" /><span style="color: blue; font-family: "Courier New",Courier,monospace;"> b=bu.str</span><br style="color: blue; font-family: "Courier New",Courier,monospace;" /><span style="color: blue; font-family: "Courier New",Courier,monospace;"> else</span><br style="color: blue; font-family: "Courier New",Courier,monospace;" /><span style="color: blue; font-family: "Courier New",Courier,monospace;"> b=""</span><br style="color: blue; font-family: "Courier New",Courier,monospace;" /><span style="color: blue; font-family: "Courier New",Courier,monospace;"> return b</span></span><span style="font-size: x-small;"><br /></span>
<span style="color: blue; font-family: "Courier New",Courier,monospace; font-size: x-small;">def longitud (a:string):int</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace; font-size: x-small;"> return a.char_count()</span><br />
<span style="font-size: x-small;"><br /></span>
<span style="font-size: x-small;"><br /></span>
<span style="color: blue; font-family: "Courier New",Courier,monospace; font-size: x-small;">init</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace; font-size: x-small;"> a="áéíóú"</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace; font-size: x-small;"> stdout.printf ("%i\n",longitud (a))</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace; font-size: x-small;"> stdout.printf( "%s\n",toma_cadena(a,2,4))</span><br />
</div>
<div style="color: black;">
<br /></div>
<div style="color: black;">
<br /></div>
<span style="font-family: "Courier New",Courier,monospace;"><br /></span></div>
Gontzal Uriartehttp://www.blogger.com/profile/12210198332710363093noreply@blogger.com0tag:blogger.com,1999:blog-1603029253526355243.post-65064656190697671172012-07-04T15:50:00.001-07:002012-08-30T02:42:47.303-07:00SDLMixer sonidos<br />
<div style="color: red;">
<span style="color: blue; font-family: "Courier New",Courier,monospace;"><span style="color: black; font-family: inherit;">Aquí os dejo un ejemplo de como hacer escuchar nuestros sonidos. Los sonidos a los que me refiero son los ruidos y golpes que hace el juego al saltar o al cerrar una puerta. En este caso cada vez que pulsamos la tecla arriba saldrá el sonido cargado de este modo<span style="font-size: x-small;">:</span></span></span></div>
<div style="color: red;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="color: black; font-family: inherit;"><span style="font-size: x-small;"> </span></span></span><span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="color: black; font-family: inherit;"><span style="font-family: "Courier New",Courier,monospace;"> </span></span></span></span></div>
<div style="color: red;">
<b><span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;"><span style="color: black; font-family: inherit;"><span style="font-family: "Courier New",Courier,monospace;">// las variables</span></span></span></span></b></div>
<div style="color: red;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="color: black; font-family: inherit;"><span style="font-size: x-small;"> </span></span></span><span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: x-small;"><span style="font-size: x-small;">archivo: SDL.RWops<br />
sonido: SDLMixer.Chunk <br />
canal: SDLMixer.Channel</span>
</span></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><b><span style="color: black;"><br /></span></b></span></div>
<div style="color: red;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="color: black; font-family: inherit;"><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><b> // inicialización y llamada con play</b></span> </span></span></div>
<span style="color: red; font-family: "Courier New",Courier,monospace;"><span style="font-size: x-small;"> archivo= new SDL.RWops.from_file ("/home/gontzal/Mahaigaina/boing.ogg","rb")<br />
sonido= new SDLMixer.Chunk.WAV (archivo,-1)<br />
canal.play(sonido,0)<br />
</span></span><span style="color: blue; font-family: "Courier New",Courier,monospace;"><span style="color: red; font-family: inherit;"> </span> </span><br />
<br />
<br />
<span style="font-size: x-small;"><span style="color: blue; font-family: "Courier New",Courier,monospace;">[indent=4] </span></span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"><span style="font-size: x-small;">uses SDL<br />uses SDLMixer<br /><br />screen: unowned SDL.Screen<br />alto: int16=400<br />ancho:int16 =800<br />a: int=0<br />fin:bool=false<br />musica2: SDLMixer.Music <br /><b>archivo: SDL.RWops<br />sonido: SDLMixer.Chunk <br />canal: SDLMixer.Channel</b> </span></span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"><span style="font-size: x-small;">init<br /> <br /> SDL.init()<br /> screen = SDL.Screen.set_video_mode (ancho, alto,15,SurfaceFlag.FULLSCREEN| SurfaceFlag.DOUBLEBUF | SurfaceFlag.HWACCEL | SurfaceFlag.HWSURFACE)<br /> a= SDLMixer.open(44100,SDL.AudioFormat.S16LSB,2,4096)<br /> var musica2= new SDLMixer.Music ("/home/gontzal/Mahaigaina/ZOOM0009.MP3")<br /> musica2.play(1)<br /> <br /> <b> archivo= new SDL.RWops.from_file ("/home/gontzal/Mahaigaina/boing.ogg","rb")<br /> sonido= new SDLMixer.Chunk.WAV (archivo,-1)<br /> canal.play(sonido,0)<br /> </b> <br /> while fin == false<br /> event: SDL.Event<br /> while (Event.poll (out event))== 1<br /> if event.type ==SDL.EventType.QUIT<br /> print "adios"<br /> fin= true<br /> break<br /> else if event.type == EventType.KEYDOWN<br /> if event.key.keysym.sym == KeySymbol.ESCAPE <br /> fin=true<br /> break<br /> if event.key.keysym.sym == KeySymbol.UP <br /> canal.play(sonido,0)<br /> break<br /> <br /> SDL.quit()</span></span><br />
<br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"><span style="font-size: x-small;"> </span><span style="font-size: large;"><span style="color: black; font-family: Times,"Times New Roman",serif;">No olvidemos que valac necesita las siguientes opciones para poner la música:</span></span></span><br />
<br />
<b style="color: blue;">$ valac --pkg sdl --pkg sdl-mixer -X -lSDL_mixer misonido.gs --Xcc=-I/usr/include/SDL</b><span style="color: blue; font-family: "Courier New",Courier,monospace;"> </span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"><br /></span>
<br />
<div style="color: #b45f06;">
<b>Si quereís consultar los comandos de Genie + SDL no dudeís en consultar <a href="http://valadoc.org/#%21api=sdl/SDL" target="_blank">Valadoc en la sección de SDL</a>.
Alli encontrareis los primos SDLGraphics, Mixer, Image, Net,etc. Para
buscar comandos en Valadoc se inserta la palabra clave SDL en el
buscador superior izquierdo y hay se va desplegando la ayuda.</b></div>
<br />Gontzal Uriartehttp://www.blogger.com/profile/12210198332710363093noreply@blogger.com0tag:blogger.com,1999:blog-1603029253526355243.post-672528676612539662012-07-03T17:13:00.000-07:002012-07-24T16:12:28.059-07:00Listas Esto es una lista dinámica. La diferencia entre una lista y un array es que la lista puede aumentar de items y en cambio un array tiene un número de items prefijados.<br />
Los metodos que aquí se expresan son:<br />
.add .insert y remove_at cuyo funcionamiento es sencillo.<br />
<br />
Se puede asignar un valor a una posición como lista[2]="10"<br />
o imprimir un valor de la lista.<br />
Para recorrer la lista podemos hacer un foreach de vala. For i in lista. Que <span style="background-color: white;">quiere decir que metá de uno en uno todos los valores de la lista en i.</span><br />
<div style="background-color: white; color: blue;">
<br /></div>
<div style="color: blue;">
<b><span style="background-color: white; color: blue;">$ valac --pkg gee-1.0 listas.gs</span></b></div>
<br />
Hasta otra.<br />
<br />
<pre style="color: blue; font-family: "Courier New",Courier,monospace;"><div>
<b>[indent=4]
i:string
init
var lista = new list of string
lista.add ("1");
lista.add ("2");
lista.add ("5");
lista.add ("4");
lista.insert (2, "3");
lista.remove_at (3)
for i in lista
print i
lista[2] = "10"
stdout.printf ("%s\n", lista[2])</b></div>
</pre>
<div style="color: blue; font-family: "Courier New",Courier,monospace;">
<br /></div>
<br />
<div id="iframeDivb17b05dc-0166-49c4-bc6f-ddc6a7c41bd2" style="display: none; margin: 0px;">
<iframe frameborder="0" id="iframeb17b05dc-0166-49c4-bc6f-ddc6a7c41bd2" src="http://www.blogtrog.com/code.aspx?id=b17b05dc-0166-49c4-bc6f-ddc6a7c41bd2" style="border: 1px solid #e0e0e0; height: 300px; margin: 0px; width: 600px;"></iframe></div>Gontzal Uriartehttp://www.blogger.com/profile/12210198332710363093noreply@blogger.com11tag:blogger.com,1999:blog-1603029253526355243.post-34023417015185195722012-07-03T16:23:00.001-07:002012-08-30T02:43:00.585-07:00SDLMixer música de fondoVamos a poner una música de fondo a nuestros juegos.<br />
<div style="color: blue; font-family: "Courier New",Courier,monospace;">
<br /></div>
<div style="color: blue; font-family: "Courier New",Courier,monospace;">
[indent=4]</div>
<span style="color: blue; font-family: "Courier New",Courier,monospace;">uses SDL</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">uses SDLMixer</span><br />
<br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">screen: unowned SDL.Screen</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">alto: int16=400</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">ancho:int16 =800</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">a: int=0</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">fin:bool=false</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">musica2: SDLMixer.Music </span><br />
<br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">init</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> </span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> SDL.init()</span><span style="color: blue; font-family: "Courier New",Courier,monospace;"> </span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> screen = SDL.Screen.set_video_mode (ancho, alto,15, SurfaceFlag.FULLSCREEN| SurfaceFlag.DOUBLEBUF | SurfaceFlag.HWACCEL | SurfaceFlag.HWSURFACE)</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> a= SDLMixer.open(44100,SDL.AudioFormat.S16LSB,2,4096)</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> var musica2= new SDLMixer.Music ("musica.ogg") </span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> musica2.play(1)</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> </span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> while fin == false</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> event: SDL.Event</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> while (Event.poll (out event))== 1</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> if event.type ==SDL.EventType.QUIT</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> print "adios"</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> fin= true</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> break</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> else if event.type == EventType.KEYDOWN</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> fin=true</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> break</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> SDL.quit()</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> </span><br />
para compilar este juego necesitaremos la siguiente linea de comandos en el terminal.<br />
<br />
<b style="color: blue;">$ valac --pkg sdl --pkg sdl-mixer -X -lSDL_mixer mimusica.gs --Xcc=-I/usr/include/SDL</b><br />
<br />
Estos son los principales comandos para hacer que la música de fondo funcione.<br />
<br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> a= SDLMixer.open(44100,SDL.AudioFormat.S16LSB,2,4096)</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> var musica2= new SDLMixer.Music ("musica.ogg") </span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> musica2.play(1)</span><br />
<br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"></span><br />
De todos modos, para ver más opciones de SDLMixer dirigirse a Valadoc.org.<br />
<br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"></span><br />
Todos aquellos que esteis familiarizados con sdl en C esto es muy parecido. Quizá el nombre de los métodos es un poco diferente, pero nada que nos ponga nerviosos/as. <br />
<br />
<div style="color: #b45f06;">
<b>Si quereís consultar los comandos de Genie + SDL no dudeis en consultar <a href="http://valadoc.org/#%21api=sdl/SDL" target="_blank">Valadoc en la sección de SDL</a>.
Alli encontrareis los primos SDLGraphics, Mixer, Image, Net,etc. Para
buscar comandos en Valadoc se inserta la palabra clave SDL en el
buscador superior izquierdo y hay se va desplegando la ayuda.</b></div>
<br />
Animo.<br />
<br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"></span><br />
<br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"></span>Gontzal Uriartehttp://www.blogger.com/profile/12210198332710363093noreply@blogger.com0tag:blogger.com,1999:blog-1603029253526355243.post-27039357621705508992012-07-03T10:46:00.001-07:002012-08-30T02:44:01.075-07:00Seguimos con la implementación para juegos SDL para Genie. Ahora en vez de mostrar una pelotita creada con la librería de gráficos. Vamos a mostrar un archivo gráfico con la librería SLDImage<br />
<br />
Atentos a la orden de compilación puesto que tendremos que poner los nombres de las librerias.<br />
<br />
<b style="color: blue;">$ valac --pkg sdl --pkg sdl-mixer --pkg sdl-gfx --pkg sdl-image -X -lSDL_gfx -X -lSDL_image "SDL1.gs" --Xcc=-I/usr/include/SDL</b><br />
<br />
Este es el código para introducir una imagen desde un archivo PNG.<br />
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtcOQgHQ3Txzw0z-IBT_42wqxq23fI7UzJJcOZAz07i4hS0ec13NOoTAVS85E0KWvU28SxuY7keSiqIqpX4mDH6XOELUNP65NHVvCcp-vcbdLfwBnwI2j8O4zWCF7h8kMSZ91jTMaEFw/s1600/boy.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtcOQgHQ3Txzw0z-IBT_42wqxq23fI7UzJJcOZAz07i4hS0ec13NOoTAVS85E0KWvU28SxuY7keSiqIqpX4mDH6XOELUNP65NHVvCcp-vcbdLfwBnwI2j8O4zWCF7h8kMSZ91jTMaEFw/s1600/boy.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">boy.png</td></tr>
</tbody></table>
<br />
<br />
Puedes copiar este y llamarlo boy.png dejandolo en la misma carpeta del programa.<br />
<br />
<br />
<div style="color: blue; font-family: "Courier New",Courier,monospace;">
<a href="http://www.blogger.com/goog_495727532"><br /></a></div>
<div style="color: blue; font-family: "Courier New",Courier,monospace;">
<a href="http://www.blogger.com/goog_495727532">[indent=4]</a></div>
<span style="color: blue; font-family: "Courier New",Courier,monospace;">uses SDL</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">uses SDLGraphics</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">uses SDLImage</span><span style="color: blue; font-family: "Courier New",Courier,monospace;"></span><br />
<br style="color: blue; font-family: "Courier New",Courier,monospace;" />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">screen: unowned SDL.Screen</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">alto: int16=400</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">ancho:int16 =800</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">imagen: SDL.Surface</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">sr:Rect</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">dr:Rect</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">a: int=0</span><br />
<br style="color: blue; font-family: "Courier New",Courier,monospace;" />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">init</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> </span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> SDL.init()</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> </span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> screen = SDL.Screen.set_video_mode (ancho, alto,15, SurfaceFlag.FULLSCREEN| SurfaceFlag.DOUBLEBUF | SurfaceFlag.HWACCEL | SurfaceFlag.HWSURFACE)</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> </span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> var fin = false</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> var y=110</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> var x=100</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> var mov_x=2</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> var mov_y=2</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> var old_x=0</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> var old_y=0</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> </span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> </span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> sr.x = 0</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> sr.y = 0</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> sr.w = 50</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> sr.h = 50</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> </span><br />
<br style="color: blue; font-family: "Courier New",Courier,monospace;" />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> dr.x = 30</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> dr.y = 30</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> dr.w = sr.w;</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> dr.h = sr.h;</span><br />
<br style="color: blue; font-family: "Courier New",Courier,monospace;" />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> </span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> imagen = SDLImage.load ("/home/gontzal/Mahaigaina/boy.png")</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> while fin == false</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> event: SDL.Event</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> while (Event.poll (out event))== 1</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> if event.type ==SDL.EventType.QUIT</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> print "adios"</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> fin= true</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> break</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> else if event.type == EventType.KEYDOWN</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> fin=true</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> break</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> </span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> if x>ancho-50 do mov_x=-mov_x</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> if x<0 do mov_x=-mov_x</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> if y>alto-50 do mov_y=-mov_y</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> if y<0 do mov_y=-mov_y</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> </span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> </span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> x=x+mov_x</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> y=y+mov_y</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> old_x=dr.x</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> old_y=dr.y</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> </span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> dr.x=x</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> dr.y=y</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> </span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> Rectangle.fill_color(screen,old_x-20, old_y-20,old_x+60, old_y+60,0355)</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> imagen.blit(sr,screen,dr)</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> screen.flip()</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> </span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> SDL.quit()</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> </span> <br />
<br />
<br />
<br />
<br />
<br />
<br />
Basicamente es el mismo ejemplo que el anterior código pero va rellenando de color de negro el anterior cuadro ocupado por la imagen, para así borrar las huellas. <br />
<br />
Explico los pasos para mostrar una imagen:<br />
<br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">imagen: SDL.Surface</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">sr:Rect</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">dr:Rect</span><br />
<br style="color: blue; font-family: "Courier New",Courier,monospace;" />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"></span><br />
Defino imagen como Objeto surface puesto que asi se debe declarar las imagenes de SDL. En cuanto a Rect es un objeto rectangular para el control de imagenes y choques o colisiones de SDL. Las coordenadas del objeto se definen con dr. y sr son las coordenadas dentro del hueco de la imagen.<br />
<br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">imagen = SDLImage.load ("/home/gontzal/Mahaigaina/boy.png")</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"></span><br />
<br />
cargamos la imagen con load y la imprimimos en pantalla con:<br />
<br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">imagen.blit(sr,screen,dr)</span><br />
<br />
si cambio el valor de dr la imagen se moverá, sin embargo habrá que eliminar la anterior imagen. Es decir que tendremos antes que borrar toda la pantalla o el lugar específico que ha cambiado.<br />
<br />
<div style="color: #b45f06;">
<b>Si quereis consultar los comandos de Genie + SDL no dudeis en consultar <a href="http://valadoc.org/#%21api=sdl/SDL" target="_blank">Valadoc en la sección de SDL</a>.
Alli encontrareis los primos SDLGraphics, Mixer, Image, Net,etc. Para
buscar comandos en Valadoc se inserta la palabra clave SDL en el
buscador superior izquierdo y hay se va desplegando la ayuda.</b></div>
<br />
<br />
<br />
<br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"></span><br />
<br style="color: blue; font-family: "Courier New",Courier,monospace;" />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"></span>Gontzal Uriartehttp://www.blogger.com/profile/12210198332710363093noreply@blogger.com0tag:blogger.com,1999:blog-1603029253526355243.post-26299866384663182662012-06-29T17:04:00.001-07:002012-08-30T02:43:23.977-07:00Genie y SDL un tandem de miedo<br />
Genie no solo se puede ejecutar con una inteface como GTK también acepta otras como SDL que es un conocido motor de juegos en 2 dimensiones. Existen también la posibilidad de usar Cairo de GTK.<br />
Este es un ejemplo de como Genie puede ayudarnos a hacer nuestros juegos. En cuanto a las posibilidades, sencillez y velocidad no hay nada comparado a vala. Realizar juegos con pygame es sencillo, con Genie también. ¿La diferencia? Tarde o temprano Python y Pygame te resultaran leeeeeeennnnnttooooooosssssss.<br />
<br />
Una pelotita rebota por la pantalla es un buen puerto para zarpar con SDL como bandera y Genie como navío. Descubran nuevos mundos!!!!<br />
<div style="color: #b45f06;">
<br /></div>
<div style="color: #b45f06;">
<b>Si quereís consultar los comandos de Genie + SDL no dudeis en consultar <a href="http://valadoc.org/#%21api=sdl/SDL" target="_blank">Valadoc en la sección de SDL</a>. Alli encontrareis los primos SDLGraphics, Mixer, Image, Net,etc. Para buscar comandos en Valadoc se inserta la palabra clave SDL en el buscador superior izquierdo y hay se va desplegando la ayuda.</b></div>
<br />
Para compilar este juego no olvideis que se necesitan instalar las librerias de SDL y SDL graphics para C.<br />
<br />
<br />
<div style="color: red; font-family: "Courier New",Courier,monospace;">
$ sudo apt-get install libsdl1.2-dev</div>
<div style="color: red; font-family: "Courier New",Courier,monospace;">
$ sudo apt-get install libsdl-gfx1.2-4</div>
<br />
<br />
valac --pkg sdl --pkg sdl-gfx -X -lSDL_gfx juego_pelotita.gs<br />
<br />
<br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">[indent=4]</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">uses SDL</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">uses SDLGraphics</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">screen: unowned SDL.Screen</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">alto: int16=400</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">ancho:int16 =600</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;">init </span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> SDL.init(InitFlag.VIDEO)</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> screen = SDL.Screen.set_video_mode (ancho, alto, 30, SurfaceFlag.FULLSCREEN | SurfaceFlag.DOUBLEBUF | SurfaceFlag.HWACCEL | SurfaceFlag.HWSURFACE)</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> var fin = false</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> var y=110</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> var x=100</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> var radius=10</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> var color=1003232242</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> var mov_x=1</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> var mov_y=3</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> while fin == false</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> event: SDL.Event</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> while (Event.poll (out event))== 1</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> if event.type ==SDL.EventType.QUIT</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> print "adios"</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> fin= true</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> break</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> else if event.type == EventType.KEYDOWN</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> fin=true</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> break</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> </span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> if x>ancho do mov_x=-mov_x</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> if x<0 do mov_x=-mov_x</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> if y>alto do mov_y=-mov_y</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> if y<0 do mov_y=-mov_y</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> x=x+mov_x</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> y=y+mov_y</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> </span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> </span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> Circle.fill_color (screen, x, y, radius, color);</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> Circle.outline_color_aa (screen, x, y, radius, color);</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> Rectangle.fill_color(screen,0, 0,ancho, alto,1801222)</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> screen.flip()</span><br />
<span style="color: blue; font-family: "Courier New",Courier,monospace;"> SDL.quit()</span><br />
<br />Gontzal Uriartehttp://www.blogger.com/profile/12210198332710363093noreply@blogger.com4tag:blogger.com,1999:blog-1603029253526355243.post-22050290182153797662012-06-27T13:40:00.002-07:002012-07-25T00:51:23.130-07:00Variables de clase<div style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">
<span style="font-size: small;">Este código me ha funcionado de chiripa, pero me he alegrado mucho puesto que ya no sabía como declarar variables para toda la clase. He creido entender un poco como se pueden definir estas variables. Como podemos ver texto1,boton1,contador y el contenedor vbox son declaradas como variables de la clase cuando se declaran antes que init y a su mismo nivel de identación. La variable contador ahora pertenece a toda la clase Ventana y por lo tanto puede ser usada desde cualquier parte inclusive desde una función como "contador", "self.contador" o también "this.contador".</span><br />
</div>
<div style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">
<span style="font-size: small;">Se puede ver un ejemplo de conversión de numero a cadena de caracteres: de modo que un numero declarado como int (es decir entero del inglés Integer) lo podemos convertir a cadena añadiendo .to_string().</span><br />
</div>
<div style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">
<span style="font-size: small;">Por otro lado podemos ver un ejemplo de Entry que es un cuadro para la introducción de texto. Este cuadro tiene múltiples metodos y propiedades. Yo en este ejemplo he usado el set_text () y el get_text. Muy sencillo. Set text sirve para introducir texto dentro y get text para obtener el texto escrito en el.</span><br />
<br />
<span style="font-size: small;">En cuanto a los contenedores VBox y HBox. Es la forma que GTK usa para ordenar nuestros controles(botones,Entrys,labels) dentro de la ventana. En este caso he elegido un VBox y lo que consigo es que los controles se introduzcan verticalmente. Atención también podemos introducir un control vertical sobre un control horizontal y viceversa. Lo cual nos da inmensas posibilidades para construir una ventana a nuestro gusto. Si bien todavía no he probado un IDE con un constructor de ventanas integrado para Genie. Pero quizás ya exista alguno como Glade o Code Bloks que sirva para Genie. No lo se. La verdad es que desde la programación con Python no utilizo este tipo de herramientas y me las ingenio creandolo desde el mismo codigo.</span></div>
<div style="font-family: "Helvetica Neue",Arial,Helvetica,sans-serif;">
<span style="font-size: small;"><br /></span></div>
Para compilarlo en Geany introducir esto en las opciones del builder: <b style="color: red;"><span style="font-family: 'Courier New',Courier,monospace;"> </span></b><br />
<b style="color: red;"><span style="font-family: 'Courier New',Courier,monospace;">$ valac --pkg gtk+-2.0 "%f" </span></b><br />
Aquí tenemos el código dichoso:<br />
<div style="color: blue; font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"><br /></span></div>
<div style="color: blue;">
<b style="font-family: "Courier New",Courier,monospace;"><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;">[indent=4]</span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><br /></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;">uses</span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><br /></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> Gtk</span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><br /></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;">init</span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><br /></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> Gtk.init (ref args)</span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><br /></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> var test = new Ventana ()</span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><br /></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> test.show_all ()</span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><br /></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> Gtk.main ();</span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> </span></b><br />
<b style="font-family: "Courier New",Courier,monospace;"><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> </span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><br /></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;">class Ventana : Window</span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><br /></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> texto1: Gtk.Entry = new Gtk.Entry</span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><br /></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> boton1: Button= new Button.with_label ("Pulsa este botón")</span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><br /></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> contador: int = 0</span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><br /></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> vbox : VBox = new VBox (true, 5)</span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><br /></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> </span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><br /></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> init</span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><br /></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> title = "Ventana de prueba"</span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><br /></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> default_height = 360</span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><br /></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> default_width = 560</span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><br /></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> window_position = WindowPosition.CENTER</span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><br /></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> texto1.set_text ("hola")</span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><br /></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> boton1.clicked.connect (pulsado)</span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><br /></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> destroy.connect(Gtk.main_quit)</span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><br /></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> vbox.add (boton1)</span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><br /></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> vbox.add(texto1)</span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><br /></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> add (vbox)</span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><br /></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> </span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> </span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><br /></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> def pulsado (btn : Button)</span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><br /></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> this.contador++</span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><br /></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> title = contador.to_string()</span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><br /></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> btn.label = "El botón ha sido pulsado"</span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"><br /></span><span style="font-family: "Courier New",Courier,monospace; font-size: x-small;"> texto1.set_text (texto1.get_text()+ "_ "+contador.to_string())</span></b><br />
<br />
<br />
</div>Gontzal Uriartehttp://www.blogger.com/profile/12210198332710363093noreply@blogger.com0tag:blogger.com,1999:blog-1603029253526355243.post-34544264688924388312012-06-26T13:26:00.003-07:002012-07-27T04:00:49.672-07:00GTK+Implementando GTK+ con Genie<br />
<br />
<br />
Para que nuestros programas se vean integrados en el escritorio y no en el terminal necesitamos usar las librerias GTK: Ventanas, botones, etiquetas, controles de texto,etc.<br />
<br />
Este sería el primer ejemplo, pero atención para compilarlo necesitamos esta instrucción: <span style="color: red;">valac --pkg gtk+-2.0 "%f" </span>dentro de las opciones del buider del IDE Geany o desde el terminal <span style="color: red;">valac --pkg gtk+-2.0 nombre_archivo.gs</span>. Es necesario que tengamos la librería de desarrollo instalada:<br />
<br />
<div style="color: red;">
$ sudo apt-get install gtk+-2.0</div>
<br />
En nuestro Geany escribiremos este codigo:<br />
<br />
<b style="color: purple;"><span style="font-family: "Courier New",Courier,monospace;">[indent=4]</span></b><br />
<b style="color: purple;"><span style="font-family: "Courier New",Courier,monospace;">// usa la libreria gtk </span></b><br />
<b style="color: purple;"><span style="font-family: "Courier New",Courier,monospace;">uses </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> Gtk</span></b><br />
<b style="color: purple;">// comienza la parte principal del programa<br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">init</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> Gtk.init (ref args) // inicializa gtk</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> var prueba = new ventana () // crea el objeto prueba</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> prueba.show_all () // muestra todo</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> Gtk.main (); // comienza con el loop</span><br style="font-family: "Courier New",Courier,monospace;" /><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;">class ventana : Window // Crea una clase de ventana</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> init</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> title = "Ventana de prueba" // escribe el titulo</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> default_height = 250 // anchura</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> default_width = 250 // altura</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> window_position = WindowPosition.CENTER // posición</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> </span></b><br />
<b style="color: purple;"><span style="font-family: "Courier New",Courier,monospace;"> // creamos un boton con la siguiente etiqueta</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> var button = new Button.with_label ("Pulsa este botón")</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> // Une el evento de clic de raton con la funcion pulsado</span></b><br />
<b style="color: purple;"><span style="font-family: "Courier New",Courier,monospace;"> button.clicked.connect (pulsado)</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> </span></b><br />
<b style="color: purple;"><span style="font-family: "Courier New",Courier,monospace;"> // si pulsamos la x de la barra saldrá del loop</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> destroy.connect(Gtk.main_quit)</span></b><br />
<b style="color: purple;"><span style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"></span><span style="font-family: "Courier New",Courier,monospace;"> // añade el boton a la ventana </span></b><br />
<b style="color: purple;"><span style="font-family: "Courier New",Courier,monospace;"> add(button)</span><br style="font-family: "Courier New",Courier,monospace;" /><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> def pulsado (btn : Button)</span></b><br />
<b style="color: purple;"> // si se pulsa realiza algunos cambios.<br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> title = "Hola, Mundo"</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> btn.label = "El botón ha sido pulsado"</span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"> </span><br style="font-family: "Courier New",Courier,monospace;" /><span style="font-family: "Courier New",Courier,monospace;"></span></b> <br />
<br />
<br />
<br />
<br />
<br />Gontzal Uriartehttp://www.blogger.com/profile/12210198332710363093noreply@blogger.com3tag:blogger.com,1999:blog-1603029253526355243.post-20736289214987341192012-06-26T10:40:00.001-07:002012-08-28T05:30:21.034-07:00Variables, Clases y Métodos<br />
Las variables son como cajitas donde metemos datos. Sin embargo, hay diferentes tipos de cajitas, en algunas caben números, en otras letras, en otras objetos... Veamos algunas de las más usadas y como se inicializan.<br />
<br />
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"><span style="color: blue;">numero : int // para números enteros pos y negativos / uint para solo positivos</span></span></div>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"><span style="color: blue;">decimal : float // para numeros decimales, para grandes números double.</span></span></div>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"><span style="color: blue;">cadena : string // para cadenas de caracteres y usaremos " "</span></span></div>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"><span style="color: blue;">caracter: char // un solo caracter y usaremos ' ' . uchar 0-255 caracteres?</span></span></div>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"><span style="color: blue;">u_caracter: unichar // Es un offset o carácter unicode</span></span></div>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"><span style="color: blue;">boleano : bool // para guardar datos lógicos --> true, false</span></span></div>
<span style="color: blue;"><br /><span style="color: black;">Se pueden declarar también así.</span></span><br />
<span style="color: blue;"><br /></span>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"><span style="color: blue;">var i=0 // se sobreentenderá que es int</span></span></div>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"><span style="color: blue;">var o= "hola" // o será string</span></span></div>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"><span style="color: blue;">var </span></span></div>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"><span style="color: blue;"> a ="hola"</span></span></div>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"><span style="color: blue;"> b= "adios"</span></span></div>
<span style="color: blue;"><br /></span>
<span style="color: blue;"><br /></span>
<div style="color: black;">
Declarar variables como objetos.</div>
<span style="color: blue;"><br /></span>
<div style="font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"><span style="color: blue;">a: Gtk.TextView // la variable a contendrá el tipo de objetos Textview.</span></span></div>
<div style="background-color: white; font-family: "Courier New",Courier,monospace;">
<span style="color: blue;"><br /></span></div>
<div style="background-color: white;">
<span style="color: blue;"><br /><span style="color: black;">¿Qué son los objetos?</span></span></div>
<span style="color: blue;"><br /></span>
<span style="color: blue;"></span>Los objetos y clases se pueden explicar a través del típico ejemplo del coche. Un coche es una clase. Este coche tiene unas características y unas funcionalidades. Ser de color rojo es una característica que además es variable puesto que puedo cambiar el color. Y también tiene unas funciones o metodos, por ejemplo la función de arranque, frenado, embragado, abertura de puertas....<br />
<br />
Una ventana que se abre en nuestra pantalla es como un coche, es un objeto que tiene sus propias caracteristicas (color, titulo, ) y también tiene unos (botones) que cumplen ciertas funciones. A todo esto también podemos añadir, que las ventanas de nuestra pantalla producen eventos.<br />
<br />
¿Que es un evento? Un evento es cuando algo sucede, cuando el ratón hace click en un botón, cuando la ventana se abre, cuando la ventana se cierra, cuando el usuario ha introducido una palabra en un cuadro de texto, etc. <br />
<br />
Resumiendo (sin eventos) y traduciendo a lengua Genie de un modo sencillo:<br />
<br />
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<b><span style="font-size: x-small;">[indent =4]<br /><br />init<br /> var mi_coche = new Coche () // creamos nuestro coche<br /> print mi_coche.color // vemos su color <br /> print "velocidad = %i " ,mi_coche.velocidad // observamos su velocidad<br /> mi_coche.arrancar() // Arrancamos el coche<br /> print "velocidad = %i " ,mi_coche.velocidad // La velocidad ha cambiado.<br /><br />class Coche : Object</span></b></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<b><br /></b></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<b><span style="font-size: x-small;"> // Propiedades variables de los coches</span></b></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<b><span style="font-size: x-small;"><br /> prop color: string ="negro"<br /> prop velocidad: int =0 </span></b></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<b><br /></b></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<b><br /></b></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<b><span style="font-size: x-small;"> // Este es método, es decir una funcionalidad del coche<br /> </span></b></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<b><span style="font-size: x-small;"> def arrancar() <br /> velocidad=10<br /> print "coche en funcionamiento"</span></b></div>
<b><br /></b>
<br />
Podríamos crear una clase donde el coche nos podría responder si esta en movimiento o no.<br />
<br />
<br />
<br />
<br />
<br />
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<b><span style="font-size: x-small;">[indent =4]<br />
<br />
init<br style="color: purple;" /><span style="color: purple;">
var mi_coche = new Coche () // creamos mi coche</span><br style="color: purple;" /><span style="color: purple;">
print "%s",mi_coche.estado // la funcion estado devuelve una cadena </span><br style="color: purple;" /><span style="color: purple;">
mi_coche.arrancar() // Arrancamos el coche</span><br style="color: purple;" /><span style="color: purple;">
</span></span><span style="color: purple; font-size: x-small;">print "%s",mi_coche.estado </span><span style="color: purple; font-size: x-small;"> // Esto devuelve una cadena que imprimimos</span></b></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<br />
<b><span style="font-size: x-small;">
class Coche : Object</span></b></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<b><br /></b></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<b><span style="font-size: x-small;"> // Propiedades variables de los coches</span></b></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<b><span style="font-size: x-small;"><br />
prop color: string ="negro"<br />
prop velocidad: int =0 </span></b></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<b><br /></b></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<b><br /></b></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<b><span style="font-size: x-small;"> // Esta es una funcionalidad del coche<br />
</span></b></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<b><span style="font-size: x-small;"> def arrancar() <br />
velocidad=10<br />
print "coche en funcionamiento"</span></b></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<b><br /></b></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<b><span style="font-size: x-small;"> // Esta es un método de devuelve una cadena de caracteres</span></b></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<b><span style="font-size: x-small;"> // Es decir mi_coche.estado se convierte literalmente en un String</span></b></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<b><span style="font-size: x-small;"> // que es devuelto con return st</span></b></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<b><span style="font-size: x-small;"><br /></span></b></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<b><span style="font-size: x-small;"><br /></span></b></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<b><span style="font-size: x-small;"> def estado () :string</span></b></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<b><span style="font-size: x-small;"> var st= ""</span></b></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<b><span style="font-size: x-small;"> if velocidad>0</span></b></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<b><span style="font-size: x-small;"> st= "Andando"</span></b></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<b><span style="font-size: x-small;"> else</span></b></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<b><span style="font-size: x-small;"> st= "Parado"</span></b></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<b><span style="font-size: x-small;"> return st</span></b></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<br /></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
</div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<span style="font-size: x-small;"><br /></span></div>
Todavía no hemos hecho ningún evento. Este tema lo realizaremos con la librería GTK que nos servirá para crear ventanas en nuestro escritorio Gnome o Windows.<br />
<br />
Por otro lado hemos visto como manejar una estructura if y else. Que significa que si se cumple algo realice algo y que en caso contrario realice otra cosa.<br />
<br />
<b>Que conste que mientras escribo yo también aprendo.</b> Todo esto lo voy probando y cuando veo que el ensayo no da error lo cuelgo aquí para compartirlo. Aunque yo sepa programar estoy aprendiendo la sintaxis de este lenguaje. Sin embargo pondré las explicaciones para que cualquier iniciado pueda entender lo que hago.<br />
<br />
<br />
<br />
<br />
<br />Gontzal Uriartehttp://www.blogger.com/profile/12210198332710363093noreply@blogger.com0tag:blogger.com,1999:blog-1603029253526355243.post-79628932809120982792012-06-26T05:44:00.003-07:002012-07-26T16:09:05.955-07:00Control de Flujo-1El control del flujo de datos es bastante parecido a Python y Basic, sin embargo no se utilizan los clásicos dos puntos al final del control de flujo. Esto deja más limpio, si cabe a nuestro codigo.<br />
<br />
Para los principiantes el control de flujo es la forma en que los programadores crean bucles que recorren listas de datos o hacen que los programas actuen de un modo u otro según las circunstancias.<br />
<br />
FOR<br />
<br />
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
[indent=4]</div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
// en este ejemplo se imprime hola 10 veces.</div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
init</div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
var </div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
i=0</div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
for i=1 to 10</div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
print "hola"<br />
<br />
//tambien<br />
for var i=1 to 10<br />
print "hola"<br />
<br />
// si queremos recorrer un array o una lista libgee<br />
lst: array of string={"1", "2", "3"}<br />
for i in lst<br />
print i <br />
<br />
</div>
<br />
<br />
IF<br />
<br />
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
[indent=4]</div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
// en este ejemplo se imprime hola cuando i==1, es decir una vez </div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
init</div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
var </div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
i=0</div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
for i=1 to 10</div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
if i==1</div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
print "hola"<br />
<br />
// tambien<br />
<b>if</b> i==9 <b style="color: magenta;">do</b> print "adios"</div>
<br />
<br />
WHILE<br />
<br />
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
[indent=4]</div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
// en este ejemplo se imprime hola 10 veces </div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
init</div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
var </div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
i=0</div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
while i<10 </div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
i=i+1</div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
print "hola"</div>
<br />
<br />
<br />
CASE<br />
<br />
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
[indent=4]</div>
<pre style="color: purple; font-family: "Courier New",Courier,monospace;"> </pre>
<pre style="color: purple; font-family: "Courier New",Courier,monospace;">// en este caso se hace una valoración de la variable s</pre>
<pre style="color: purple; font-family: "Courier New",Courier,monospace;">// Si es invierno entonces imprimirá hace frio</pre>
<pre style="color: purple; font-family: "Courier New",Courier,monospace;"> </pre>
<pre style="color: purple; font-family: "Courier New",Courier,monospace;">init </pre>
<pre style="color: purple; font-family: "Courier New",Courier,monospace;"> var s = "invierno"
case s
when "invierno"
print "hace frío"
when "verano"
print "hace calor"
default
print "templado"</pre>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<br /></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
// notese que el acento no es impreso correctamente.</div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
// para evitar problemas de este tipo sustituir print por </div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
// stdout.printf ("hace frío")</div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
</div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<br /></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
// cuando ninguna de las opciones es coincidente se activa </div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
// default e imprime templado. Esta claro que este codigo</div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
// nunca cambiará si no escribimos algo diferente en la </div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
// declaración de la variable, por ejemplo:</div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
// var s ="primavera" </div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<br /></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<br /></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<br /></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<br /></div>
<div style="color: purple; font-family: "Courier New",Courier,monospace;">
<br /></div>
<br />Gontzal Uriartehttp://www.blogger.com/profile/12210198332710363093noreply@blogger.com0tag:blogger.com,1999:blog-1603029253526355243.post-43380762244048588672012-06-26T04:51:00.004-07:002013-06-17T13:33:23.898-07:00Hola Mundo!!!<br />
<br />
Trabajo con un sistema operativo GNU/Linux y por el momento no estoy interesado en ayudar a nadie a instalar o resolver dudas sobre el funcionamiento de GENIE sobre windows. No es grosería, es pereza. Se qué genie es multiplataforma puesto que funciona hay donde funcione Glib/GTK.<br />
En este sentido estoy tranquilo, y por ahora voy a centrar mis esfuerzos sobre un sistema muy común como UBUNTU 12.04.<br />
<br />
<br />
Instalación de VALAC (compilador para Genie y Vala) en Ubuntu 12.04<br />
<br />
Entramos en el Terminal pulsando Control+Alt+T y escribimos lo que aparece detrás del símbolo dollar:<br />
<br />
<div style="color: blue;">
<b>$ sudo apt-get install valac</b></div>
<br />
Instalamos las librerías necesarias para que algunos de los programas de aquí funcionen:<br />
<br />
1) Librerias para GTK+<br />
<br />
<div style="color: blue;">
<b>$ sudo apt-get install libgtk2.0-dev</b></div>
<br />
2) Librerias para Listas dinámicas<br />
<br />
<div style="color: blue;">
<b>$ sudo apt-get install libgee-dev</b></div>
<br />
3) Instalamos un IDE que funciona con python y también con Vala y Genie. Hay otros, incluso construidos con Vala. Pero<br />
<br />
<div style="color: blue;">
<b>$ sudo apt-get install geany </b></div>
<br />
<br />
<br />
entramos en geany desde el mismo terminal escribiendo:<br />
<br />
<div style="color: blue;">
<b>$ geany</b></div>
<br />
<br />
y raudos podemos empezar a programar nuestro primer hola mundo. Para esto tenemos que tener en cuenta que GENIE es un lenguaje de identación obligatoria como Python y podemos programar con espacios o con tabuladores. Si es con espacios tendrémos que explicarlo, por defecto son tabuladores.<br />
En el IDE geany podemos visualizar los espacios o tabuladores con la opción:<br />
<div style="color: #b45f06;">
View>Editor>Show whitespaces</div>
<div style="color: black;">
<br /></div>
<div style="color: black;">
escribimos lo siguiente pulsando el tabulador antes de print.</div>
<div style="color: purple;">
<br /></div>
<div style="color: purple;">
init </div>
<div style="color: purple;">
print "hola, mundo!" </div>
<div style="color: purple;">
<b><br /></b></div>
<div style="color: purple;">
<span style="color: black;">o también introduciendo en este caso 4 espacios delante de prin</span><span style="color: black;">t</span><span style="color: black;"> </span><br />
<div id="iframeDive1ebb8e9-9587-4ab6-a59d-68a8d8704e6c" style="display: none; margin: 0px;">
<iframe frameborder="0" id="iframee1ebb8e9-9587-4ab6-a59d-68a8d8704e6c" src="http://www.blogtrog.com/code.aspx?id=e1ebb8e9-9587-4ab6-a59d-68a8d8704e6c" style="border: 1px solid #e0e0e0; height: 100px; margin: 0px; width: 600px;"></iframe></div>
<div id="noIframeDive1ebb8e9-9587-4ab6-a59d-68a8d8704e6c" style="display: block; margin: 0px;">
<pre><div>
<span style="color: black;"><span style="color: black;">[indent=</span><span style="color: purple;">4</span><span style="color: black;">]
init
print </span><span style="color: maroon;">"</span><span style="color: maroon;">hola mundo</span><span style="color: maroon;">"</span></span><br />
</div>
</pre>
</div>
<script language="javascript" src="http://www.blogtrog.com/scripts/bt_code.js" type="text/javascript">
</script><script language="javascript" type="text/javascript">
bt_code_init('e1ebb8e9-9587-4ab6-a59d-68a8d8704e6c');
</script><br />
<div style="color: black;">
<span style="color: black;">y guardamos como "hola.gs" en la carpeta principal que generalmente lleva nuestro nombre de usuario.</span></div>
<span style="color: black;">
</span>
<div style="color: black;">
<span style="color: black;">En el terminar podemos escribir:</span></div>
<span style="color: black;">
<div style="color: black;">
<br /></div>
<div style="color: blue;">
$ valac hola.gs </div>
<div style="color: black;">
<br /></div>
<div style="color: black;">
Este comando creará un ejecutable que lo llamaremos del siguiente modo:</div>
<div style="color: black;">
<br /></div>
<div style="color: blue;">
$ ./hola</div>
<div style="color: black;">
<br /></div>
<div style="color: black;">
¿El resultado esta en tu pantalla? Enhorabuena ya eres un genio!!!</div>
<div style="color: black;">
<br /></div>
<div style="color: black;">
Tambien podemos usar genie para compilar (F9) y ejecutar (F5) el codigo.</div>
<br />
Importante: Cuando queramos usar GTK,SDL o Listas Dinámicas necesitaremos introducir más parámetros en el comando Valac, y geany podrá compilar correctamente si le especificamos estos parametros en: <span style="color: red;">Build>Set_Build_Commands</span><br />
<br />
<div style="color: black;">
<br /></div>
<div style="color: black;">
Hasta otra!!!</div>
<div style="color: black;">
<br /></div>
</span></div>
Gontzal Uriartehttp://www.blogger.com/profile/12210198332710363093noreply@blogger.com1