gameLibZeroC++ [game engine] open source estilo divero..

Started by Erkosone, December 16, 2018, 03:51:20 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Erkosone

#15

UPDATE IMPORTANTE!


Habia un bug grave en la creación de procesos con cuerpos estaticos, ahora se crean correctamente, lo he descubierto durante el desarrollo de un tutorial de juego de plataformas para publicar..
Habia un error durante la creación del shape interno.. este no era capaz de rotar antes de añadirse al mundo para posteriormente volverse estatico..


Ahora esta corregido, y aquí esta el ejemplo de juego de plataformas.. es un mini ejemplo para ver la potencia de la libreria usando sensores.. es una simplificación de las versiones anteriores que usaban isContact() que es una función demasiado compleja para lo que sirve en si misma.. ahora con los procesos a modo de sensor la cosa esta muchisimo mas cercana al estilo DIV original.  :)


La verdad es que me siento muy comodo con esta forma de hacer las cosas.. si alguien descarga el ejemplo y lo prueba ya verá como funciona perfecto.. y mas simple no puede ser  ;)


El archivo rar contiene la ultima versión de la libreria.. no actualizo el entorno todavía al completo por que en esta nueva entrega incluirá generador de fuentes estupendo, egui, y mucho contenido 3d además de un juego al estilo mario de la wii de estos que sale mario en sprites dentro de un mundo 3d.




#include "gameLibZero.cpp"
int ST = 0;
images img;
int type_plataforma;


void setup(){
    setMode(640, 400);
    setFps(60);
    fullscreen();
    loadImages("data/images", &img);
    setGravity(0, 0);
}
//------------------------------------------------------------------
class sensor:public process{
    public:
    int st = 0;
    bool toco_suelo = false;
    void frame(){
        switch(st){
            case 0:
                {
                    graph = img[2];
                    visible = true;
                    x = father->x;
                    y = father->y;
                    createBody(TYPE_CIRCLE, METAL);
                    setSensor(true);
                    st = 10;
                }
                break;
            case 10:
                {
                    x = father->x;
                    y = father->y;
                    translate(x,y+32);
                    toco_suelo = collisionType(type_plataforma);
                }
                break;
        }
    }
};
//------------------------------------------------------------------
class personaje:public process{
    public:
    int st = 0;
    sensor* s;
    bool salto = false;
    void frame(){
        addVy(10);
        switch(st){
            case 0:
                {
                    graph = img[1];
                    visible = true;
                    x = 320;
                    y = 320;
                    createBody(TYPE_BOX, METAL);
                    s = new sensor();
                    st = 10;
                }
                break;
            case 10:
                {
                    /* ¿¿ TOCO SUELO ?? */
                    if(s->toco_suelo){
                        screenDrawText(GetFontDefault(), 18, "TOCO_SUELO", CENTER, x, y-50, WHITE, 255);
                        if(key(KEY_UP) && salto==false){
                            salto = true;
                            addVy(-400);
                        }
                    }else{
                       
                    }
                    if(!key(KEY_UP)){
                        salto = false;
                    }
                    if(key(KEY_LEFT)){
                        addVx(-10);
                    }
                    if(key(KEY_RIGHT)){
                        addVx(10);
                    }
                    if(key(KEY_DOWN)){
                        addVy(5);
                    }
                }
                break;
        }
    }
};
//------------------------------------------------------------------
class plataforma:public process{
    public:
    int st = 0;
    int w,h;
    plataforma(float x, float y, float width, float height, float angle){
        this->x = x;
        this->y = y;
        this->w = width;
        this->h = height;
        this->angle = angle;
    }
    void frame(){
        switch(st){
            case 0:
                {
                    graph = newGraph(w, h, BLUE);
                    visible = true;
                    createBody(TYPE_BOX, HUMAN);
                    type_plataforma = type;
                    setStatic(true);
                    st = 10;
                }
                break;
            case 10:
                   
                break;
        }
    }
};
//------------------------------------------------------------------
void draw(){
    switch(ST){
        case 0:
            {
                // plataforma( x, y, ancho, alto, angulo );
                new plataforma(320, 390, 640, 10, 0);
                new plataforma(100, 350, 200, 5, 10);
                new plataforma(540, 350, 200, 5, -10);
                new plataforma(200, 250, 100, 5, 0);
                new plataforma(440, 250, 100, 5, 0);
                new plataforma(320, 150, 200, 5, 0);
                new personaje();
                ST = 10;
            }
            break;
        case 10:
            {
               
            }
            break;
    }
}

SplinterGU

muy bueno erkosone, me gusta lo del 3d...

podes incluir videos de los demos?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Erkosone

Hola Splinter, si claro, dejame que entremos en el fin de semana y me pongo a ello ;)


UPDATE:
- Añadidos nuevos metodos para calculo de distancias en 2d y 3d.
- Añadidos nuevos materiales tales como 'SENSOR' para crear cuerpos kinematicos hasta ahora no disponibles.

Erkosone


Bien, pues llegados a este punto en el que el engine es funcional y es rapido y estable, comienzo el port a WEB, osea, voy a incrustrar emscriptem en el paquete para que "pulsando F6" se compile el proyecto para WEB.
Así me ahorro todo el sistema de multiplataforma ya que en web assembly funcionan todas las librerias que estan escritas en C99 y en mi caso esto se cumple.


Mas noticias dentro de poco..

Erkosone

UPDATE:
- Implementado el sistema de resolución virtual automatico.


La cosa esta en que tu haces un setMode(320, 176); por ejemplo, y luego puedes redimensionar la ventana e incluso maximizarla, la verdad es que ha quedado genial! os dejo un pequeño test para ver el concepto, queda muy bien!