<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>To Game or not to Game &#187; Lua</title>
	<atom:link href="http://www.aserrano.com/category/lua/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.aserrano.com</link>
	<description>Hablando de juegos y de todo un poco</description>
	<lastBuildDate>Tue, 20 Jul 2010 15:10:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Lua: breve tutorial de integración con C++</title>
		<link>http://www.aserrano.com/2009/10/22/lua-breve-tutorial-de-integracion-con-c/</link>
		<comments>http://www.aserrano.com/2009/10/22/lua-breve-tutorial-de-integracion-con-c/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 20:18:23 +0000</pubDate>
		<dc:creator>Antonio Serrano</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Juegos]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Lua]]></category>
		<category><![CDATA[luabind]]></category>

		<guid isPermaLink="false">http://www.aserrano.net/?p=117</guid>
		<description><![CDATA[Para poder acelerar y mejorar los tiempos de desarrollo de tu aplicación C++ tienes la posibilidad de integrar algún lenguaje de script en la misma. Vamos por tanto a ver un breve tutorial de integración Lua, un lenguaje de script con una sintáxis bastante similar a C, y C++. El método más directo es usar [...]]]></description>
			<content:encoded><![CDATA[<p>Para poder acelerar y mejorar los tiempos de desarrollo de tu aplicación C++ tienes la posibilidad de integrar algún lenguaje de script en la misma.</p>
<p>Vamos por tanto a ver un breve tutorial de integración Lua, un lenguaje de script con una sintáxis bastante similar a C, y C++.</p>
<p>El método más directo es usar luabind, una librería que nos va a permitir dicha integración de una manera rápida y sin grandes dolores de cabeza.</p>
<p>Comentar que el tutorial ha sido desarrollado en Ubuntu 9.04. Ubuntu 9.04 viene con el paquete luabind versión 0.7 que es incompatible con lua 5.1, por tanto, deberemos descargar la última versión que a día de hoy es la 0.8.1 y compilarla.</p>
<p>Bajamos la última versión de luabind de <a title="Luabind en sourceforge" href="http://sourceforge.net/projects/luabind/" target="_blank">aquí</a>.</p>
<p>Luabind necesita de las librerías boost. Procedemos a instalarla:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> libboost1.35-dev
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> boost-build</pre></div></div>

<p>Si no estuviera instalada la herramienta de compilación bjam:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> bjam</pre></div></div>

<p>Descomprimimos el paquete de luabind y lo compilamos:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> luabind-0.8.1
&nbsp;
bjam
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">sudo</span> bjam <span style="color: #c20cb9; font-weight: bold;">install</span></pre></div></div>

<p>Luabind nos permite integrar en lua, casi de de forma integra cualquier elemento del lenguaje C++: clases, funciones, operadores, variables, etc.</p>
<p>Veamos como llamar una función desde un script LUA.</p>
<p>Incluimos las cabeceras de lua de la siguiente forma y definimos la función que formará parte de la librería:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">extern</span> <span style="color: #FF0000;">&quot;C&quot;</span> <span style="color: #008000;">&#123;</span>
&nbsp;
<span style="color: #339900;">#include &lt;lua5.1/lua.h&gt;</span>
&nbsp;
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #339900;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #339900;">#include &lt;luabind/luabind.hpp&gt;</span>
&nbsp;
<span style="color: #0000ff;">void</span> sayHelloWorld<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
&nbsp;
<span style="color: #008000;">&#123;</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Hello World<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Añadimos también la función de inicialización de la librería:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">extern</span> <span style="color: #FF0000;">&quot;C&quot;</span> <span style="color: #0000ff;">int</span> init<span style="color: #008000;">&#40;</span>lua_State<span style="color: #000040;">*</span> L<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> luabind<span style="color: #008080;">;</span>
&nbsp;
open<span style="color: #008000;">&#40;</span>L<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
module<span style="color: #008000;">&#40;</span>L<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#91;</span>
def<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;sayHelloWorld&quot;</span>, <span style="color: #000040;">&amp;</span>amp<span style="color: #008080;">;</span>amp<span style="color: #008080;">;</span>amp<span style="color: #008080;">;</span>amp<span style="color: #008080;">;</span>amp<span style="color: #008080;">;</span>amp<span style="color: #008080;">;</span>sayHelloWorld<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>Compilamos la librería:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">gcc</span> -I<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>include -I<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>include<span style="color: #000000; font-weight: bold;">/</span>lua5.1 <span style="color: #660033;">-shared</span> <span style="color: #660033;">-fPIC</span> <span style="color: #660033;">-o</span> sayhello.so sayhello.cpp <span style="color: #660033;">-lluabindd</span> -llua5.1</pre></div></div>

<p>Ya sólo nos quedaría crear un programa en lua para usarlo. Mediante la función &#8220;loadlib&#8221; cargamos la librería y la inicializamos con la función C que hemos creado &#8220;init&#8221;:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;">package.<span style="color: #007788;">loadlib</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">'./sayhello.so'</span>,<span style="color: #FF0000;">'init'</span><span style="color: #008000;">&#41;</span>
&nbsp;
sayHelloWorld<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span></pre></div></div>

<p>De forma análoga podríamos definir clases, estructuras, funciones, operadores sobrecargados, etc.</p>
<p>Veamos un ejemplo más complejo que refleja una clase, un operador de suma y una función para obtener el total:</p>

<div class="wp_syntax"><div class="code"><pre class="lua" style="font-family:monospace;">#include <span style="color: #66cc66;">&lt;</span>luabind<span style="color: #66cc66;">/</span>luabind.hpp<span style="color: #66cc66;">&gt;</span>
#include <span style="color: #66cc66;">&lt;</span>luabind<span style="color: #66cc66;">/</span>operator.hpp<span style="color: #66cc66;">&gt;</span>
&nbsp;
class Prueba
<span style="color: #66cc66;">&#123;</span>
int totalPrice<span style="color: #66cc66;">;</span>
public:
&nbsp;
Prueba<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">&#125;</span>
Prueba<span style="color: #66cc66;">&#40;</span>int nume<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
totalPrice<span style="color: #66cc66;">=</span>nume<span style="color: #66cc66;">;</span>
<span style="color: #66cc66;">&#125;</span>
Prueba operator+<span style="color: #66cc66;">&#40;</span>Prueba op2<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">;</span>
&nbsp;
int getTotal<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #b1b100;">return</span> totalPrice<span style="color: #66cc66;">;</span> <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">;</span>
&nbsp;
Prueba Prueba::operator+<span style="color: #66cc66;">&#40;</span>Prueba op2<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
Prueba temp<span style="color: #66cc66;">;</span>
&nbsp;
temp.totalPrice<span style="color: #66cc66;">=</span>totalPrice+op2.totalPrice<span style="color: #66cc66;">;</span>
&nbsp;
<span style="color: #b1b100;">return</span> temp<span style="color: #66cc66;">;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;
extern <span style="color: #ff0000;">&quot;C&quot;</span> int init<span style="color: #66cc66;">&#40;</span>lua_State<span style="color: #66cc66;">*</span> L<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
&nbsp;
using namespace luabind<span style="color: #66cc66;">;</span>
&nbsp;
open<span style="color: #66cc66;">&#40;</span>L<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">;</span>
module<span style="color: #66cc66;">&#40;</span>L<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#91;</span>
class_<span style="color: #66cc66;">&lt;</span>Prueba<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Prueba&quot;</span><span style="color: #66cc66;">&#41;</span>
.def<span style="color: #66cc66;">&#40;</span>constructor<span style="color: #66cc66;">&lt;</span>const int<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
.def<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;getTotal&quot;</span>,<span style="color: #66cc66;">&amp;</span>amp<span style="color: #66cc66;">;</span>amp<span style="color: #66cc66;">;</span>amp<span style="color: #66cc66;">;</span>amp<span style="color: #66cc66;">;</span>amp<span style="color: #66cc66;">;</span>Prueba::getTotal<span style="color: #66cc66;">&#41;</span>
.def<span style="color: #66cc66;">&#40;</span>self + other<span style="color: #66cc66;">&lt;</span>Prueba<span style="color: #66cc66;">&gt;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">;</span>
<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p>Ya sólo nos queda ejecutarlo con Lua:</p>

<div class="wp_syntax"><div class="code"><pre class="lua" style="font-family:monospace;">Lua 5.1.4  Copyright <span style="color: #66cc66;">&#40;</span>C<span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">1994</span>-<span style="color: #cc66cc;">2008</span> Lua.org, PUC-Rio
package.<span style="color: #b1b100;">loadlib</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;./prueba.so&quot;</span>,<span style="color: #ff0000;">&quot;init&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
a<span style="color: #66cc66;">=</span>Prueba<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">12</span><span style="color: #66cc66;">&#41;</span>
b<span style="color: #66cc66;">=</span>Prueba<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">23</span><span style="color: #66cc66;">&#41;</span>
c<span style="color: #66cc66;">=</span>a+b
<span style="color: #b1b100;">print</span><span style="color: #66cc66;">&#40;</span>c:getTotal<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #cc66cc;">35</span></pre></div></div>



<div class="shr-bookmarks shr-bookmarks-expand shr-bookmarks-center shr-bookmarks-bg-shr">
<ul class="socials">
		<li class="shr-comfeed">
			<a href="http://www.aserrano.com/2009/10/22/lua-breve-tutorial-de-integracion-con-c/feed" rel="nofollow" class="external" title="Subscribe to the comments for this post?">Subscribe to the comments for this post?</a>
		</li>
		<li class="shr-delicious">
			<a href="http://delicious.com/post?url=http://www.aserrano.com/2009/10/22/lua-breve-tutorial-de-integracion-con-c/&amp;title=Lua%3A+breve+tutorial+de+integraci%C3%B3n+con+C%2B%2B+" rel="nofollow" class="external" title="Share this on del.icio.us">Share this on del.icio.us</a>
		</li>
		<li class="shr-digg">
			<a href="http://digg.com/submit?phase=2&amp;url=http://www.aserrano.com/2009/10/22/lua-breve-tutorial-de-integracion-con-c/&amp;title=Lua%3A+breve+tutorial+de+integraci%C3%B3n+con+C%2B%2B+" rel="nofollow" class="external" title="Digg this!">Digg this!</a>
		</li>
		<li class="shr-diigo">
			<a href="http://www.diigo.com/post?url=http://www.aserrano.com/2009/10/22/lua-breve-tutorial-de-integracion-con-c/&amp;title=Lua%3A+breve+tutorial+de+integraci%C3%B3n+con+C%2B%2B+&amp;desc=Para%20poder%20acelerar%20y%20mejorar%20los%20tiempos%20de%20desarrollo%20de%20tu%20aplicaci%C3%B3n%20C%2B%2B%20tienes%20la%20posibilidad%20de%20integrar%20alg%C3%BAn%20lenguaje%20de%20script%20en%20la%20misma.%0D%0A%0D%0AVamos%20por%20tanto%20a%20ver%20un%20breve%20tutorial%20de%20integraci%C3%B3n%20Lua%2C%20un%20lenguaje%20de%20script%20con%20una%20sint%C3%A1xis%20bastante%20similar%20a%20C%2C%20y%20C%2B%2B.%0D%0A%0D%0AEl%20m%C3%A9todo%20m%C3" rel="nofollow" class="external" title="Post this on Diigo">Post this on Diigo</a>
		</li>
		<li class="shr-googlebuzz">
			<a href="http://www.google.com/buzz/post?url=http://www.aserrano.com/2009/10/22/lua-breve-tutorial-de-integracion-con-c/&amp;imageurl=" rel="nofollow" class="external" title="Post on Google Buzz">Post on Google Buzz</a>
		</li>
		<li class="shr-misterwong">
			<a href="http://www.mister-wong.com/addurl/?bm_url=http://www.aserrano.com/2009/10/22/lua-breve-tutorial-de-integracion-con-c/&amp;bm_description=Lua%3A+breve+tutorial+de+integraci%C3%B3n+con+C%2B%2B+&amp;plugin=sexybookmarks" rel="nofollow" class="external" title="Add this to Mister Wong">Add this to Mister Wong</a>
		</li>
		<li class="shr-mixx">
			<a href="http://www.mixx.com/submit?page_url=http://www.aserrano.com/2009/10/22/lua-breve-tutorial-de-integracion-con-c/&amp;title=Lua%3A+breve+tutorial+de+integraci%C3%B3n+con+C%2B%2B+" rel="nofollow" class="external" title="Share this on Mixx">Share this on Mixx</a>
		</li>
		<li class="shr-reddit">
			<a href="http://reddit.com/submit?url=http://www.aserrano.com/2009/10/22/lua-breve-tutorial-de-integracion-con-c/&amp;title=Lua%3A+breve+tutorial+de+integraci%C3%B3n+con+C%2B%2B+" rel="nofollow" class="external" title="Share this on Reddit">Share this on Reddit</a>
		</li>
		<li class="shr-stumbleupon">
			<a href="http://www.stumbleupon.com/submit?url=http://www.aserrano.com/2009/10/22/lua-breve-tutorial-de-integracion-con-c/&amp;title=Lua%3A+breve+tutorial+de+integraci%C3%B3n+con+C%2B%2B+" rel="nofollow" class="external" title="Stumble upon something good? Share it on StumbleUpon">Stumble upon something good? Share it on StumbleUpon</a>
		</li>
		<li class="shr-technorati">
			<a href="http://technorati.com/faves?add=http://www.aserrano.com/2009/10/22/lua-breve-tutorial-de-integracion-con-c/" rel="nofollow" class="external" title="Share this on Technorati">Share this on Technorati</a>
		</li>
		<li class="shr-twitter">
			<a href="http://twitter.com/home?status=Lua%3A+breve+tutorial+de+integraci%C3%B3n+con+C%2B%2B++-+http://b2l.me/7pcak&amp;source=shareaholic" rel="nofollow" class="external" title="Tweet This!">Tweet This!</a>
		</li>
</ul>
<div style="clear:both;"></div>
</div>

]]></content:encoded>
			<wfw:commentRss>http://www.aserrano.com/2009/10/22/lua-breve-tutorial-de-integracion-con-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
