Foros en Español > Documentación

[DEV] Bennu como scripting embebido (Ejemplo)

(1/18) > >>

SplinterGU:
Es conocido por muchos que muchos juegos comerciales (a pesar de estar escritos en C o algun otro poderoso lenguaje) usan lenguajes de scripting embebidos para hacer ciertas cosas, o para tener partes de la logica fuera del codigo compilado (binario del juego), y poder de esta forma tocar y ajustar cosas de forma muy facil. Ejemplo de esto es muchos juegos de Lucas Arts y Lua... o incluso Quake y su quakec, por nombrar algunos.
Bueno, nosotros no podemos ser menos, asi que aca les voy a dejar un ejemplo de como se puede usar Bennu como lenguaje de scripting embebido en nuestros proyectos (C en este caso).

[code language="c"]
/*
 *  Copyright © 2008 SplinterGU
 *
 *  This file is part of Bennu - Game Development
 *
 *  Bennu is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  Bennu is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "bgdi.h"
#include "bgdrtm.h"
#include "offsets.h"

/* ---------------------------------------------------------------------- */

int main (int argc, char **argv)
{
    INSTANCE * r ;
    PROCDEF * proc;
    int ret;

    /* Initialization (modules needed before dcb_load) */
    string_init() ;
    init_c_type() ;

    /* Load dcb file */
    if (!dcb_load("sample.dcb")) {
        printf ("Error loading dcb\n") ;
        return -1;
    }

    /* Initialization (modules needed after dcb_load) */
    sysproc_init () ;

    /* ---------- Sum two Numbers ---------------------- */

    proc = procdef_get_by_name ("ADD"); // Get definition function (name must be in uppercase)
    if (!proc)
    {
        printf ("Procc 'ADD' not found\n") ;
        return -1 ;
    }
    r = instance_new (proc, 0) ; // Create Function

    PRIDWORD(r, 0) = 12 ;    // Argument 1
    PRIDWORD(r, 4) = 32 ;    // Argument 2

    ret = instance_go(r) ; // Call Function

    printf ("%d\n", ret);

    /* --------- Create file with random data ---------- */

    proc = procdef_get_by_name ("CREATE_FILE"); // Get definition function (name must be in uppercase)
    if (!proc)
    {
        printf ("Procc 'CREATE_FILE' not found\n") ;
        return -1 ;
    }
    r = instance_new (proc, 0) ; // Create Function

    PRIDWORD(r, 0) = string_new("file.dat") ; // Argument 1
    string_use(PRIDWORD(r, 0));

    ret = instance_go(r) ; // Call Function

    printf ("%d\n", ret);

    /* ------------------------------------------------- */

    do_exit(0);

    return 0;
}

/* ---------------------------------------------------------------------- */
[/code]

[code language="bennu"]
import "mod_rand";
import "mod_file";
import "mod_string";
import "mod_say";


process add(int a, int b)
begin
    say("sum>"+a+"+"+b+"="+(a+b));
    return (a+b);
end


process create_file(string f)
private
    n;
    fp;
    v1,v2;
begin

    say("create_file entry");

    fp = fopen(f, O_WRITE);
    for (n = 0; n < 10; n++)
        v1 = rand(1,100);
        v2 = rand(1,100);
        fputs(fp,"add("+v1+","+v2+")="+add(v1,v2));
    end
    fclose(fp);
    say("create_file exit");
end

begin
end
[/code]

Esto es una prueba que demuestra como puede lograrse esto actualmente, pero para la version final, se crearan "atajos" (sin quitar la actual forma de hacerlo) para simplificar un poco mas esto.

PD: Para el que no le quedo claro, esto sirve para desde un programa escrito en C (por ejemplo) cargar un dcb y llamar a funciones (escritas en lenguaje Bennu) conteniadas dentro de el. Si lo pensamos un poco, el mismo ejemplo, sirve para llamar desde una DLL Bennu a funciones de un dcb (a modo de callbacks). ;)

Link para descarga del ejemplo http://rapidshare.com/files/136430226/embebed.zip.html

animanegra:
Oye muy muy guapa la idea :D me gusta mucho. Muy muy util para generar los programas en c y las interfaces en fenix por ejemplo. :D (Aunque ya se podian hacer mediante librerias en el sentido inverso, pero de esta forma parece que se hace de forma mucho mas sencilla ¿no?)
Creando un editor de interfaces grafico ,que no deberia ser demasiado complicado, que genere un dcb con funciones de las pantallas podria ser la excusa para que mucha gente usase bennu embebido en c para hacer las interfaces de sus programas. :D

SplinterGU:
Si, la cantidad de aplicaciones para esto es grande... en los juegos el uso mas habitual es el de aquellas partes del juego donde uno quiere poder tener flexibilidad de cambios y donde lo pueda tocar (modificar o crear) personas que no necesariamente sean programadores expertos o incluso gente que no tenga el codigo del ejecutable en C (inclusive que no disponga de todo el entorno que la generacion de este requiera)... usos habituales son por ejemplo para, IA de los enemigos, trajectoria de una bala, comportamiento de un arma, chequeo de condiciones para determinar cambios de niveles o escenarios, incremento de decremento de vida o de puntaje, hacer un calculo cualquiera, etc...
Esto se podria comparar a un "Visual Basic for Application" (VBA) embebido en, por ejemplo, un excel. Bennu seria el VBA, y C (o el programa creado en C) el excel.

blostec:

Realmente es increíble el trabajo que estas haciendo con Bennu. Esto abre un mundo de posibilidades para usarlo.  :)

SplinterGU:
Agregado link para descarga del ejemplo.

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa