To Game or not to Game

Hablando de juegos y de todo un poco

To Game or not to Game header image 1

Tutorial Ogre3D: Creación de un proyecto paso por paso (y IV)

October 31st, 2009 · 5 Comments

Recientemente google ha baneado mi página, me han bajado el PageRank de 2 a 0 y paulatinamente están bajando mis páginas indexadas.

Lo mejor o peor de la situación es que yo no he hecho nada, así que he decidido que no tengo ganas de seguir peleando ni escribiendo, ¿para qué? nadie lo iba a poder leer de todas formas:

Adjunto el listado del mini frame listener para terminar los artículos, si es que hay alguien que me sigue:

class MyFrameListener: public FrameListener {
 
public:
 
	// ctor/dtor
	MyFrameListener(RenderWindow* win) : mWindow(win){
		OIS::ParamList pl;
		size_t windowHnd = 0;
		std::ostringstream windowHndStr;
 
		m_timeElapsed = 0.0f;
 
		win->getCustomAttribute("WINDOW", &windowHnd);
		windowHndStr << windowHnd;
		pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
 
		mInputManager = OIS::InputManager::createInputSystem(pl);
		mKeyboard
				= static_cast<OIS::Keyboard*> (mInputManager->createInputObject(
						OIS::OISKeyboard, false));
	}
	virtual ~MyFrameListener() {
	}
 
	// We will provide some meat to this method override
	virtual bool frameStarted(const FrameEvent &evt);
 
	// We do not need to provide a body for either of these methods, since
	// Ogre provides a default implementation that does just this. However, for
	// the sake of illustration, we'll provide one here.
	virtual bool frameEnded(const FrameEvent &evt) {
		return true;
	}
	virtual bool processUnbufferedKeyInput(const FrameEvent& evt) {
 
		if(mWindow->isClosed()) return false;
		if (mKeyboard->isKeyDown(OIS::KC_ESCAPE)) //si pulsamos escape salimos de la aplicacion
			return false;
 
		return true;
	}
 
	// Override frameRenderingQueued event to process that (don't care about frameEnded)
	bool frameRenderingQueued(const FrameEvent& evt) {
		mKeyboard->capture();
 
		if( !mKeyboard->buffered() )
			if( processUnbufferedKeyInput(evt) == false )
				return false;
 
		return true;
	}
protected:
	OIS::InputManager* mInputManager;
	OIS::Keyboard* mKeyboard;
	RenderWindow* mWindow;
 
private:
	float m_timeElapsed;
};
 
bool MyFrameListener::frameStarted(const FrameEvent &evt) {
 
	m_timeElapsed += evt.timeSinceLastFrame;
 
}


Ogre3D: Paso a paso III

  • Share/Bookmark

→ 5 CommentsTags: C++ · Desarrollo · Juegos · Motores 3D · Ogre

Tutorial Ogre3D: Creación de un proyecto paso por paso (III)

October 28th, 2009 · 1 Comment

Una vez inicializado Ogre Procederemos a la creación de la ventana y del SceneManager.

Recordemos que el gestor del escenario es un plugin especializado según el tipo de escenario y pueden ser de los siguientes tipos:

  • ST_GENERIC: Escenarios de propósito general
  • ST_EXTERIOR_CLOSE: Escenarios de exteriores de visibilidad media
  • ST_EXTERIOR_FAR: Practicamente no usado
  • ST_EXTERIOR_REAL_FAR: Escenarios de paisajes con grandes terrenos
  • ST_INTERIOR: Escenarios de interior, por ejemplo, edificios.

Veamos ya como crearlo:

mRoot->initialise(true, "Mi Ventana");	
 
RenderWindow* window = mRoot->getAutoCreatedWindow();
SceneManager *sceneMgr = mRoot->createSceneManager(ST_GENERIC);

A continuación crearemos la cámara que nos permitirá ver el escenario desde el ángulo y con la profundidad y distancia que queramos:

Camera* cam = sceneMgr->createCamera("Camara");
cam->setNearClipDistance(5);
cam->setFarClipDistance(1000);
cam->setAspectRatio(Real(1.333333));
 
Viewport* vp = window->addViewport(cam,0);
vp->setBackgroundColour(ColourValue(1, 0, 0));

Hemos definido para la cámara los valores de distincia mínima y máxima y su relación entre el tamaño x e y de la ventana que hemos creado, 800/600.

Además hemos añadido un viewport a la cámara con fondo de color rojo. Podremos tener tantos como queramos pero recuerda que se ordenan mediante el parámetro z-order y sólo puede existir uno por cada valor de z-order. Los viewport definen los rectángulos donde se visualizarán el rendererizado de la cámara.

Crearíamos ahora el listener que se encargará del renderizado de los frames:

MyFrameListener listener(window);
mRoot->addFrameListener(&listener);
mRoot->startRendering();

Es importante crear el listener antes de comenzar el renderizado de la aplicación o se nos colgará.

Ogre3D Paso a paso II
Ogre3D Paso a paso (y IV)

  • Share/Bookmark

→ 1 CommentTags: C++ · Juegos · Linux · Motores 3D · Ogre

Ubuntu 9.10 el día 29

October 27th, 2009 · No Comments

Ya está por llegar ubuntu 9.10

  • Share/Bookmark

→ No CommentsTags: Linux

Tutorial Ogre3D: Creación de un proyecto paso por paso (II)

October 26th, 2009 · No Comments

El primero de los tres parámetros que toma la función es el fichero de configuración de plugins.

Dicho fichero contiene los plugins que el engine 3D Ogre va a cargar en tiempo de ejecución por lo que mi recomendación es la de cargar sólo los que el proyecto vaya a usar.

Veamos el fichero de los ejemplos que vienen con ogre:

# Defines plugins to load
 
# Define plugin folder
PluginFolder=../lib
 
# Define plugins
# Plugin=RenderSystem_Direct3D9
# Plugin=RenderSystem_Direct3D10
 Plugin=RenderSystem_GL
 Plugin=Plugin_ParticleFX
 Plugin=Plugin_BSPSceneManager
 Plugin=Plugin_CgProgramManager
 Plugin=Plugin_PCZSceneManager
 Plugin=Plugin_OctreeZone
 Plugin=Plugin_OctreeSceneManager

Vemos que carga el plugin que gestiona el renderizado OpenGL, el gestor de partículas, y 5 diferentes “Scene manager”, que serán los encargados de visualizar los escenarios y además cada uno está especializado en una forma de hacerlo diferente.

Además la línea pluginfolder indica de que directorios cargará dichos plugins que en este caso serán de la forma de una librería dinámica linux “.so”.

El tercer parámetro es del fichero de log de ogre muy útil para gestionar los posibles fallos de la aplicación que estamos desarrollando.

Si quisiesemos generar nuestro fichero de log sin usar este parámetro podríamos usar el siguiente código incluso antes de la inicialización de Ogre3D:

LogManager* logmanager = new LogManager();
Log* log = LogManager::getSingleton().createLog("logogre.log",true,tru,false);
 
Root* mRoot=new Root("plugins.cfg","ogre.cfg");

Ogre3D Paso a paso I
Ogre3D Paso a paso III

  • Share/Bookmark

→ No CommentsTags: C++ · Desarrollo · Linux · Motores 3D · Ogre

La Unión Europea va a destruir Internet como lo conocemos: movilízate

October 26th, 2009 · No Comments

Vía alt1040

La enmienda 138 que protegía los derechos de los usuarios desaparece para favorecer a las grandes corporaciones el que nos puedan cortar el acceso cuando les venga en gana.

En fin la ley francesa aplicada a Europa.

Si quieres seguir teniendo internet sin que coarten tus libertades, movilízate.

  • Share/Bookmark

→ No CommentsTags: cultura · internet

Cambio de dominio

October 26th, 2009 · No Comments

Pues eso, he actualizado el dominio del blog que pasa de www.aserrano.net
a www.aserrano.com

  • Share/Bookmark

→ No CommentsTags: Linux

Tutorial Ogre3D: Creación de un proyecto paso por paso (I)

October 25th, 2009 · No Comments

Para la creación de un proyecto Ogre3D paso a paso vamos a usar Ubuntu y Codeblocks.

Aunque CodeBlocks tiene un template para crear tu propio proyecto, lo que pretendemos es ver de forma detallada y comprender un poco mejor como hacerlo.

Yo en mi caso he usado una versión de desarrollo de Ogre3D y una versión de desarrollo también de Codeblocks.

Ambas las he bajado y compilado para poder usarlas, pero valdrían perfectamente el SDK, para el ogre, y el codeblocks que viene integrado en ubuntu.

Desde codeblocks creamos un nuevo proyecto de consola, si queréis el clásico Hello World, eliminamos el cout e incluimos las cabeceras de Ogre y su espacio de nombres.

#include <Ogre.h>;
using namespace Ogre;

El primer paso en cualquier proyecto Ogre es la inicialización de las librerías en la forma

 
Root* mRoot=new Root();
Root* mRoot=new Root("ogre.cfg");
Root* mRoot=new Root("ogre.cfg","plugins.cfg");
Root* mRoot=new Root("ogre.cfg","plugins.cfg","ogre.log");
Root* mRoot=new Root("","");

Cualquiera de las anteriores opciones serían perfectamente válidas, aunque yo en mi caso prefiero usar la de tres parámetros para tener una completa perspectiva de cuales son mis ficheros de configuración en uso.

Veamos ahora el contenido del fichero ogre.cfg, que en mi caso lo tengo de la forma siguiente

Render System=OpenGL Rendering Subsystem
 
[OpenGL Rendering Subsystem]
Display Frequency=50 MHz
FSAA=0
Full Screen=No
RTT Preferred Mode=FBO
VSync=No
Video Mode=1024 x  768
sRGB Gamma Conversion=No

Esta configuración siempre la podemos sobreescribir con una llamada al diálogo de configuración de ogre:

 
if(!mRoot->restoreConfig())
{
  mRoot->showConfigDialog();
  mRoot->saveConfig();
}

Ogre3D Paso a paso II

  • Share/Bookmark

→ No CommentsTags: C++ · Desarrollo · Linux · Ogre

Lua: breve tutorial de integración con C++

October 22nd, 2009 · No Comments

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 luabind, una librería que nos va a permitir dicha integración de una manera rápida y sin grandes dolores de cabeza.

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.

Bajamos la última versión de luabind de aquí.

Luabind necesita de las librerías boost. Procedemos a instalarla:

sudo apt-get install libboost1.35-dev
 
sudo apt-get install boost-build

Si no estuviera instalada la herramienta de compilación bjam:

sudo apt-get install bjam

Descomprimimos el paquete de luabind y lo compilamos:

cd luabind-0.8.1
 
bjam
 
sudo bjam install

Luabind nos permite integrar en lua, casi de de forma integra cualquier elemento del lenguaje C++: clases, funciones, operadores, variables, etc.

Veamos como llamar una función desde un script LUA.

Incluimos las cabeceras de lua de la siguiente forma y definimos la función que formará parte de la librería:

extern "C" {
 
#include <lua5.1/lua.h>
 
}
 
#include <stdio.h>
 
#include <luabind/luabind.hpp>
 
void sayHelloWorld()
 
{
 
printf("Hello World\n");
}

Añadimos también la función de inicialización de la librería:

extern "C" int init(lua_State* L)
{
using namespace luabind;
 
open(L);
 
module(L)
[
def("sayHelloWorld", &amp;amp;amp;amp;amp;amp;sayHelloWorld)
];
 
return 0;
}

Compilamos la librería:

gcc -I/usr/local/include -I/usr/include/lua5.1 -shared -fPIC -o sayhello.so sayhello.cpp -lluabindd -llua5.1

Ya sólo nos quedaría crear un programa en lua para usarlo. Mediante la función “loadlib” cargamos la librería y la inicializamos con la función C que hemos creado “init”:

package.loadlib('./sayhello.so','init')
 
sayHelloWorld()

De forma análoga podríamos definir clases, estructuras, funciones, operadores sobrecargados, etc.

Veamos un ejemplo más complejo que refleja una clase, un operador de suma y una función para obtener el total:

#include <luabind/luabind.hpp>
#include <luabind/operator.hpp>
 
class Prueba
{
int totalPrice;
public:
 
Prueba() {}
Prueba(int nume)
{
totalPrice=nume;
}
Prueba operator+(Prueba op2);
 
int getTotal() { return totalPrice; }
};
 
Prueba Prueba::operator+(Prueba op2)
{
Prueba temp;
 
temp.totalPrice=totalPrice+op2.totalPrice;
 
return temp;
}
 
extern "C" int init(lua_State* L)
{
 
using namespace luabind;
 
open(L);
module(L)
[
class_<Prueba>("Prueba")
.def(constructor<const int>())
.def("getTotal",&amp;amp;amp;amp;amp;Prueba::getTotal)
.def(self + other<Prueba>())
];
return 0;
}

Ya sólo nos queda ejecutarlo con Lua:

Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
package.loadlib("./prueba.so","init")()
 
a=Prueba(12)
b=Prueba(23)
c=a+b
print(c:getTotal())
35
  • Share/Bookmark

→ No CommentsTags: C++ · Desarrollo · Juegos · Linux · Lua

Linux: Libre competencia ya

October 17th, 2009 · No Comments

Leía hoy un artículo sobre “¿Por qué fracasan Ubuntu y Linux?“.

En este artículo se insinúa que una posible causa del fracaso de Linux podría ser que le falta un algo especial para triunfar, esa cosa que hace que te fijes en un producto y lo compres.

Seamos serios, yo me voy a comprar un coche y al llegar me dice el vendedor que tengo dos modelos de motores por coche, “ultimamente incluso tres, el híbrido”, diesel y gasolina.

Acto seguido este señor me explica las ventajas de ambos modelos y opto por gasolina si pienso hacer pocos kilómetro o diesel si pienso hacer muchos, pero tengo una elección y un señor me ha explicado las capacidades de uno y de otro y sus precios.

Pasemos a una tienda de ordenadores, ¿quien te vende un ordenador con linux?, nadie, o casi nadie, no existe campaña de marketing de ciento de millones de dolares a favor de linux, y existe una compañía como microsoft impidiendo que grandes compañías vendan ordenadores con linux preinstalados, tema ya bastante sabido, que microsoft incentiva a los fabricantes, e incluso penaliza, para que instalen su sistema operativo….

En el mundo del ordenador personal, el de casa, no la informática empresarial que tan bien conozco, el linux simplemente no existe porque las grandes compañías se han encargado de que desaparezcan.

Linux tiene las mismas capacidades, ya no entro en si es mejor o no, que tienen Windows y tiene Mac OS X y no le falta ningún “nada” especial.

Lo único que le falta a Linux es “LIBRE COMPETENCIA”. No sé a que espera la unión europea para exigir la libre competencia en el sector de los sistemas operativos. Una vez que haya libre competencia se verá si linux triunfa o no, mientras tanto será la lucha de David contra Goliat. Una lucha desigual, demasiado desigual.

  • Share/Bookmark

→ No CommentsTags: Linux

Nissan Qashqai DCI 2.0: vamos, el cascado

October 2nd, 2009 · No Comments

Mi recomendación a día de hoy es NO comprar este coche.

Ya sé, ya sé, estoy seguro de que habrá muchos flamantes conductores del qashqai que estarán muy contentos con su compra, pero la verdad es que a mi me ha tocado la china.

Maldigo la hora en que se me ocurrió comprar ese coche.

Supongo que el coche me lo terminaría de montar el becario de la nissan porque en un año que tiene he terminado en el taller 5 veces.

Al coche cada 3000 o 4000 kms se le enciende una luz de avería genérica que puede servir tanto para una luz fundida como para avisarte de que no tienes agua en el radiador.

En 3 de las veces según orden de la nissan había que reprogramar el procesador del coche porque informaba de una avería en el filtro antiparticulas cuando no era verdad y la cuarta vez, según el taller, para mi que me mintieron, los frenos.

Hoy mismo se me ha encendido una quinta vez y ya el lunes lo llevará a ver que trola me cuentan los ingenieros de formula 1 de canales y lumbreras.

En fin, el coche, no os lo recomiendo, al menos donde yo vivo, porque entre la nissan y el taller no tienen ni idea de que tiene.

Os animo a que deis vuestras opiniones sobre si os ha pasado lo mismo o si por el contrario estáis encantados con el coche, siempre desde la educación y el respeto.

  • Share/Bookmark

→ No CommentsTags: Automoción