Bennu Game Development

Foros en Español => Recursos => Topic started by: Windgate on October 21, 2009, 01:14:06 PM

Title: Intro oficial para videojuegos programados con Bennu
Post by: Windgate on October 21, 2009, 01:14:06 PM
Gracias a la exquisita animación en 3D que hizo Prg, he rippeado todas las imágenes de la secuencia y compuesto un sencillo módulo en Bennu que realiza el visionado de la intro hasta que se pulsa _ENTER.

El módulo intro.prg es de uso general, aunque bien puede ser modificado y/o editado para vuestros malévolos propósitos.

Aquí os lo dejo en descarga directa para que vayamos sugiriendo y aportando mejoras entre todos. Os pido disculpas por el tamaño de la descarga (Más de 70Mb) pero es que las 460 capturas de la animación a 800x600 píxeles de resolución... Es lo que tienen.

Espero que os sirva de ayuda, a partir de ahora no faltará la intro de Bennu en cualquiera de mis proyectos :P

También os dejo unos efectos de sonido que recopilé y que podrían encajar bien con la intro, los integraré en la próxima versión.

Descargar la Intro: http://www.mediafire.com/?wwwzny1njdj (http://www.mediafire.com/?wwwzny1njdj)

Descargar efectos de sonido: http://www.mediafire.com/download.php?dtgzmyry4ly (http://www.mediafire.com/download.php?dtgzmyry4ly)
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: panreyes on October 21, 2009, 01:18:10 PM
No se puede utilizar esto XD
Incluir 70MB de la intro es totalmente inviable xD
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: DjSonyk on October 21, 2009, 01:23:01 PM
Muy buen aporte,y sobre todo ,lo que te habrá costado ,puff 460 imagenes eso no es moco de Bennu,digo de pavo...
karma++
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: DCelso on October 21, 2009, 02:26:27 PM
inviable totalmente. Muy muy pesado para un juego.
Otras opciones
Usar archivos flc o fli de autodesk animator, bennugd los abre al igual que lo hacía fenix y div
1.- Aqui dejo un ejemplo con un miniprogramilla para crear un flc a partir de unos *.pcx o *.bmp
http://www.mediafire.com/?ykzmxx3ndnm

El password es "lata"

Aqui he detectado un problemilla que no se si será culpa de bennu o mio de como usar el flic, resulta que se me pone un frame encima del otro por lo que se ve un churro.
el código es el siguiente

Import "mod_flic"
Import "mod_key"
Import "mod_video"

Global
   Int flic_id;
Begin
   set_mode(200,200,16);
   flic_id= fli_start("lata.flc",10,10);
   while (!key(_esc))
       frame;
   end
   fli_end(flic_id);
End

Está el ejemplo adjunto al archivo anterior.


2- ¿no se podría usar bennu3d para ejecutar la animación de blender? Prg, windgate, lynk3rn3l, etc..


De todos modos descargando a ver que tal.
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: DCelso on October 21, 2009, 02:42:35 PM
Bueno, en fenix también me pasa

program animar_lata;

Global
    Int flic_id;
Begin
    set_mode(200,200,32);
    flic_id= start_fli("lata.flc",10,10);
    while (!key(_esc))
        frame;
    end
    end_fli();
End
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: Windgate on October 21, 2009, 04:40:19 PM
De eso se trata, de proponer mejoras entre todos, porque 70Mb en un videojuego comercial en DVD da igual, pero en nuestros juegos...

He probado de todo, el mismo FPG en 32 bits sin usar el compresor de Fenix ocupaba más de 700Mb xD

No estoy familiarizado con las FLI pero parece una opción, otras cosas que he propuesto han sido:

1) Usar alguna DLL que permita reproducir un DIVX en algún formato "normalito" ya que ocuparía significativamente menos.

2) Bajar la resolución a 640x480 para la intro, con lo que se ahorraría algo así como un 25% de espacio, no más.

Lo de reproducirlo mediante Bennu 3D creo que no es viable porque los únicos formatos 3D que soportan animación son los MD2 y MD3 y su calidad no daría para semejante cosa... El resto de formatos viables como .3ds y similares son para modelos estáticos.

Y tengo una idea en el coco que me reconcome: ¿No había un soporte para .avi antiguamente en Fenix?
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: DCelso on October 21, 2009, 04:58:50 PM
Que yo sepa no. A lo mejor algun plugin , pero creo que tampoco.
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: DCelso on October 21, 2009, 06:19:12 PM
SplinterGu, tengo un problema al grabar un fpg, el save_fpg me devuelve siempre 0 y no me crea el archivo, pero el fpg parece estar bien porque se muestra en pantalla la animación.
Es la intro reducida a 4 megas, tiene una pérdida grandísima de calidad pero creo que en wiz no se apreciará.
Prueba este ejemplo
http://www.mediafire.com/?zeznmz24zwi

PROGRAM videojuego;

import "mod_string"
import "mod_say"
IMPORT "mod_video";
IMPORT "mod_key";
IMPORT "mod_map";
IMPORT "mod_proc";

BEGIN
set_mode (340 , 260 , 16);
set_fps ( 60 , 0 );
intro ( );
END
PROCESS intro ( )
local
   string tempname;
   int index;
   int temp_graph;
   int file1;
BEGIN
file1 = new_fpg (  );
say(file1);
   index = 0;
x = 160;
y = 120;
LOOP
[s]IF ( index < 277 )[/s]IF ( index < 276 )
index++;
tempname = index;
while (strlen(tempname) <3)
tempname = "0"+tempname;
           end
temp_graph = load_png("png/output/"+tempname+".png");
graph = temp_graph;
           say(temp_graph);
           say(fpg_add(file1,index,0,temp_graph));
else
     say("aqui");
   say(fpg_save(file1,"fpg_saved.fpg"));
             exit ( 0 );
       end
       frame;
END
END

Edit: problema solventado, culpa del 277, solo había 276 imágenes
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: splinter_work on October 21, 2009, 06:45:13 PM
son todos los graficos del fpg de la misma profundidad de color?

si cargas un png de 16, otro de 8 y otro de 32 e intentas guardar eso, no va a ir ni en pedo.
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: FreeYourMind on October 21, 2009, 07:01:04 PM
Pues yo no tengo problemas con el fli,
te adapto el código al que utilizo para visualizar videos en Bennu:

program animar_lata;

Begin
    set_mode(200,200,32);
    start_fli("lata.flc",10,10);
    Frame(12000);  // Tiempo de ejecución, ajustar al tiempo del video
    end_fli();
End
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: Windgate on October 21, 2009, 08:01:16 PM
¿Cómo se podría pasar bien sea el .mp4 de Prg o el .fpg que he compuesto con él a FLI? ¿Alguien es suficientemente macho?

O al menos dar alguna orientación, supongo que no seré el único que sólo conoce las FLI por lo que viene en el manual de Fenix...

Gracias por tu compresión DCelso, procedo a probar :P

EDIT: Espero que en la Wiz se vea bien, en Windows casi se me caen los ojos al verlo... lol
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: FreeYourMind on October 21, 2009, 09:55:39 PM
Yo tengo la suerte de conocer el formato flc/fli antes de salir incluso DIV.
Era usado para videos de juegos dos, etc.
Es un formato de poca calidad, así que me imagino que no tendrás nunca esa calidad, ya que creo que sólo soportan hasta 256 colores.
Yo usaba programas de lineas de mandos para crearlos, uno creaba el fli a partir de imagenes de una carpeta, el otro extraia imagenes de videos flc.
Lo unico que os puedo ofrecer es mi logo en este formato que cree en 2000 para formar parte del logo de Art Shot para DIV, los programas los tengo perdidos en otro ordenador.
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: Windgate on October 21, 2009, 10:01:39 PM
Uf, pero 256 colores es un mojón... Para una intro "de verdad" necesitamos el vídeo tal y como está, unas 400 capturas en total...

¿Hay forma de hacer un load_jpeg() o load_gif() o algo parecido? En ese formato se ahorraría mucho espacio... Bennu3D sí que es capaz de cargar ese tipo de formatos... Quizás algún apaño cargando como texturas las JPEG y poniéndolas como elemento de la GUI pudiese servir.

Otra opción también sería bajar el número de capturas, he capturado 25 por segundo de video, podíamos dejarlo en 20... De ahí para abajo ya perdería calidad y creo que no quedará bien. A 20 imágenes por segundo y 640x480 de resolución podría quedarse en unos 40Mb... De ahí no sé bajar con lo que tenemos disponible...

En cualquier caso yo lo meto en mi próximo proyecto tal cual con sus 70Mb, haré que el proyecto sea digno de una intro de 70Mb creedme ;)
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: DCelso on October 21, 2009, 11:25:01 PM
Windgate prueba mejor a cargar los jpgs con load_image(), que es clavadita a load_png. Está en el mod_image. Lo que pasa es que para linux habría que recompilarlo
http://www.bennugd.org/downloads/bennugd-module-image-1.2_win32.zip
https://edge.launchpad.net/~josebagar/+archive/ppa/+files/bennugd-module-image_1.3.tar.gz
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: josebita on October 21, 2009, 11:33:33 PM
Ey, si descomprimes el .deb de mi PPA (que se puede hacer con cualquier descompresor decente) estan los binarios compilados para linux que casi seguro que te valdran.

(Perdon por la ausencia de tildes, cosas de mi teclado de hoy...)
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: Drumpi on October 21, 2009, 11:36:34 PM
Creo recordar que hubo un módulo experimental de mpeg para Fenix. Funcionar funcionaba, pero con mpeg de los básicos y sin sonido, al menos es lo que se comentaba (nunca lo usé).
De todas formas, muchas de las intros con video suelen reproducirse en PC a una resolución inferior al resto del juego. Recuerdo los videos del Age of Empires, que eran a 320x240 creo, aunque luego el juego lo ponías a 1024x768.

Lo suyo sería montar una mod_xvid, pero visto el éxito que obtuve en su día con algo tan famoso como el GIF, ni me lo planteo.
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: DCelso on October 21, 2009, 11:41:05 PM
Pues windgate, lo suyo es que pruebes a 20 fps a 640x480 y con jpgs a ver a cuanto se reduciría.
para redimensionar muchas fotos a la vez puedes usar xnview, abres su "explorer" seleccionas todas las imágnes, das al derecho y le das a batch processing y añades el filtro resize y pones 640x480 y das a aceptar.
También en el enlace anterior te puse un link con mi ejemplo de una lata de como pasar un directorio lleno de *.pcx a formato flc. Incluye el compresor. El password del zip es "lata", tuve que ponerle password sino mediafire no me dejaba subirlo por eso de llevar exes.
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: Prg on October 22, 2009, 03:39:43 AM
mmm, tengo una versión corriendo en bennu que pesa 4 mb y que está en muy buena calidad (mpg de 720* algo).

http://www.mediafire.com/download.php?mmdmt2mw3ij (http://www.mediafire.com/download.php?mmdmt2mw3ij)

el único problema es algunas limitaciones de la librería con que se carga, que aunque no es muy problemático, si podría causar que alguien busque otra solución...  (se necesita tener instalado el codec y no se puede ejecutar nada hasta que el video termina) ;)

olvidaba: ESTA LIBRERÍA ES UN POCO ANTIGUA ASÍ QUE POSIBLEMENTE NO QUIERA COMPILAR CON LAS MÁS ACTUALES VERSIONES DE BENNU (hay que recompilarla y quizá darle una manita de gato para que permita detener el video sin que termine, quién dice yo?)

saludos :)
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: syous on October 22, 2009, 11:29:03 AM
Quote from: Drumpi on October 21, 2009, 11:36:34 PM
Creo recordar que hubo un módulo experimental de mpeg para Fenix. Funcionar funcionaba, pero con mpeg de los básicos y sin sonido, al menos es lo que se comentaba (nunca lo usé).
De todas formas, muchas de las intros con video suelen reproducirse en PC a una resolución inferior al resto del juego. Recuerdo los videos del Age of Empires, que eran a 320x240 creo, aunque luego el juego lo ponías a 1024x768.

Lo suyo sería montar una mod_xvid, pero visto el éxito que obtuve en su día con algo tan famoso como el GIF, ni me lo planteo.

aqui tines un libreria para vide en fenix que se incluyo en fenixpack

http://fenixpack.ayudaprogramacion.net/download.php?view.3 (http://fenixpack.ayudaprogramacion.net/download.php?view.3)
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: Windgate on October 22, 2009, 12:29:45 PM
Descargando todo y a probar... Gracias.

Os dejo en descarga directa desde mi hosting una nueva prueba de la intro, con fade_music y fade sobre la intro, es mucho más delicioso.

http://trinit.es/DescargaDirecta/Box%20Dialogs%200.0.0.zip (http://trinit.es/DescargaDirecta/Box%20Dialogs%200.0.0.zip)

El nombre de la descarga se debe a que es un proyecto de juego RPG con diálogos, pero apenas he llegado a meter la intro todavía :P

La pena es que los 70Mb siguen estando ahí. Sigo investigando los oscuros secretos de la compresión y el vídeo xD

EDIT: loooooooooool encontraste la solución Prg, me ha compilado a la primera, perfecto!!! Karma spree!!!
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: Prg on October 22, 2009, 03:29:11 PM
QuoteEDIT: loooooooooool encontraste la solución Prg, me ha compilado a la primera, perfecto!!! Karma spree!!!

je je, ahora hay que compilar la librería para que los usuarios de nuevas versiones puedan usarla y también ver si se puede hacer que se use en linux sin usar el wine :)... saludos.
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: Windgate on October 22, 2009, 08:13:32 PM
He leído que soporta varios formatos de vídeo e incluso el audio de los mismos siempre y cuando estén instalados los codecs necesarios.

¿Es posible ver en algún lugar la lista de funciones que ofrece esa DLL?

Supongo que alguna podrá indicar un error de codecs y al menos dar un error y abortar el programa.

Cuando pase a Ubuntu lo pruebo, gracias de nuevo Prg, eres tremendamente groso.

EDIT: Por cierto, todavía no he probado pero espero que soporte fade() y fade_music_in()... Cuando saque un ratillo lo intento y hago un nuevo intro.prg basado en tu mpg :P
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: DCelso on October 22, 2009, 08:25:27 PM
Siento decirte que únicamente tiene una función. Si le pasas moddesc.exe te devuelve esto
C:\Temp\bgd>moddesc.exe bennuvideo.dll
Module Describe v1.1 (Build: Jul  6 2009 00:43:01)
Copyright (C) 2009 SplinterGU
This utility comes with ABSOLUTELY NO WARRANTY.
moddesc.exe -h for details

Module name: bennuvideo.dll

Functions:

DWORD PLAY_VIDEO(STRING)


Module Dependency:

libsdlhandler
mod_string



Press any key to continue...
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: Windgate on October 22, 2009, 08:44:48 PM
Oh, al menos devuelve dword, supongo que será algo así como TRUE si funciona y FALSE si no es así, ya es algo.
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: Prg on October 23, 2009, 01:21:50 AM
bueno, ahora yo pongo mi ejemplito, Windgate ya hasta un juego está haciendo... je je je yo pondré un ejemplito de la intro base (video base) y una edición personal que le hice (no juzguen la música porfa que no se ambientar con sonidos... amigo windgate, no supe poner la música que me pasaste) en el archivo viene un 0018 mp4 que es el video base y que pueden usar para editar y crear cualquier cosa que necesiten :)

http://www.mediafire.com/download.php?qyxwjw0nmqm (http://www.mediafire.com/download.php?qyxwjw0nmqm)

¿Qué contiene el archivo rar que viene ahí?
1)un bat para compilar directamente el código bennu
2)las librerías de bennu de una versión compatible con la librería que aun no está compilada
3)el video 0018.mp4 que es el base (se puede ver desde la librería, y de hecho lo hace en un ejemplo)
4)el video 0019.mp4 es el video que edité, un poco feo (aunque a mi me gustó) pero es para dar una idea de qué se hace
5)un código que tiene un menu para ver los videos en varias resoluciones



saludos. pasaré el .blend cuando empaquete todo, que tengo un cochinero en la carpeta del logo (700 y más mb de archivos prueba).
una vez que limpie y elimine archivos prueba dejo el blend en el otro tema (el original) para que quede para la posteridad.
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: Windgate on October 23, 2009, 10:48:14 AM
Quoteamigo windgate, no supe poner la música que me pasaste

Oh, creí que lo había dicho ya:

Con los mpeg se soporta fade_music_in () sin problemas, lo que no soporta son los fades :(

Ahora estoy haciendo unas pruebas, quizás con un simple:

fade_music_in ( ... )
play_video ( ... )
fade_music_off ( ... )


Se consiga el efecto de finalizar la música justo cuando el vídeo termina, la lástima es que no pueda interrumpirse a mitad :(

Bajo tu ejemplo Prg pero no entiendo muy bien qué pretendes con él xD

EDIT: El anterior código para que la música finalice al mismo tiempo que el vídeo no funciona... Al parecer play_video ( ) se comporta como un PROCESS y no como una FUNCTION, además es extraño, tengo que añadir esto después de play_video ( )

LOOP
IF ( key ( _ENTER ) )
BREAK;
END
FRAME;
END


Porque en otro caso al terminar el vídeo el juego se me queda con la pantalla en negro ???
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: DCelso on October 23, 2009, 11:28:08 AM
PRG, ¿tienes el código fuente del bennuvideo? A ver si echándole un ojo.
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: Prg on October 23, 2009, 02:34:55 PM
viene algo en el pack de bennu, en los ejemplos, en dll. está adjunto lo que viene es un archivo .c y otras cositas por ahí...


Quoteademás es extraño, tengo que añadir esto después de play_video ( )...
eso pasa porque necesitas limpiar el buffer de el teclado y también debes limpiar la pantalla. en el primer ejemplo que pasé linkernel usa while (scan_conde!=0) frame; end y  set_mode(...) para limpiar la pantalla y el buffer. :)
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: Jurk on October 23, 2009, 05:18:39 PM
Utilizando el sonido del Fenix/Bennu incluido en el zip de sonidos del primer post, he creado esta mini intro para GP2X WIZ
Es facil de usar, ya que solo hay que invocar la funcion intro(). A ver que os parece. Yo lo voy a usar siempre.

Como el sonido que he integrado en el paquete es, como ya he comentado, del paquete del primer post, y la imagen, la del foro, me gustaria poner insertar a los autores en el readme integrado en el .prg

Una ultima cosa, he intentado seguir el libro de estilo para Bennu
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: DCelso on October 24, 2009, 11:39:33 PM
Hola a todos, he estudiado el código fuente de la librería de video y aún no la he comprendido del todo, he hecho varias pruebas para añadirle funcionalidad de parada, resumen y pausa pero no lo he conseguido, necesitaría la ayuda de alguno con mas experiencia en c++, sdl y directx. ¿SPlinter?
Bueno, dejo el código fuente adaptado para que compile en gcc y reformateado y adaptado a la última versión de dss de bennu.
Le he puesto mod_dshow porque ussa Direct Show para mostrar el video.
mod_dshow (http://www.mediafire.com/?mmywjnrjmmw)
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: Prg on October 25, 2009, 02:41:55 AM
:) te podría ayudar linkernel que es el autor :)
descargando...
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: DCelso on October 25, 2009, 11:06:39 AM
el dll está en el directorio release por si es lo que quieres probar.
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: DCelso on October 25, 2009, 06:09:12 PM
No sabía que fuese de linkernel. He probado la dll de video con la intro de bennu en un portatil atlonxp2800 con un giga de ram y va lentíisimo pero lentíiisimo, algo falla en la dll, ya que el video a través de un reproductor como videolan va perfectamente.
Splinter y linkernel, ¿podríais mirar el código fuente por encima para buscar optimizaciones?
Gracias de antemano.

/*
(C) 2004    Colombian Developers
License GNU/GPL
*/

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

#include <math.h>
#include <memory.h>

#ifdef TARGET_BEOS
#include <posix/assert.h>
#else
#include <assert.h>
#endif


#include <windows.h>

//DIRECTX functions
#include <dshow.h>
#include <mmstream.h>
#include <amstream.h>
#include <ddstream.h>

//SDL functions
#include <SDL.h>
#include <SDL_syswm.h>//SDL stuff (for getting windows etc)

//BennuGD functions
#include "bgddl.h"

extern "C" const char * string_get( int code ) ;
extern "C" void         string_discard( int code ) ;

//-------

HINSTANCE hDLL = NULL;

#define true TRUE
#define false FALSE

#if defined(__GNUC__)
#define M_DLLAPI    WINAPI *    //devcpp
#else
#define M_DLLAPI    __cdecl  *  //visual c++
#endif

typedef const char * (M_DLLAPI tstrget)(int code);
typedef void (M_DLLAPI tstrdiscard)(int code);

//---------------------------------------------------
//FUNCIONES PPALES
//---------------------------------------------------

//dependencias DX8
int render_my_video(HWND hWnd, char *cadena, ...);
void close_my_video();

// init DirectShow pointers
IGraphBuilder *pGraph = NULL;
IMediaControl *pControl = NULL;
IMediaSeeking * pSeek = NULL;
IVideoWindow *pVW;
IMediaEventEx * g_pME = NULL;
int salida = false;

static int f_Inicializar(INSTANCE * my, int * params) {

SDL_SysWMinfo wmInfo;
HWND MiV;
const char *Archivo = string_get(params[0]);
char cadena[255];
int retorno;

SDL_VERSION(&wmInfo.version);
SDL_GetWMInfo(&wmInfo);
MiV = wmInfo.window;

strcpy(cadena, Archivo);

retorno = render_my_video(MiV, cadena);

//liberar memoria
string_discard(params[0]);

close_my_video();

ShowWindow(MiV, SW_RESTORE);
SetCapture(MiV);
SetFocus(MiV);

return retorno;
}

//static int f_run(INSTANCE * my, int * params) {
// pControl->Run();
// return 0;
//}
//static int f_pause(INSTANCE * my, int * params) {
// pControl->Pause();
// return 0;
//}
//static int f_stop(INSTANCE * my, int * params) {
// salida=true;
// pControl->Stop();
// return 0;
//}


#include <stdio.h>
#include <tchar.h>

long FAR PASCAL WindowProc( HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam )
{
switch( message )
{
// Monitor keystrokes for manipulating video window
// and program options
case WM_KEYDOWN:
switch( wParam )
{
case VK_ESCAPE:
case VK_SPACE:
case VK_RETURN:
salida=true;
pControl->Stop();

break;
}
break;

case WM_DESTROY:
PostQuitMessage(0);
return 0;
}

return DefWindowProc(hWnd, message, wParam, lParam);
}

int render_my_video(HWND hWnd, char *cadena, ...) {
HWND ventanaEventos;

#define CUTSCENE_NAME  TEXT("BGD SCENE")

WNDCLASS wc = { 0 };
wc.lpfnWndProc = WindowProc;
wc.hInstance = 0;
wc.lpszClassName = CUTSCENE_NAME;
if (!RegisterClass(&wc))
return FALSE;

ventanaEventos = CreateWindowEx(0, CUTSCENE_NAME, "BGD SCENE", 0, // not visible
0, 0, 0, 0, NULL, NULL, 0, NULL); //crea una ventana para eventos del teclado

// init COM client/server
CoInitialize(NULL);
CoCreateInstance((REFCLSID) CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
(REFIID)IID_IGraphBuilder, (PVOID*) &pGraph);
// get DirectShow interfaces
pGraph->QueryInterface(IID_IMediaControl, (void **) &pControl);
pGraph->QueryInterface(IID_IMediaEventEx, (void **) &g_pME);
pGraph->QueryInterface(IID_IMediaSeeking, (void **) &pSeek);
pGraph->QueryInterface(IID_IVideoWindow, (void **) &pVW);

WCHAR wFile[MAX_PATH];
TCHAR szBuffer[255];

va_list pArgs;
va_start(pArgs, cadena);
vsprintf(szBuffer, cadena, pArgs);
va_end(pArgs);


// If the characters are in UNICODE we need parse they.
#ifndef UNICODE
MultiByteToWideChar(CP_ACP, 0, szBuffer, -1, wFile, MAX_PATH);
#else
lstrcpy(wFile, szBuffer);
#endif

// init render (passing movie file)
pGraph->RenderFile(wFile, NULL);

// make parent
pVW->put_Owner((OAHWND) hWnd);

#define WM_GRAPHNOTIFY  WM_APP+1

//manda los eventos a la ventana oculta, el video lo manda a BennuGD
//g_pME->SetNotifyWindow((OAHWND)ventanaEventos, WM_GRAPHNOTIFY, 0);
HRESULT hr = pVW->put_MessageDrain((OAHWND) ventanaEventos);
if (FAILED(hr))
return false;

// Adjust "movie render window" to "bgd render window" dimensions
RECT grc;
GetClientRect(hWnd, &grc);
pVW->SetWindowPosition(0, 0, grc.right, grc.bottom);
pVW->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);

// keep focus in bgd
SetFocus(hWnd);
SetCapture(ventanaEventos);

pVW->put_Visible(OATRUE);

pControl->Run();

ShowWindow(hWnd, SW_RESTORE); //x si pierde el foco

MSG msg;

//crea un control independiente de los eventos , bgd queda aislado x el momento
//con el proposito que el sonido y el video se reproducen en tiempo real
// Check and process window messages (like our keystrokes)
while (!salida) {
while (PeekMessage(&msg, ventanaEventos, 0, 0, PM_REMOVE)) {
PAINTSTRUCT ps;
BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);

TranslateMessage(&msg);
DispatchMessage(&msg);
}

long lEventCode, lParam1, lParam2;

// Has there been a media event?  Look for end of stream condition.
if (E_ABORT != g_pME->GetEvent(&lEventCode, &lParam1, &lParam2, 0)) {
// Free the media event resources.
hr = g_pME->FreeEventParams(lEventCode, lParam1, lParam2);
if (FAILED(hr)) {
salida = true;
}

// Is this the end of the movie?
if (lEventCode == EC_COMPLETE) {
salida = true;
}
}

}

DestroyWindow(ventanaEventos);

return true;
}

void close_my_video() {
// release
pControl->Stop();
pVW->put_Visible(OAFALSE);
pVW->put_Owner(0);
pVW->Release();
pSeek->Release();
pControl->Release();
g_pME->Release();
pGraph->Release();
CoUninitialize();

}

DLSYSFUNCS __bgdexport(mod_dshow,functions_exports)[] = {
    { "PLAY_VIDEO"               , "S"   , TYPE_DWORD  , (void*) f_Inicializar             },
//     { "RUN_VIDEO"               , ""   , TYPE_INT  , (void*) f_run             },
//     { "PAUSE_VIDEO"               , ""   , TYPE_INT  , (void*) f_pause             },
//     { "STOP_VIDEO"               , ""   , TYPE_INT  , (void*) f_stop             },
    { 0                     , 0         , 0         , 0                     }
};

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

/* Bigest priority first execute
Lowest priority last execute */

char * __bgdexport(mod_dshow,modules_dependency)[] =
{
"libsdlhandler",
"mod_string",
NULL
};


Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: SplinterGU on October 25, 2009, 09:05:43 PM
ya lo vi hace mucho, ese codigo solo funciona con compilador msvc...
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: DCelso on October 25, 2009, 10:22:26 PM
Pues ya no, yo lo he adaptado para compilar con gcc, si te bajas mi adjunto verás el proyecto en eclipse.
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: SplinterGU on October 25, 2009, 10:35:11 PM
pero compila? yo recuerdo que fallaba por la falta de dlls...
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: DCelso on October 25, 2009, 10:59:41 PM
clarop, tengo el dll creado con gcc y probado y funcionando, si te bajas el documento lo verás en la carpeta release.
Las dependencias son un .lib de directx que adjunto y los dlls de ole32 de windows y el bgdrtm de bennu.

El problema radica en que el código es muy complejo para mí, entiendo algunas cosas pero no todas, hace algo muy extraño como que se trae el manejador de SDL y sustituye el controlador de eventos por uno propio, y esto es lo que me parece a mi que la caga porque elimina el control de teclado de bennu.
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: DCelso on October 25, 2009, 11:02:18 PM
Si examinas el código, añadí tres funciones nuevas de parada, pausa y resumen pero no van por eso las comenté para que no se exportaran.
Creo que no van por lo explicado anteriormente del teclado.
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: DCelso on October 25, 2009, 11:56:02 PM
Hola Splinter, he reducido considerablemente el código a lo esencial e indispensable, ahora va un poquito más rápido pero sigue yendo un poco lento. He eliminado toda la parte que comentaba antes de un control de teclas de una ventana invisible o algo así, el código queda reducido a lo siguiente:

/*
(C) 2004    Colombian Developers
License GNU/GPL
*/

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

#include <math.h>
#include <memory.h>

#ifdef TARGET_BEOS
#include <posix/assert.h>
#else
#include <assert.h>
#endif


#include <windows.h>

//DIRECTX functions
#include <dshow.h>
#include <mmstream.h>
#include <amstream.h>
#include <ddstream.h>

//SDL functions
#include <SDL.h>
#include <SDL_syswm.h>//SDL stuff (for getting windows etc)

//BennuGD functions
#include "bgddl.h"

extern "C" const char * string_get( int code ) ;
extern "C" void         string_discard( int code ) ;

//-------

HINSTANCE hDLL = NULL;

#define true TRUE
#define false FALSE

#if defined(__GNUC__)
#define M_DLLAPI    WINAPI *    //devcpp
#else
#define M_DLLAPI    __cdecl  *  //visual c++
#endif

typedef const char * (M_DLLAPI tstrget)(int code);
typedef void (M_DLLAPI tstrdiscard)(int code);

//---------------------------------------------------
//FUNCIONES PPALES
//---------------------------------------------------

//dependencias DX8
int render_my_video(HWND hWnd, char *cadena);
void close_my_video();

// init DirectShow pointers
IGraphBuilder *pGraph = NULL;
IMediaControl *pControl = NULL;
//IMediaSeeking * pSeek = NULL;
IVideoWindow *pVW;
IMediaEventEx * g_pME = NULL;
int salida = false;

static int f_Inicializar(INSTANCE * my, int * params) {

SDL_SysWMinfo wmInfo;
HWND MiV;
const char *Archivo = string_get(params[0]);
char cadena[255];
int retorno;

SDL_VERSION(&wmInfo.version);
SDL_GetWMInfo(&wmInfo);
MiV = wmInfo.window;

strcpy(cadena, Archivo);

retorno = render_my_video(MiV, cadena);

//liberar memoria
string_discard(params[0]);

close_my_video();

ShowWindow(MiV, SW_RESTORE);
SetCapture(MiV);
SetFocus(MiV);

return retorno;
}

static int f_run(INSTANCE * my, int * params) {
pControl->Run();
return 0;
}
static int f_pause(INSTANCE * my, int * params) {
pControl->Pause();
return 0;
}
static int f_stop(INSTANCE * my, int * params) {
salida=true;
pControl->Stop();
return 0;
}

int render_my_video(HWND hWnd, char *cadena) {
// init COM client/server
CoInitialize(NULL);
CoCreateInstance((REFCLSID) CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
(REFIID)IID_IGraphBuilder, (PVOID*) &pGraph);
// get DirectShow interfaces
pGraph->QueryInterface(IID_IMediaControl, (void **) &pControl);
pGraph->QueryInterface(IID_IMediaEventEx, (void **) &g_pME);
//pGraph->QueryInterface(IID_IMediaSeeking, (void **) &pSeek);
pGraph->QueryInterface(IID_IVideoWindow, (void **) &pVW);

WCHAR wFile[MAX_PATH];

// If the characters are in UNICODE we need parse they.
#ifndef UNICODE
MultiByteToWideChar(CP_ACP, 0, cadena, -1, wFile, MAX_PATH);
#else
lstrcpy(wFile, cadena);
#endif

// init render (passing movie file)
pGraph->RenderFile(wFile, NULL);

// make parent
pVW->put_Owner((OAHWND) hWnd);

// Adjust "movie render window" to "bgd render window" dimensions
RECT grc;
GetClientRect(hWnd, &grc);
pVW->SetWindowPosition(0, 0, grc.right, grc.bottom);
pVW->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);

pControl->Run();
    // Loop that show the video
while (!salida) {

long lEventCode, lParam1, lParam2;

// Has there been a media event?  Look for end of stream condition.
if (E_ABORT != g_pME->GetEvent(&lEventCode, &lParam1, &lParam2, 0)) {
// Free the media event resources.
HRESULT hr = g_pME->FreeEventParams(lEventCode, lParam1, lParam2);
if (FAILED(hr)) {
salida = true;
}

// Is this the end of the movie?
if (lEventCode == EC_COMPLETE) {
salida = true;
}
}

}

return true;
}

void close_my_video() {
// release
pControl->Stop();
pVW->Release();
//pSeek->Release();
pControl->Release();
g_pME->Release();
pGraph->Release();
CoUninitialize();

}

DLSYSFUNCS __bgdexport(mod_dshow,functions_exports)[] = {
    { "PLAY_VIDEO"               , "S"   , TYPE_DWORD  , (void*) f_Inicializar             },
    { "RUN_VIDEO"               , ""   , TYPE_INT  , (void*) f_run             },
    { "PAUSE_VIDEO"               , ""   , TYPE_INT  , (void*) f_pause             },
    { "STOP_VIDEO"               , ""   , TYPE_INT  , (void*) f_stop             },
    { 0                     , 0         , 0         , 0                     }
};

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

/* Bigest priority first execute
Lowest priority last execute */

char * __bgdexport(mod_dshow,modules_dependency)[] =
{
"libsdlhandler",
"mod_string",
NULL
};



En la función play_video hay un bucle que se encarga de generar el video y este es el culpable de que el sistema se quede bloqueado hasta que se termine la ejecución.
Habría que encontrar una forma diferente de llevar a cabo esta tarea para que no fuese bloqueante, algo como ejecutar el contenido de esto en cada frame en vez de aqui del tirón.

    // Loop that show the video
while (!salida) {

long lEventCode, lParam1, lParam2;

// Has there been a media event?  Look for end of stream condition.
if (E_ABORT != g_pME->GetEvent(&lEventCode, &lParam1, &lParam2, 0)) {
// Free the media event resources.
HRESULT hr = g_pME->FreeEventParams(lEventCode, lParam1, lParam2);
if (FAILED(hr)) {
salida = true;
}

// Is this the end of the movie?
if (lEventCode == EC_COMPLETE) {
salida = true;
}
}

}
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: SplinterGU on October 26, 2009, 11:19:13 PM
podes usar un thread o usar algun callback de bennu...
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: Windgate on October 27, 2009, 01:08:31 PM
podes usar un thread o usar algun callback de bennu...

¿Cuando se crea una DLL se pueden hacer uso de threads en C?

¿Entonces, los PROCESS que invocamos en Bennu no podrían también hacer uso de threads también?

No lo tengo claro del todo, pero tengo entendido que bgdi se ejecuta en un hilo único, ¿es así?
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: SplinterGU on October 27, 2009, 11:41:05 PM
esta la funcion para cargar fpgs en background
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: Windgate on October 27, 2009, 11:46:46 PM
Interesante, es difícil pasar un día por el foro sin aprender algo nuevo, lo archivo para cuando pueda sacarle utilidad.
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: SplinterGU on October 28, 2009, 02:25:10 AM
lo que quise decir es que tenes las fpg_loadbg o algo asi... que son para cargar un fpg sin frenar la ejecucion.
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: Windgate on October 28, 2009, 09:49:45 AM
Puede ser interesante, ahora mismo estaba empezando un proyecto con scroll tileado, y se podría plantear la idea de tener los tiles en varios fpgs e ir cargándolos en ejecución al tiempo que se desplaza.

En cualquier caso he mirado la function_list y buscado todas las funciones que tienen "load" "bg" y "fpg", pero no encuentro nada que se parezca a lo que me dices, sólo estas funciones que no conocía:

INT FPG_ADD(INTEGER, INTEGER, INTEGER, INTEGER)
INT FPG_LOAD(STRING, POINTER)
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: Drumpi on October 28, 2009, 02:02:23 PM
Pues la segunda que pones es la carga de FPG en background, por el puntero se delata.
Lo que no recuerdo es cómo se sabía si había terminado de cargar.
Title: Re: Intro oficial para videojuegos programados con Bennu
Post by: Windgate on October 28, 2009, 09:03:58 PM
Ok Drumpi gracias, devuelve int así que supongo que el int será el id del fichero y en el pointer se guardará el resultado de fin de carga cuando se termine de cargar.

Y si no es así pues al revés, es como cuando uso senos y cosenos, pruebo una forma y si no sale bien pues pruebo la otra ;D