RSS

La clase panel en funcionamiento

Pues lo que pretendo hacer una clase compleja, por ahora comienza a funcionar haciendo las cosas que ahora mismo necesito. He tenido que investigar un poco bastante para conseguir convertir las coordenadas x,y de un objeto 3d con x,y,z, osea convertir 3d a coordenadas 2d. Esto lo conseguí implementando lo siguiente:

CODIGO

Ogre::Vector2 result;
const Ogre::AxisAlignedBox& AABB = personaje->getEntity()->getWorldBoundingBox(true);
Ogre::Vector3 point = AABB.getCenter(),point2;
point2 = camara->getProjectionMatrix() * (camara->getViewMatrix() * point);
result.x = (point2.x + 1)*0.5*800;
result.y = 1-(point2.y +1)*0.5*600;
Ogre::String numberx = StringConverter::toString(result.x);
Ogre::String numbery = StringConverter::toString(result.y);
panel1->addText("x:"+numberx+" y:"+numbery);
panel1->actualizar(result.x-80,result.y+540);

Esta parte de código la llamo desde EscenaSimple::bucleprincipal() para que se vaya actualizando en bucle durante la ejecución del juego. Me queda como duda por que para que se coloque correctamente en mi pantalla que tengo como un VIEWPORT DE 800X600 tenga que poner result.x-80 y result.y+540, cuando según los ejemplos con getWorldBoundingBox(true) no es neceario, pero a mí si no lo pongo me sale el OVERLAY muy desplazado del lugar de presentación.

Para que vean el resultado de todo junto clase panel y conversión de coordenadas 3d a 2d para colocar overlay sobre el tanque con información del usuario, os cuelgo un video disfrutenlo como yo lo he disfrutado una vez que lo conseguí. Muchas gracias por seguirme.

 
1 Comment

Publicado por en 27 septiembre, 2011 in Ogre3D, OgreOverlay

 

Etiquetas: , ,

Como trabajan las Clases de c++ con Ogre3D

Buenas tardes a todos.

Me encuentro con un dilema con las clases y el manejo de la información internamente y entre clases, especialmente trabajando con Ogre3D. Todo ha venido al querer implementar una clase que me crea un scroll de texto con un OVERLAY. Intento seguir la misma manera que use por ahora para inicializar la clase con un objeto y trabajar con ello, y destruir al salir, no lo consigo, he conseguido compilar pero no me crea el OVERLAY. Como mi interés es documentar los progresos que hago día a día, voy a intentar rellenar un poco este post.

Primero creo panel.h y panel.cpp, en su formato mas básico intentaré crear un panel overlay desde una clase que iré haciendo crecer para manejar paneles.

PANEL.H
#include <Ogre/Ogre.h>
class panel {
public:

panel(void);
~panel(void);
};<

PANEL.CPP
#include "panel.h"

panel::panel(void)
{
}

panel::~panel(void)
{
}

Pruebo a llamar desde EscenaSimple::EscenaSimple(): AplicacionOgre(“Tank3D v0.1″) a panel(); , compilo y todo va bien. Esto ya es algo mas, ahora en la llamada a panel preparare el OverlayManager lo cargaré etc.

Bien ahora ya despues de pruebzs, tengo la clase panel enmarcha aquí el código como ha quedado. Debajo como la implemento en EscenaSimple.
PANEL.H

#include
#include
#include

class panel : public Ogre::Singleton{
protected:
Ogre::OverlayContainer* mPanel;
Ogre::Overlay* mOverlay;
Ogre::OverlayElement* mTextBox;

public:
panel(void);
~panel(void);
void addText(Ogre::String text);
void actualizar(Ogre::Real x, Ogre::Real y);
};

PANEL.CPP
#include "panel.h"

using namespace Ogre;

template<> panel* Singleton::ms_Singleton = 0;

panel::panel(void)
{
mOverlay = OverlayManager::getSingleton().create("ScrollingOverlay");
mPanel = static_cast(OverlayManager::getSingleton().createOverlayElement("Panel", "container1"));
mPanel->setMetricsMode(GMM_PIXELS);
mPanel->setDimensions(800,600);
mPanel->setPosition(0, 0);
mTextBox = OverlayManager::getSingleton().createOverlayElement("TextArea", "pepe");
mTextBox->setMetricsMode(Ogre::GMM_PIXELS);
mTextBox->setDimensions(20, 5);
mTextBox->setWidth(20);
mTextBox->setHeight(5);
mTextBox->setParameter("font_name", "ubuntu");
mTextBox->setParameter("char_height", "20");
mTextBox->setColour(ColourValue::White);
mPanel->addChild(mTextBox);
mOverlay->add2D(mPanel);
}

void panel::addText(Ogre::String text)
{
mTextBox->setCaption(text);
mOverlay->show();
}

void panel::actualizar(Ogre::Real x, Ogre::Real y)
{
mTextBox->setPosition(x,y);
mOverlay->show();
}

panel::~panel(void)
{
}

En EscenaSimple.h no me olvido de agregar #include “panel.h” para que la clase forme parte de EscenaSimple y al comienzo incluyo class panel; para que panel trabaje con EscenaSimple, aun no tengo muy bien definido el funcionamiento de esta linea, clases amigas etc. Defino panel* panel1; en EscenaSimple.h tanto en crearEscena creo el panel con panel1= new panel; ya se inicializó, accedo a sus funciones que en mi caso son dos addText() y actualizar(). Donde hago..

panel1->addText(“hola”); //Esto me cambia el texto del OverlayText del panel por el que hay entre las comillas.
panel1->actualizar(x,y); //Posiciona el OverlayText en las coordenadas x,y a las que se llama.

Gracias a la función actualizar consigo lo que en el siguiente post voy a mostrar, que es colocar sobre el objeto 3d un panel 2d. Bueno eso será otro post. Hasta luego.

 
Leave a comment

Publicado por en 27 septiembre, 2011 in Ogre3D, OgreOverlay

 

Etiquetas: , , , ,

OgreBullet primeras pruebas.

Otra tarde mas nos encontramos aquí para seguir con nuestro pequeño juego Tank. Como decidí a implementar OgreBullet para la física, me bajé bullet de http://www.bulletphysics.com. En el momento de hacer este post la versión es 2,79, compilo bullet y seguidamente voy al SVN de ogreaddons y me bajo el ogrebullet para así conseguir la última versión. Incluyo aquí el source de la demo que ejecuté para poder estudiar que todo estuviera bién configurado, compruebo que así fué.

-Source bullettest para Visual c++ express 2010

Si quieres que te ayude a compilar el surce o configurar Visual c++ express 2010 comentar. Saludos y buenas tardes.

 

 
4 Comments

Publicado por en 20 septiembre, 2011 in Ogre3D, OgreBullet

 

Etiquetas: , , ,

Mas objetos para Tank

Barril y cajas con blender, como nos ha comentado G.León este fué su primer trabajo en lod low poligon, mapeados con UV. Desde aquí gracias y  seguiré guardando todo celosamente para ir dando cada vez mas vida al proyecto. Gracias. Aprovecho para comunicar desde este post que la música DJ.Lups, genial diskjockey de Mallorca que compone el mismo sus canciones,  el mismo nos va a poner música a las escenas y menu, siguiendo su maravilloso estilo, genial para un juego de guerra con tanques. Gracias a todos IncaIB.

 
Leave a comment

Publicado por en 20 septiembre, 2011 in Ogre3D

 

Etiquetas: , , ,

Mi visión del Espacio 3D

Despues de toda una semana estudiando Clases y formas de implementar CEGUI o MyGUI, me decido por MyGUI, hoy he decidido descansar un poco de ese tema y dedicarme todo el día a practicar posicionamiento y tamaños de los objetos 3D de blender a Ogre3D. Me explico aun tengo algunos problemas para conocer la escala de presentación de los objetos.

Que aventura cuando intento crear un array de Ogre:.Entity para poder colocar diez cubos y comprobar las distancias y la colocación y me dice que no puedo crear array de entity. Entonces me da que pensar y si lo hago por nodo?. Voy a probar Ogre::SceneManager* nodo[10];

Ayer me quedé bloqueado sobre como crear desde un mismo mesh con array Gracias a la ayuda de Mind Calamity.

for (int i = 0; i < (sizeof(entity) / sizeof(entity[0])); i++) // Loop through the entities { // Elemento de array comienza en 0 , agregamos 1, entidad y nodo comienzan en uno :) Ogre::String number = Ogre::StringConverter::toString(i + 1); // Agregar el número de elemento actual al nombre del nodo entidad / escena para evitar confusiones entity[i] = gestorEscena->createEntity("Head " + number, "cubo.mesh");
node[i] = gestorEscena->getRootSceneNode()->createChildSceneNode("Node " + number);
// Distancia de los nodos entre sí, por lo que no se encuentran en el mismo lugar, y luego unirlos
node[i]->setPosition(0 , 0 ,i*2.5);
node[i]->attachObject(entity[i]);
// Dice cuantas entidades se tienen en la pantalla, completamente innecesario
printf("Entidad creada No. %i \n", i);
}

Habiendo conseguido correr este código perfectamente ya tenemos 10 cubos ahora voy a crear la imagen ampliando x,y,z donde es i*2.5 en el código es Z

x node[i]->setPosition(i*2.5 , 0 , 0);

Y node[i]->setPosition(0 , i*2.5 , 0);

Z node[i]->setPosition(0 , 0 ,i*2.5);

Como me propuse aquí muestro la diferencia en poner 10 cubos en x,y,z para así poder verlo con mas claridad. Saludos.

 
Leave a comment

Publicado por en 17 septiembre, 2011 in Ogre3D

 

Etiquetas: ,

Partículas como las integré.

Saludos OgreManiaks, otra tarde mas me siento antes de comenzar con CEGUI, voy a publicar en el blog un vídeo del resultado de aplicar partículas de humo a todo el objeto, com ya saben son pruebas nada es definitivo, cuando esté todo decidido iremos colocando las position y el tema camaras. Aquí os ingreso el vídeo.

 
Leave a comment

Publicado por en 12 septiembre, 2011 in Ogre3D

 

Iphone otra manera de entrenar las neuronas.

Hoy en un momento pensé que tenía unos video MOV en el iphone. Repasando recordé una vez que conecté por SSH el iphone para entrar en el sistema de carpetas, de esto hace ya unos añitos. Decido buscar a ver si hay algo mas sencillo por que SSH es una aventurilla de tutoriales y encuentra el que realmente es bueno para que sea un poco distinto a otros temarios. Acabo de encontrar http://www.gsmspain.com/foros/h841314_Aplicaciones-sistemas-operativos-moviles-iOS_Programa-acceder-carpetas-Iphone-USB.html decido bajármelo y instalarlo para probarlo.Bien recien instalado lo primero que me da es un error diciendo que no tengo instalado ITUNES ánimo a ver si ya despues no pide nada mas, un ratito que lo bajo y lo instalo y sigo contando.

Perfecto he probado la utilidad despues de instalar ITUNES y me fué perfecto, en EQUIPO me ha salido Iphone folder y accedí directamente a todas las carpetas y así pude bajarme los MOV de cycorder sin mas problemas.

 
Leave a comment

Publicado por en 10 septiembre, 2011 in SinCategoría

 

SDL mixer y como conseguí reparar el poner música

Despues de haberse parado todo mi proyecto, ya que no consigo que SDL_mixer me funcione cargando ni OGG ni MP3, he decidido a colocar todo por separado en una aplicación en la que únicamente quiero cargar la música y reproducirla directamente de la misma carpeta donde se ejecute el .exe.

Tengo SDL.h y SDL_Mixer.h colocado en C:/SDL/SDL/include, todo instalado igual que en http://www.libsdl.org/. Preparo visual c++ agrego de incude para DEBUG y RELEASE c:/SDL/SDL/include , recuerdo a poner en vinculador General en la casilla directorio de bibliotecas adicionales de  incluir C:\SDL\SDL\lib; . Seguido incluyo en Entrada Dependencias Adicionales SDL.lib SDL_main.lib y SDL_Mixer.lib. Y para terminar linkeamos SDL.dll SDLMain.dll, Escribo el source que a continuación agrego debajo para ir estudiando el resultado.

#include "SDL.h"
#include "SDL_thread.h"
#include "SDL_mixer.h"

#include
#include
#include
#include

/* set this to any of 512,1024,2048,4096 */
/* the lower it is, the more FPS shown and CPU needed */
#define BUFFER 1024
#define W 640 /* NEVER make this be less than BUFFER! */
#define H 480
#define H2 (H/2)
#define H4 (H/4)
#define Y(sample) (((sample)*H)/4/0x7fff)

Sint16 stream[2][BUFFER*2*2];
int len=BUFFER*2*2, done=0, need_refresh=0, bits=0, which=0,
sample_size=0, position=0, rate=0;
SDL_Surface *s=NULL;
Uint32 flips=0;
Uint32 black,white;
float dy;

/******************************************************************************/
/* some simple exit and error routines */

void errorv(char *str, va_list ap)
{
vfprintf(stderr,str,ap);
fprintf(stderr,”: %s.\n”, SDL_GetError());
}

void cleanExit(char *str,…)
{
va_list ap;
va_start(ap, str);
errorv(str,ap);
va_end(ap);
Mix_CloseAudio();
SDL_Quit();
exit(1);
}

/******************************************************************************/
/* the postmix processor, only copies the stream buffer and indicates */
/* a need for a screen refresh */

static void postmix(void *udata, Uint8 *_stream, int _len)
{
position+=_len/sample_size;
/* fprintf(stderr,”pos=%7.2f seconds \r”,position/(float)rate); */
if(need_refresh)
return;
/* save the stream buffer and indicate that we need a redraw */
len=_len;
memcpy(stream[(which+1)%2],_stream,len>s->w*4?s->w*4:len);
which=(which+1)%2;
need_refresh=1;
}

/******************************************************************************/
/* redraw the wav and reset the need_refresh indicator */

void refresh()
{
int x;
Sint16 *buf;

/*fprintf(stderr,”len=%d \r”,len); */

buf=stream[which];
need_refresh=0;

SDL_LockSurface(s);
/* clear the screen */
/*SDL_FillRect(s,NULL,black); */

/* draw the wav from the saved stream buffer */
for(x=0;x>1, b=x&1 ,t=H4+H2*b;
int y1,h1;
if(buf[x] {
h1=-Y(buf[x]);
y1=t-h1;
}
else
{
y1=t;
h1=Y(buf[x]);
}
{
SDL_Rect r={X,H2*b,1};
r.h=y1-r.y;
SDL_FillRect(s,&r,0);
}
{
SDL_Rect r={X,y1,1,h1};
SDL_FillRect(s,&r,white);
}
{
SDL_Rect r={X,y1+h1,1};
r.h=H2+H2*b-r.y;
SDL_FillRect(s,&r,0);
}
}
SDL_UnlockSurface(s);
SDL_Flip(s);
flips++;
}

/******************************************************************************/

void print_init_flags(int flags)
{
#define PFLAG(a) if(flags&MIX_INIT_##a) printf(#a ” “)
PFLAG(FLAC);
PFLAG(MOD);
PFLAG(MP3);
PFLAG(OGG);
if(!flags)
printf(“None”);
printf(“\n”);
}

/******************************************************************************/

int main(int argc, char **argv)
{
int audio_rate,audio_channels;
Uint16 audio_format;
Uint32 t;
Mix_Music *music;
int volume=SDL_MIX_MAXVOLUME;

/* initialize SDL for audio and video */
if(SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO) cleanExit(“SDL_Init”);
atexit(SDL_Quit);

int initted=Mix_Init(0);
printf(“Before Mix_Init SDL_mixer supported: “);
print_init_flags(initted);
initted=Mix_Init(~0);
printf(“After Mix_Init SDL_mixer supported: “);
print_init_flags(initted);
Mix_Quit();

if(argc4)
{
fprintf(stderr,”Usage: %s filename [depth] [any 3rd argument...]\n”
” filename is any music file supported by your SDL_mixer library\n”
” depth is screen depth, default is 8bits\n”
” if there is a third argument given, we go fullscreen for maximum fun!\n”,
*argv);
return 1;
}

/* open a screen for the wav output */
if(!(s=SDL_SetVideoMode(W,H,(argc>2?atoi(argv[2]):8),(argc>3?SDL_FULLSCREEN:0)|SDL_HWSURFACE|SDL_DOUBLEBUF)))
cleanExit(“SDL_SetVideoMode”);
SDL_WM_SetCaption(“sdlwav – SDL_mixer demo”,”sdlwav”);

/* hide the annoying mouse pointer */
SDL_ShowCursor(SDL_DISABLE);
/* get the colors we use */
white=SDL_MapRGB(s->format,0xff,0xff,0xff);
black=SDL_MapRGB(s->format,0,0,0);

/* initialize sdl mixer, open up the audio device */
if(Mix_OpenAudio(44100,MIX_DEFAULT_FORMAT,2,BUFFER) cleanExit(“Mix_OpenAudio”);

/* we play no samples, so deallocate the default 8 channels… */
Mix_AllocateChannels(0);

/* print out some info on the formats this run of SDL_mixer supports */
{
int i,n=Mix_GetNumChunkDecoders();
printf(“There are %d available chunk(sample) decoders:\n”,n);
for(i=0; i printf(” %s\n”, Mix_GetChunkDecoder(i));
n = Mix_GetNumMusicDecoders();
printf(“There are %d available music decoders:\n”,n);
for(i=0; i1?”stereo”:”mono”, BUFFER );

/* calculate some parameters for the wav display */
dy=s->h/2.0/(float)(0×1<

/* load the song */
if(!(music=Mix_LoadMUS(argv[1])))
cleanExit(“Mix_LoadMUS(\”%s\”)”,argv[1]);

{
Mix_MusicType type=Mix_GetMusicType(music);
printf(“Music type: %s\n”,
type==MUS_NONE?”MUS_NONE”:
type==MUS_CMD?”MUS_CMD”:
type==MUS_WAV?”MUS_WAV”:
/*type==MUS_MOD_MODPLUG?”MUS_MOD_MODPLUG”:*/
type==MUS_MOD?”MUS_MOD”:
type==MUS_MID?”MUS_MID”:
type==MUS_OGG?”MUS_OGG”:
type==MUS_MP3?”MUS_MP3″:
type==MUS_MP3_MAD?”MUS_MP3_MAD”:
type==MUS_FLAC?”MUS_FLAC”:
“Unknown”);
}
/* set the post mix processor up */
Mix_SetPostMix(postmix,argv[1]);

SDL_FillRect(s,NULL,black);
SDL_Flip(s);
SDL_FillRect(s,NULL,black);
SDL_Flip(s);
/* start playing and displaying the wav */
/* wait for escape key of the quit event to finish */
t=SDL_GetTicks();
if(Mix_PlayMusic(music, 1)==-1)
cleanExit(“Mix_PlayMusic(0x%p,1)”,music);
Mix_VolumeMusic(volume);

while((Mix_PlayingMusic() || Mix_PausedMusic()) && !done)
{
SDL_Event e;
while(SDL_PollEvent(&e))
{
switch(e.type)
{
case SDL_KEYDOWN:
switch(e.key.keysym.sym)
{
case SDLK_ESCAPE:
done=1;
break;
case SDLK_LEFT:
if(e.key.keysym.mod&KMOD_SHIFT)
{
Mix_RewindMusic();
position=0;
}
else
{
int pos=position/audio_rate-1;
if(pos pos=0;
Mix_SetMusicPosition(pos);
position=pos*audio_rate;
}
break;
case SDLK_RIGHT:
switch(Mix_GetMusicType(NULL))
{
case MUS_MP3:
Mix_SetMusicPosition(+5);
position+=5*audio_rate;
break;
case MUS_OGG:
case MUS_FLAC:
case MUS_MP3_MAD:
/*case MUS_MOD_MODPLUG:*/
Mix_SetMusicPosition(position/audio_rate+1);
position+=audio_rate;
break;
default:
printf(“cannot fast-forward this type of music\n”);
break;
}
break;
case SDLK_UP:
volume=(volume+1)<SDL_MIX_MAXVOLUME)
volume=SDL_MIX_MAXVOLUME;
Mix_VolumeMusic(volume);
break;
case SDLK_DOWN:
volume>>=1;
Mix_VolumeMusic(volume);
break;
case SDLK_SPACE:
if(Mix_PausedMusic())
Mix_ResumeMusic();
else
Mix_PauseMusic();
break;
default:
break;
}
break;
case SDL_QUIT:
done=1;
break;
default:
break;
}
}
/* the postmix processor tells us when there’s new data to draw */
if(need_refresh)
refresh();
SDL_Delay(0);
}
t=SDL_GetTicks()-t;

/* free & close */
Mix_FreeMusic(music);
Mix_CloseAudio();
SDL_Quit();
/* show a silly statistic */
printf(“fps=%.2f\n”,((float)flips)/(t/1000.0));
return(0);
}

Consigo compilar correctamente este source, sorpresa me salta este mensaje en pantalla :

C:\Users\IncaIB\Desktop\SDLPrac
Before Mix_Init SDL_mixer suppo
After Mix_Init SDL_mixer suppo
There are 4 available chunk(sam
WAVE
AIFF
VOC
OGG
There are 4 available music dec
WAVE
NATIVEMIDI
OGG
MP3
Opened audio at 44100 Hz 16 bit
Mix_LoadMUS("musica.ogg"): Fail
trar el m¾dulo especificado.
.

con lo que por seguridad voy a SDL/lib donde se encuentran las dll las vuelvo a copiar en la carpeta donde se encuentra el exe y que sorpresa que me carga bién la música, no doy con la cabeza en la pared por el mal de cabeza de luego pero siguiendo, ahora voy a reorganizar TANK para que se escuche la música y una risa cuando se ve lo que tengo hecho hasta ahora, el tanque y el terreno plano. Saludos a todos  por terminar os incluyo un video donde se escucha la música arrancando, esa canción es solo de una practica, ahora buscaré una canción definitiva para el juego y otra para la intro (si eres músico ya sabes mandame tus colaboraciones).

 
Leave a comment

Publicado por en 10 septiembre, 2011 in SDL

 

Etiquetas:

Creada clase player para el jugador

Ya tengo la clase player creada, en un principio es muy sencilla, iré implementando aquí las funciones para control de armas, velocidad del tanque, tengo pensado controlar los sonidos que se han de escuchar en cada estado del tanque, aunque pienso que no será la manera correcta, ya que si quiero usar la clase para otro tipo de enemigo me veo obligado a usar estos sonidos y escuchar un perro haciendo el ruido de un tanque como que no pega, bueno eso lo iré viendo mientras voy ampliando. Voy a grabar un pequeñito vídeo para mostrar como ya funciona el movimiento en 8 direcciones, por ahora aun tengo la cámara fija.

Vaya lo que son las cosas he aprendido en un momento a titular y poner bocadillos a los vídeos de youtube que divertido, así puedes explicar mejor los vídeos en segunda producción si te dejas algo con camtasia producer o ya lo has subido y no quieres pasar otra vez por ese trance.

Habiendo tenido también un momento agregué muy rápido y sin ningún problema las funciones para reproducir música Ogg en el juego.

Ahora antes de continuar con nada tengo la eterna duda pero que solucionare de esta manera, que engine de física 3D usar para complementar con Ogre3D, Physx o OgreBullet, según he leido una tiene la otra no, pero la que no tiene tiene lo que no la otra, cada una sus peculiaridades, comenzaré con OgreBullet y en un segundo proyecto o práctica implementaré Physx (tengo que informarme mas de esta engina ya que es de NVIDIA) bueno esto es lo que se y nada mas. Hasta otro post por esta noche cuelgo el teclado. Booona nit.
ogrelogo

 
2 Comments

Publicado por en 6 septiembre, 2011 in Ogre3D

 

Etiquetas: ,

Cosas que me pasan con los objetos de blender.

Pues aquí me encuentro otra tarde mas, trabajando con el fabuloso tanque que me donó Gonzalo León, aun sin terminar, pero su  que hace perfectamente su cometido que es ayudarme a la práctica.(un min voy a por una cervezita fresquita).Sigo.

tanque3D

diseño blender

Para convertir el .blend uso OgreMeshes.py un script en python para Blender 2.49b, todo sobre ogre y blender aquí

Bien pues ahora subo el video para ver como veo el tanque cuando se escucha el sonido de unos aplausos es debido a poner en test la función de sonido SoundFX.

 
Leave a comment

Publicado por en 2 septiembre, 2011 in Ogre3D

 

Etiquetas: , , , , ,

 
Seguir

Get every new post delivered to your Inbox.