• Domingo 17 de Noviembre de 2024, 21:32

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - Ruben3d

Páginas: 1 ... 7 8 [9] 10 11 ... 30
201
Dudas informáticas / Re: Fallas De Moco$oft
« en: Jueves 14 de Octubre de 2004, 19:19 »
Añadiría que en ese top 20 figuran 10 vulnerabilidades de sistemas Windows y 10 vulnerabilidades de sistemas UNIX, que no todo lo malo es Windows.

El link es éste:
http://www.sans.org/top20/

Un saludo.

Ruben3d

202
DirectX / Re: Color De Mascara
« en: Miércoles 13 de Octubre de 2004, 16:47 »
Citar
Código: Text
  1.     public UInt16 ConvierteA16Bit(Int32 color)
  2.        {
  3.       byte uno, dos, tres;
  4.  
  5.       /* Separar las componentes de byte
  6.        * para poder posteriormente calcular la proporcion
  7.        * independiente por cada componente de color.*/
  8.       uno = (byte)(color & 0x000000FF);
  9.       dos = (byte)((color & 0x0000FF00)>>8);
  10.       tres= (byte)((color & 0x00FF0000)>>16);
  11.       return ( (ushort)( (((uno >> 3) & 0x1F) << 11) | (((dos >> 2) & 0x3F) << 5) | (((tres >> 3) & 0x1F) << 0) ) );
  12.     }
  13.  

La verdad, no sé cómo funciona :P

uno, dos y tres guardan, respectivamente, las componentes azul, verde y roja, gracias a la máscara y al desplazamiento.

Llegados al return, el primer desplazamiento de bits se usa para rebajar su tamaño de 8 bits cada una a 5, 6 y 5 respectivamente.

A continuación aplica una máscara que me parece innecesaria, para poner a 0 los bits que no se usan (ya estaban a cero).

Por último, hace el desplazamiento que coloca cada componente en su posición final. Lo extraño es que parece hacerlo en formato BGR en vez de RGB, ya que 'uno', que es azul, lo pone en la posición del rojo. Y lo mismo pasa con el rojo, en la posición del azul. Por eso digo que no sé cómo funciona.

Por otro lado, prueba a ver si esta versión de la función que te di no arroja excepción:
Código: Text
  1. public UInt16 ConvierteA16Bit(Int32 color)
  2.    {
  3.      return (ushort) ( ( ((color >> 8) & 0xF800) | ((color >> 5) & 0x07E0) | (color >> 3) ) & 0x00FFFF);
  4.    }
  5.  

Lo que hago es aplicar una máscara que elimine los 8 bits de mayor peso, para ver si al tener un dato de 16 bits no se queja al devolverlo como ushort.

Un saludo.

Ruben3d

203
C/C++ / Re: Duda Con La Aproximacion En Un Printf
« en: Martes 12 de Octubre de 2004, 20:46 »
Código: Text
  1. printf("\n El resultado  es : %4.2f ",total);
  2.  

Imprime hasta cuatro enteros y hasta dos decimales.

Un saludo.

Ruben3d

204
Sobre los Foros de SoloCodigo / Re: Que Pasa?
« en: Martes 12 de Octubre de 2004, 20:43 »
Lo mejor que puedes hacer es participar en ellos y fomentar la participación de tus conocidos.

Un saludo.

Ruben3d

205
DirectX / Re: Color De Mascara
« en: Martes 12 de Octubre de 2004, 16:40 »
Citar
Creo que el problema es este:

(ushort) 
Pudiera ser. En C++ así debería de funcionar (con sus tipos equivalentes) y el cast desecharía los bits más significativos y se quedaría con los menos: el color en 16 bits. En C# no sé cómo hacer eso.

Citar
esto depende de la forma de especificar el color en 24 o 32 bits... pero ¿No se intercambian el color rojo por el azul?

Yo asumo que la entrada en un color de 32 bits es AARRGGBB y en uno de 24 es 00RRGGBB. Así, funciona para los dos casos. De todas formas, en algunos sitios ésto cambia. Por ejemplo, en los TGA se guarda el color en formato BGR en vez de RGB. Si la entrada es diferente, ya es cosa de JuanK adaptarla :D

Un saludo.

Ruben3d

206
Sobre los Foros de SoloCodigo / Re: Moderador
« en: Lunes 11 de Octubre de 2004, 23:04 »
Cita de: "The Black Boy"
y que foro aspiras moderar???
adivina :huh:
Cita de: "Serghio"
publivo articulos en panorama sobre VB. Net
Cita de: "Serghio"
moderador d Visual Basic .Net

207
C/C++ / Re: Gotoxy En Dev-c++
« en: Lunes 11 de Octubre de 2004, 18:22 »
Usa la cabecera conio.h, y añade conio.c (ó conio.cpp) a tu proyecto. Ten en cuenta que deberías pensar en dejar de usar esas funciones, pues son específicas de Borland.

Un saludo.

Ruben3d

208
DirectX / Re: Color De Mascara
« en: Lunes 11 de Octubre de 2004, 13:16 »
Hola.

La manera más óptima que se me ocurre de pasar de 32 bits a 16 es:
Código: Text
  1.     public UInt16 ConvierteA16Bit(Int32 color)
  2.     {
  3.       return (ushort) ( ((color >> 8) & 0xF800) | ((color >> 5) & 0x07E0) | (color >> 3) );
  4.     }
  5.  

Intuitivamente debería de funcionar. Primero desplazo los bits más significativos a la posición que deberían ocupar si fuese de 16 bits, después elimino los menos significativos que no quiero, y después lo recompongo todo.

Ya me dirás si funciona (espero que sí :blink: ).

Un saludo.

Ruben3d

209
Programación de Videojuegos / Re: Respuestas Para Un Joven Padawan
« en: Lunes 11 de Octubre de 2004, 12:44 »
Hola.

Está claro que quieres pasar a los gráficos 3D por hardware, que son los más rápidos. Como bien has dicho, tienes como opciones (bajo Windows) OpenGL y DirectX. ¿Cuál elegir? Pues bien, con ambos se alcanzan resultados profesionales (Doom 3 usa OpenGL, Half-Life 2 usa DirectX, y así muchos más).

OpenGL ha sacado hace poco la especificación de su versión 2.0, con el GLSL para programar shaders, que se añade como alternativa al Cg de nVidia y compite contra el HLSL de DirectX (aunque éstos son temas más avanzados).

Viendo que son capaces de lo mismo, ¿cuál elegir? Particularmente, veo más fácil aprender OpenGL para los principiantes que DirectX. El uso es muchísimo más claro y creo que ves mejor cómo van las cosas (es equivalente a lo que pasa con C: es mejor para aprender cómo funciona la memoria del ordenador que C++). Tiene en contra que te tienes que meter con extensiones para las caracterísitcas más avanzadas, aunque cuando llegues a eso se te presentarán dos casos: o bien tus conocimientos adquiridos hacen que no te sea difícil, o bien la experiencia adquirida te permite pasar a DirecX con una curva de aprendizaje muy alta (y así, de paso, sabes dos APIs).

Respecto a recursos (tutoriales, código, etc), te recomiendo éstas webs:
NeHe Productions - Excelentes tutoriales para aprender OpenGL, que van desde el introductorio para el que no sabe nada hasta características avanzadas (el sistema de sombras de Doom 3, por ejemplo).
Game Tutorials - Abundantes tutoriales para aprender DirectX, OpenGL y otras muchas cosas interesantes, que también empiezan en lo más básico y lllegan a bastante buen nivel (por ejemplo, carga de niveles de Quake 3 y uso de modelos MD3).
GameDev.net - Esta web es un clásico. Tienes recursos (en gran cantidad) para cualquier faceta de la programación de videojuegos.

Espero que ésto te haya servido de ayuda.

Un saludo.

Ruben3d

210
C/C++ / Re: Problema Con Iteradores
« en: Lunes 11 de Octubre de 2004, 02:00 »
Francamente, no veo claro cuál es el origen del error, aunque intuyo que no es culpa del 'set'. Prueba a hacer las siguientes cosas:

1.- Intenta reproducir el error con un elemento ('resultado') que no esté en ningún container. Esto eliminaría la posibiliad de que fuera culpa del 'set'.

2.- Según veo, el parámetro que le pasas a 'insertDoc', 'itarboldoc', es de tipo 'set<documento, less<documento> >::iterator'. Y, en el prototipo del método que aparece en el mensaje de error, se supone que debería ser '_Rb_tree_iterator<documento,const documento &,const documento *>'. Comprueba ésto. (no sé si eso es equivalente a un iterador de un 'set', ya que no estoy acostumbrado a ver la implementación del STL en Dev-Cpp, y no había usado nunca 'set').

3.- Crea una versión lo más reducida posible de tu programa, aunque no haga nada funcional, que reproduzca el problema, de manera que la parte en donde falla sea lo más parecida posible al original. El objetivo sería ver por qué está fallando sobre una cantidad muy pequeña de código, que hará más fácil corregirlo. Si lo haces, ponlo aqui para que pueda estudiarlo y ver si saco el origen del problema.

Espero que ésto te sirva de ayuda.

Un saludo.

Ruben3d

211
Visual C++ / Re: Velocidad De Ejecucion
« en: Domingo 10 de Octubre de 2004, 15:17 »
Compila en modo Release en vez de Debug. Examina más la configuración del proyecto para compilar con la máxima eficiencia.

Reduce la entrada/salida al mínimo. En vez de hacer muchas lecturas pequeñas al disco, realiza pocas y grandes, y trabaja sobre la memoria.

Un saludo.

Ruben3d

212
PDA / Re: Emulador De Pda (urgente)
« en: Domingo 10 de Octubre de 2004, 15:13 »
Hola.

Yo uso el eMbedded VC++ 4.0 y sus herramientas asociadas. Al instalar el emulador de PocketPC 2003, me crea el directorio
Código: Text
  1. C:&#092;Archivos de programa&#092;Archivos comunes&#092;Microsoft Shared&#092;Windows CE Tools&#092;Platman&#092;bin
  2.  
donde está el archivo
Código: Text
  1. cefilevw.exe
  2.  
Con éste programa puedes añadir archivos al sistema de ficheros del emulador del PocketPC.

Un saludo.

Ruben3d

213
C/C++ / Re: Random
« en: Domingo 10 de Octubre de 2004, 15:08 »
El código que te ha puesto Diodo te genera números entre 1 y 10 con repetición. Lo que tienes que hacer es crearte un array de 10 posiciones y, cada vez que generes un número, miras en el array a ver si ya ha sido generado anteriormente. Si no lo ha sido, lo añades, y si lo ha sido, vuelves a generar otro y repites el proceso.

Un saludo.

Ruben3d

214
C/C++ / Re: Problema Con Iteradores
« en: Domingo 10 de Octubre de 2004, 15:01 »
Si 'resultado' no es un typedef de un puntero a algo, sino que son los elementos directamente, tanto ésto
Código: Text
  1.  
  2. (*itarbolresult).insertDoc();
  3.  
  4.  
como ésto
Código: Text
  1.  
  2. itarbolresult-&#62;insertDoc();
  3.  
  4.  
debería funcionar sin problemas. ¿Qué compilador usas?

Un saludo.

Ruben3d

215
La taberna del BIT / Re: Gmailf En El Ftp De Solocodigo
« en: Domingo 10 de Octubre de 2004, 14:46 »
También podrías haber puesto un link a la web del autor, para poder tener siempre la última versión, y así te evitas tener que hacer un mirror del archivo. Es ésta: GmailFS - Gmail Filesystem.

Un saludo.

Ruben3d

217
Sobre los Foros de SoloCodigo / Re: COMO LLEGASTE A SOLOCODIGO
« en: Martes 5 de Octubre de 2004, 20:53 »
Por google.

218
C/C++ / Re: Ayuda Base De Datos C
« en: Martes 5 de Octubre de 2004, 15:52 »
El ERWin está bastante bien (y te genera el código SQL para muchos SGBD diferentes), pero DBDesigner 4 es una buena alternativa libre.

Un saludo.

Ruben3d

219
Dudas informáticas / Re: Si No Recuerdas La Contraseña Del Administrador
« en: Martes 5 de Octubre de 2004, 15:48 »
Citar
Modificado por solocodigo:
No se permite la publicación de este tipo de información en el foro

No entiendo el porqué. Habla de cambiar la contraseña propia de tu Windows XP. Cosas como CD-KEYs sí entiendo que estén prohibidas, pero eso no.

Un saludo.

Ruben3d

220
Dudas informáticas / Re: Sistemas Expertos
« en: Lunes 4 de Octubre de 2004, 20:15 »
Hola.

En un sistema experto hay dos partes bien diferenciadas. El motor de inferencia y la base de conocimientos.

El motor de inferencia se encarga de tomar una decisión a partir de los datos y reglas de la base de conocimientos, y de los datos que vaya introduciendo el usuario. Ésta es la parte más sencilla (en comparación con el resto).

La base de conocimientos almacena todas las reglas para que el motor de inferencia pueda llegar a una conclusión. Por ejemplo, en un sistema experto dedicado a la medicina, podrían estar las siguientes reglas:

R1. Si tiene fiebre hay una infección.
R2. Si tiene una infección ha de tomar antibióticos.

Entonces, a la hora de indicar al paciente qué ha de tomar según sus síntomas, si el paciente indica que tiene fiebre, deduciría por R1 y R2 que tiene una infección y que ha de tomar antibióticos, mostrandole al paciente cómo ha llegado a la conclusión si así lo desea.

La calidad de un sistema experto viene dada principalmente por la información de la base de conocimientos. Lo más costoso es 'averiguar' cuáles son las reglas que hay que introducir, según la información que te proporcione un experto real. Cuanto mejor estén pensadas y más sean, más casos podrá resolver el sistema y más información dará. Por ello, el coste depende del tiempo en realizar ésto y los expertos que contrates para 'extraer' su conocimiento.

Un saludo.

Ruben3d

221
DirectX / Re: Cursor Del Mouse
« en: Viernes 1 de Octubre de 2004, 14:21 »
De acuerdo, en OpenGL funciona como te dije, pero esto es DirectX  :)

Un saludo.

Ruben3d

222
Programación de Videojuegos / Re: Curso Para Novatos
« en: Viernes 1 de Octubre de 2004, 14:16 »
La verdad es que de lo que más hay por internet es información sobre lo básico (entra en gamedev y verás). Aún así, la idea es buena pues en nuestro idioma hay menos. A pesar de ello, creo que la cantidad de gente con suficiente nivel para escribir en esos threads no sería muy elevada (más bien reducida e incluso me atrevería a aventurar quiénes). Así, sería mucho trabajo que deberíamos realizar unos pocos, y no todos disponemos de tiempo.

Un saludo.

Ruben3d

223
Programación de Videojuegos / Re: Oop
« en: Viernes 1 de Octubre de 2004, 13:59 »
En verdad, has planteado mal el objeto, BlackWind. Si el struct se puede inicializar con esa función sin parámetros (a parte del propio struct), el constructor del objeto debería llevar ese mismo código, por lo que no hace falta que tenga parámetros.

Volviendo a la pregunta original, ibito, te diré que para crear un juego uso objetos para casi todos (sólo tengo unas 4 ó 5 funciones muy específicas en 8k líneas de código). En el caso concreto de los jugadores y la escena, lo que hago es crear un grafo de escena que los manipule, algo como (muy simplificado):
Código: Text
  1. class Escena
  2. {
  3. public:
  4.   AñadirEntidad(Entidad*, int categoria);
  5.   ActualizarEscena();
  6.   DibujarEscena();
  7.   TestPorColision(int categoria1, int categoria2, Accion*);
  8. private:
  9.   lista de entidades;
  10. }
  11.  

AñadirEntidad añade a la escena una nueva entidad (jugador, enemigo, item, etc). Se puede añadir en cierta categoría (la utilidad se ve más abajo).

ActualizarEscena recorre todas las entidades actualizando sus posiciones y reaccionando ante sus interacciones (colisiones, por ejemplo).

DibujarEscena recorre todas las entidades y las dibuja.

TestPorColision lo que hace es comprobar si hay colision entre objetos de la categoria 1 y de la categoria 2 y, si la hay, llama a la funcion apuntada por Accion (me he pasado la sintaxis un poco por la gorra) para que realice la acción adecuada.

Por otro lado, el tipo básico de entidad puede ser
Código: Text
  1. class Entidad
  2. {
  3. public:
  4.   Entidad(pos,vel,accel);
  5.   Actualizar();
  6.   Dibujar();
  7. private:
  8.   Vector2D posicion, velocidad, aceleracion;
  9. }
  10.  

A partir de este tipo se pueden crear el resto por herencia, como el jugador (con métodos para modificar sus atributos de velocidad, etc), enemigos ,etc. Cuando detectes que el jugador ha pulsado la tecla de disparar, sólo tendrás que crear una nueva entidad del tipo Disparo, añadirla a la escena, y hacer su test de colisión. O cuando un jugador presione la tecla de avanzar, sólo has de llamar al método de su entidad que actualice su velocidad o aceleración, que ya al actualizarse la escena se actualizarán todas las posiciones.

Es importante que se haga por herencia, para que el polimorfismo cumpla su función y se puedan añadir los punteros a la escena.

Este es un modelo simplificado de uno en el que estoy trabajando. Puede ampliarse añadiendo una jerarquía entre las entidades de forma que el movimiento de una se compute de manera relativa al movimiento de otra, y no de manera absoluta, por lo que se pueden conseguir efectos bastante buenos. Te pongo aqui el .h de ésto (si ves cosas raras piensa que es algo inacabado y que le tengo que invertir aún trabajo).
<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->//
// scene.h
//

#ifndef _SCENE_H_
#define _SCENE_H_

#pragma once

#include "mathlib.h"
#include "graphics.h"
#include <list>
#include <vector>
#include <stack>
#include <string>

/*

PENDIENTE:

¿Eliminar m_properties de las entidades?

Revisar la manera en que se gestionan las colisiones.
- ¿Se detiene en la primera colisión o testea todas? ¿Configurable?
- ¿Usar clases en vez de funciones para gestionar los eventos de colisión?

*/


namespace ae
{
    class BoundingArea
    {
    public:
        BoundingArea();
        void SetupMatrices(const Matrix4x4 &local, const Matrix4x4 &strange) const;
        virtual bool TestCollision(const Circle2D &c2d) const = 0;
        virtual bool TestCollision(const Quad2D &q2d) const = 0;
        virtual const CBaseArea *GetArea() const = 0;
    protected:
        mutable Matrix4x4 m_matrix_local, m_matrix_strange;
    };

    class BoundingCircle : public BoundingArea
    {
    public:
        BoundingCircle(const Circle2D &circle) : m_circle(circle) {};
        bool TestCollision(const Circle2D &c2d) const;
        bool TestCollision(const Quad2D &q2d) const;
        const Circle2D *GetArea() const {return &m_circle;};
    private:
        Circle2D m_circle;
    };

    class BoundingQuad : public BoundingArea
    {
    public:
        BoundingQuad(const Quad2D &quad) : m_quad(quad) {};
        bool TestCollision(const Circle2D &c2d) const;
        bool TestCollision(const Quad2D &q2d) const;
        const Quad2D *GetArea() const {return &m_quad;};
    private:
        Quad2D m_quad;
    };

    class Scene;

    enum delete_type {DELETE_ALL, ATTACH_PARENT, ATTACH_SCENE};
    enum attach_type {INHERIT_NONE, INHERIT_ROTATION, INHERIT_DISPLACEMENT, INHERIT_ALL};
    enum class_id {ID_SCENE=0, ID_HELPER=1, ID_PARTICLESYSTEM=2, ID_PARTICLE=3};

    #define AE_ENTITY_BASE 0
    #define AE_ENTITY_DRAWABLE 1
    #define AE_ENTITY_COLLISIONABLE 2

    #define AE_ENTITY_INMORTAL 0e255f

    class CEntity
    {
    public:
        CEntity(const unsigned int class_id,        // Identificador de clase de objeto
                const Vector2D &pos,                // Posición del objeto
                const float angle,                    // Ángulo del objeto
                const Vector2D &vel,                // Velocidad del objeto
                const float accel = 0.0f,            // Aceleración del objeto.
                const float rotvel = 0.0f,            // Velocidad de rotación
                const float life = AE_ENTITY_INMORTAL,        // Vida de la entidad, en segundos
                const delete_type del_action = DELETE_ALL    // Acción al ser borrado
                )
            : m_class_id(class_id),m_pos(pos), m_angle(angle), m_vel(vel), m_accel(accel),
            m_rotvel(rotvel), m_ondelete(DELETE_ALL), m_parent(NULL), m_life(life),
            m_life_left(life), m_properties(AE_ENTITY_BASE)
        {};

        virtual ~CEntity();

        // Añade una subentidad
        void Attach(CEntity *pEntity, const attach_type type = INHERIT_ALL);

        // Se des-atachea de donde esté. Deja de estar bajo control del SceneManager.
        // Se puede reinsertar si se quiere que vaya a otro sitio.
        //void DeAttach(); *** Por el momento esto no es posible ***

        virtual void Update();
        virtual void Draw();

        virtual CTexture *GetTexture() {return NULL;}
        virtual BoundingArea *GetCollisionArea() {return NULL;}

        unsigned int GetClassID() {return m_class_id;}
        const Vector2D &GetPos() {return m_pos;}
        float GetAngle() {return m_angle;}
        const Vector2D &GetVel() {return m_vel;}
        float GetAccel() {return m_accel;}
        float GetRotVel() {return m_rotvel;}
        float GetLife() {return m_life;}
        float GetLifeLeft() {return m_life_left;}
        // Retorna la vida en el rango [0,1]. 1 es toda la vida y 0 es que ha agotado el
        // tiempo.
        float GetNormLifeLeft() {return 1.0f - (m_life-m_life_left)/(m_life);}

        void SetPos(const Vector2D &newPos) {m_pos = newPos;}
        void SetAngle(const float newAngle) {m_angle = newAngle;}
        void SetVel(const Vector2D &newVel) {m_vel = newVel;}
        void SetAccel(const float newAccel) {m_accel = newAccel;}
        void SetRotVel(const float newRotvel) {m_rotvel = newRotvel;}

        friend class Scene;

    protected:
        unsigned int m_class_id;

        int m_properties;

        float m_life, m_life_left;

        Vector2D m_pos;
        Vector2D m_vel;
        float m_accel;
        float m_angle;        // 0º está a las 3.
        float m_rotvel;        // Grados/segundo. Positivo en contra de las agujas del reloj.

        Matrix4x4 m_local_world_matrix;

    private:
        delete_type m_ondelete;

        typedef struct st_subentity_t
        {
            CEntity *pEntity;
            attach_type inherit;
        } subentity_t;
        std::list<subentity_t> m_attached;

        CEntity *m_parent;    // Puntero al padre en la jerarquía
    };
/*
    // Es un renombramiento, ya que una entidad base se puede usar como ayudante para
    // movimientos jerárquicos. Ya que no se pinta y no se testea por colisión es
    // relativamente rápido.
    typedef class CEntity CHelper;
*/


    class CHelper : public CEntity
    {
    public:
        CHelper(const Vector2D &pos,                // Posición del objeto
                const float angle,                    // Ángulo del objeto
                const Vector2D &vel,                    // Velocidad del objeto
                const float accel = 0.0f,            // Aceleración del objeto.
                const float rotvel = 0.0f,            // Velocidad de rotación
                const float life = AE_ENTITY_INMORTAL,        // Vida de la entidad, en segundos
                const delete_type del_action = DELETE_ALL    // Acción al ser borrado
                )
            : CEntity(ID_HELPER, pos, angle, vel, accel, rotvel, life, del_action) {};
    };


    class CEntityDrawable : public CEntity
    {
    public:
        CEntityDrawable(const unsigned int class_id,    // Identificador de clase de objeto
                CTexture *pTexture,            // Textura
                const float width,
                const float height,
                const Vector2D &pos,                // Posición del objeto
                const float angle,                    // Ángulo del objeto
                const Vector2D &vel,                // Velocidad del objeto
                const float accel = 0.0f,            // Aceleración del objeto.
                const float rotvel = 0.0f,            // Velocidad de rotación
                const float life = AE_ENTITY_INMORTAL,
                const delete_type del_action = DELETE_ALL,    // Acción al ser borrado
                const float alpha = 1.0f,            //
                const unsigned int flip = Renderer::FLIP_NONE    //
                )
            : CEntity(class_id, pos, angle, vel, accel, rotvel, life, del_action),
            m_pTex(pTexture), m_width(width), m_height(height), m_alpha(alpha), m_flip(flip)
        {
            m_properties |= AE_ENTITY_DRAWABLE;
        };

        void Draw();

        CTexture *GetTexture() {return m_pTex;}

    protected:
        CTexture *m_pTex;
        float m_width;
        float m_height;
        float m_alpha;
        unsigned int m_flip;
    };

    class CEntityCollisionable : public CEntityDrawable
    {
    public:
        CEntityCollisionable(const unsigned int class_id,    // Identificador de clase de objeto
                CTexture *pTexture,                // Textura
                const float width,                // Anchura
                const float height,                // Altura
                BoundingArea *pCollisionArea,    // Área de colisión
                const Vector2D &pos,            // Posición del objeto
                const float angle,                // Ángulo del objeto
                const Vector2D &vel,                // Velocidad del objeto
                const float accel = 0.0f,        // Aceleración del objeto.
                const float rotvel = 0.0f,        // Velocidad de rotación
                const float life = AE_ENTITY_INMORTAL,
                const delete_type del_action = DELETE_ALL,    // Acción al ser borrado
                const float alpha = 1.0f,
                const unsigned int flip = Renderer::FLIP_NONE
                )
            : CEntityDrawable(class_id, pTexture, width, height, pos, angle, vel, accel, rotvel, life, del_action, alpha, flip),
            m_pCollisionArea(pCollisionArea)
        {
            m_properties |= AE_ENTITY_COLLISIONABLE;
        };

        ~CEntityCollisionable() {if (m_pCollisionArea != NULL) delete m_pCollisionArea;}

        BoundingArea *GetCollisionArea() {return m_pCollisionArea;}

    protected:
        BoundingArea *m_pCollisionArea;
    };

/* Todo esto de aqui desaparecerá */
    //
    //inline CEntityDrawable *AE_DRAWABLE(CEntity *x) {return static_cast<CEntityDrawable*>(x);}
    //inline CEntityCollisionable *AE_COLLISIONABLE(CEntity *x) {return static_cast<CEntityCollisionable*>(x);}

    //
    //#define AE_C2D(x) dynamic_cast<Circle2D>(x)
    //#define AE_Q2D(x) dynamic_cast<Quad2D>(x)

    // Cuidado con esto. Habilitar en el compilador RTTI
    //#define AE_GENERIC_CAST(x, type) dynamic_cast<type>(x)



    #define COLLISION_FUNC(x) void (x)(CEntity *left, CEntity *right)
    typedef COLLISION_FUNC(*PCOLLISION_FUNC);

    /* ¿Qué sucede cuando se hace el Update() de Scene?
    Se recorre el árbol, actualizando las posiciones relativas de cada entidad, y
    se calculan las matrices de transformación de cada una. A continuación se ejecuta
    el buffer de testeos de colisiones.
    */

    class Scene
    {
    public:
        ~Scene();

        void ClearScene();
        void ClearClassID(const unsigned int class_id);

        // La añade a root
        void AddEntity(CEntity *pEntity);

        // Atachea
        void AttachEntity(CEntity *pParent, CEntity *pChild, const attach_type type = INHERIT_ALL);

        // Cuando se quiera borrar una entidad se ha de usar este método
        void DestroyEntity(CEntity *pEntity);

        // Añade la entidad al buffer de borrado. Se eliminará tras actualizar todas las
        // entidades y antes de ejecutar el buffer de colisiones.
        void AddToDeleteBuffer(CEntity *pEntity);

        // Tras ejecutar el buffer hay q volver a llenarlo cada fotograma
        void AddCollisionTest(const unsigned int left_id, const unsigned int right_id, const PCOLLISION_FUNC pFunc);

        void Update();
        void Draw();

        static Scene &Instance() {return m_scene;};

        friend class CEntity;

    private:
        static Scene m_scene;

        /* ************* GRAFO DE ESCENA **************** */
        // Nodos que cuelgan de la escena directamente
        std::list<CEntity*> m_root;

        // Borra todos los descendientes de un elemento del árbol. Además los da de baja
        // en las listas y libera la memoria.
        void RemoveFromTreeCascade(CEntity *pEntity);

        /* ************* LISTAS DE ENTIDADES **************** */
        typedef struct st_entities_list_t
        {
            unsigned int class_id;
            std::list<CEntity*> entities;
        } entities_list_t;
        // Lista de listas de entidades, ordenadas por class_id
        std::list<entities_list_t> m_entities_lists;

        // Lista de las entidades que se han de borrar
        std::list<CEntity*> m_delete_entities;

        // Registra una entidad en las listas.
        void RegisterEntity(CEntity *pEntity);
        // Da de baja una entidad de las listas. NO LIBERA MEMORIA.
        void UnRegisterEntity(CEntity *pEntity);

        /* ************** PILA DE MATRICES ************ */
        // Pila de matrices, para manejarse de manera similar a OpenGL
        std::stack<Matrix4x4> m_matrixstack;
        void ResetStack();
        void PushMatrix();
        void PopMatrix();
        const Matrix4x4 &GetMatrix();

        /* ************** TRANSFORMACIONES ************ */
        void LoadIdentity();
        void Translate(const double x, const double y, const double z = 0.0);
        void RotateZ(const double angle);    // En grados
        void PreTranslate(const double x, const double y, const double z = 0.0);
        void PreRotateZ(const double angle);    // En grados

        /* ************** BUFFER DE DETECCIÓN DE COLISIONES ********* */
        typedef struct st_collision_test_t
        {
            unsigned int left_class_id;
            unsigned int right_class_id;
            PCOLLISION_FUNC pFunc;
        } collision_test_t;
        // Buffer de rutinas de colisión a ejecutar
        std::vector<collision_test_t> m_collision_buffer;

        // Ejecuta el contenido del buffer (al acabar le hace un clear)
        void ExecuteCollisionBuffer();
        // Ejecuta una prueba de colisión en concreto
        void CollisionTest(const unsigned int left_id, const unsigned int right_id, const PCOLLISION_FUNC pFunc);

        /* ********************** OTRAS COSAS ********************** */
        Scene();
        Scene(const Scene &);
    };

} /* namespace ae */

#endif /* _SCENE_H_ */<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->

Un saludo.

Ruben3d

224
C/C++ / Re: Problema Con Typeid
« en: Viernes 1 de Octubre de 2004, 13:18 »
No he usado RTTI con MinGW, pero puesto que cada compilador 'adorna' los tipos y nombres de funciones como le parece, podría ser normal.

Un saludo.

Ruben3d

editado: Este es ya mi post número 500!

225
Sobre los Foros de SoloCodigo / Re: ¿por Qué Está En El Perfil Integrity Messenger?
« en: Martes 28 de Septiembre de 2004, 11:44 »
Muchas gracias!

Páginas: 1 ... 7 8 [9] 10 11 ... 30