Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

VLCVideoPlayer - RPG Maker

Ver el tema anterior Ver el tema siguiente Ir abajo

VLCVideoPlayer - RPG Maker

Mensaje por Metalero el 2014-08-25, 02:09

VLCVideoPlayer
VLCVideoPlayer es un proyecto que tiene la idea de ser la solución definitiva al dilema de la reproducción de vídeos en el RPG Maker (mas que nada en el XP y el VX)
VLCVideoPlayer se basa en el poder del conocido reproductor VLC. Esto permite olvidarse de una vez por todas de la problemática cuestión de la incompatibilidad de codecs que suele haber con los scripts de este tipo.
Como funciona
La mayoría de los scripts que circulan en el ambiente utilizan librerías de Windows para la reproducción de los vídeos, simplemente inician el servicio a través de ciertas dll, y se olvidan del resto. El problema es que esto deja puramente en manos del sistema operativo el manejo del vídeo en si. Si el sistema no tiene configurados los codecs necesarios, el vídeo no funciona. Una solución seria distribuir el juego con instaladores para los codecs, pero esto requeriría que el usuario los instale. Otra opción seria configurar un instalador que ademas de instalar el juego instale los codecs, pero no es tan sencillo.
VLCVideoPlayer en cambio usa VLC. Y VLC tiene su propio sistema de "decoding" de video a traves de un gran conjunto de librerias denominados "plugins".
De esta forma, el juego se puede distribuir con estas librerias sin la necesidad de tener que instalar nada.
Compatibilidades
Por el momento solo lo probé en el RMXP, pero teoricamente deberia funcionar en cualquier Maker.
Tampoco deberia traer ningun tipo de problemas con otros scripts, ya que es bastante sencillo (lo "feo" esta en la dll, y digo feo no por que sea mucho codigo, si no por que fue bastante complicado configurarlo para que funcione) y no toca nada nativo del maker.

Edit: para que el "Fullscreen" funcione correctamente, es necesario NO PERMITIR el uso de Alt+Enter. En su lugar, la liberia (VideoPlayer.dll) tiene un metodo que se encarga de esto. Esto es necesario ya que la libreria debe ser quien se encargue de tener control sobre el fullscreen. Para eso es necesario agregar un script mas (gracias newold) para evitar que Alt+Enter habilite el fullscreen.


Como se usa
Antes que nada, es necesario saber que este sistema utiliza dll.
Para que todo funcione es necesario agregar algunas cosas al proyecto:


  • VideoPlayer.dll: mi dll, que hace puente entre el maker y VLC
  • libvlc.dll: libreria principal de VLC, que contiene todas las definiciones e interfaces.
  • libvlccore.dll: core de vlc, aca (intuyo) esta la maquinaria pesada.
  • plugins [carpeta]:  esta carpeta tiene muchas liberias que se encargan de diferentes funcionalidades de VLC. Noten que esta carpeta es muy pesada (~60 mb), sin embargo no todo lo que esta adentro es necesario. Quienes usen el script, y dependiendo de los tipos de videos (encoding de video, encoding de audio, subtitulos, etc), van a requerir algunas cosas y otras no. Mi recomendacion es que una vez tengan todos los videos que quieran usar, vayan probando de borrar archivos de la carpeta plugins y vean que cosas son necesarias (si las sacan les va a crashear la app) y que cosas no.


Todo esto esta en el demo, y tiene que situarse en el mismo directorio del Game.exe


Ya si dentro del maker, hay dos scripts:

VLCVideoPlayer
Código:

#==============================================================================
# ** VideoPlayer
#------------------------------------------------------------------------------
#  This class performs title screen processing.
#  
#------------------------------------------------------------------------------
# Autor: Juan Martin Leiva [Metalero]
# Anyone can use this script and the VideoPlayer.dll as long as you give me
# visible credits in your game.
#==============================================================================
class VLCVideoPlayer
  
  DLL_NAME = "VideoPlayer.dll";
  
  #--------------------------------------------------------------------------
  # Initialize DLL Functions
  # THIS MUST BE CALLED BEFORE ANYTHING ELSE
  #--------------------------------------------------------------------------
  def self.Initialize()
    @FindWindow       = Win32API.new('user32', 'FindWindow', 'pp', 'i')
    @Initialize       = Win32API.new(DLL_NAME, "Initialize", "p", "v")
    @PreparePlayer    = Win32API.new(DLL_NAME, "PreparePlayer", "v", "v")
    @SetFullscreen    = Win32API.new(DLL_NAME, "SetFullscreen", "i", "v")
    @PlayVideo        = Win32API.new(DLL_NAME, "PlayVideo", "p", "v")
    @StopVideo        = Win32API.new(DLL_NAME, "StopVideo", "v", "v")
    @PausePlayVideo   = Win32API.new(DLL_NAME, "PausePlayVideo", "v", "v")
    @GetTotalTime     = Win32API.new(DLL_NAME, "TotalTime", "v", "L")
    @GetCurrentTime   = Win32API.new(DLL_NAME, "CurrentTime", "v", "l")
    @HasEnded         = Win32API.new(DLL_NAME, "HasEnded", "v", "i")
    @IsPlaying        = Win32API.new(DLL_NAME, "IsPlaying", "v", "i")
    @DestroyPlayer    = Win32API.new(DLL_NAME, "DestroyPlayer", "v", "v")

    @hwnd = @FindWindow.call('RGSS Player', nil)
    
    @Initialize.call(@hwnd)
  end
  
  #--------------------------------------------------------------------------
  # PreparePlayer
  #--------------------------------------------------------------------------
  def self.PreparePlayer()
     @PreparePlayer.call()
  end
  
  #--------------------------------------------------------------------------
  # Toggle fullscreen mode
  #--------------------------------------------------------------------------
  def self.SetFullscreen(enabled)
     @SetFullscreen.call(enabled ? 1 : 0)
  end
  #--------------------------------------------------------------------------
  # Start video at path "path", referred to the exe location
  #--------------------------------------------------------------------------
  def self.PlayVideo(path)
    @PlayVideo.call(path)
  end
  
  #--------------------------------------------------------------------------
  # Stops the video (this only stops the video but doesn't close the player
  #--------------------------------------------------------------------------
  def self.StopVideo()
    @StopVideo.call()
  end
  
  #--------------------------------------------------------------------------
  # If playing, it pauses the video. If paused, it resumed the video
  # For some formats, this may not be available
  #--------------------------------------------------------------------------
  def self.PausePlayVideo()
    @PausePlayVideo.call()
  end
  
  #--------------------------------------------------------------------------
  # Duration of the video in ms. For some formats, this may not be available
  #--------------------------------------------------------------------------
  def self.GetTotalTime()
    return @GetTotalTime.call()
  end
  
  #--------------------------------------------------------------------------
  # Current position of the player in ms.
  # For some formats, this may not be available
  #--------------------------------------------------------------------------
  def self.GetCurrentTime()
    return @GetCurrentTime.call()
  end
  
  #--------------------------------------------------------------------------
  # Returns true if the video has reached the end. False otherwise
  #--------------------------------------------------------------------------
  def self.HasEnded()
    return @HasEnded.call() != 0
  end

  #--------------------------------------------------------------------------
  # Returns true if the video is playing. False otherwise
  #--------------------------------------------------------------------------
  def self.IsPlaying()
    return IsPlaying.call() != 0
  end
  
  #--------------------------------------------------------------------------
  # Destroys the player, and releases all the memory involved, returning the
  # window screen to RPG Maker's control.
  #--------------------------------------------------------------------------
  def self.DestroyPlayer()
    @DestroyPlayer.call()
  end
end

VLCVideoPlayer.Initialize()








VIEJO:
Spoiler:

Código:

#==============================================================================
# ** VideoPlayer
#------------------------------------------------------------------------------
#  This class performs title screen processing.
#  
#------------------------------------------------------------------------------
# Autor: Juan Martin Leiva [Metalero]
# Anyone can use this script and the VideoPlayer.dll as long as you give me
# visible credits in your game.
#==============================================================================
class VLCVideoPlayer
  
  DLL_NAME = "VideoPlayer.dll";
  
  #--------------------------------------------------------------------------
  # Initialize DLL Functions
  # THIS MUST BE CALLED BEFORE ANYTHING ELSE
  #--------------------------------------------------------------------------
  def self.Initialize()
    @FindWindow       = Win32API.new('user32', 'FindWindow', 'pp', 'i')
    @InitializePlayer = Win32API.new(DLL_NAME, "InitializePlayer", "p", "v")
    @ToggleFullscreen = Win32API.new(DLL_NAME, "ToggleFullscreen", "v", "v")
    @PlayVideo        = Win32API.new(DLL_NAME, "PlayVideo", "p", "v")
    @StopVideo        = Win32API.new(DLL_NAME, "StopVideo", "v", "v")
    @PausePlayVideo   = Win32API.new(DLL_NAME, "PausePlayVideo", "v", "v")
    @GetTotalTime     = Win32API.new(DLL_NAME, "GetTotalTime", "v", "L")
    @GetCurrentTime   = Win32API.new(DLL_NAME, "GetCurrentTime", "v", "l")
    @HasEnded         = Win32API.new(DLL_NAME, "HasEnded", "v", "i")
    @IsPlaying        = Win32API.new(DLL_NAME, "IsPlaying", "v", "i")
    @DestroyPlayer    = Win32API.new(DLL_NAME, "DestroyPlayer", "v", "v")
    
    hwnd = @FindWindow.call('RGSS Player', nil)
    @InitializePlayer.call(hwnd)
  end
  
  #--------------------------------------------------------------------------
  # Toggle fullscreen mode
  #--------------------------------------------------------------------------
  def self.ToggleFullscreen
     @ToggleFullscreen.call()
  end
  
  #--------------------------------------------------------------------------
  # Start video at path "path", referred to the exe location
  #--------------------------------------------------------------------------
  def self.PlayVideo(path)
     @PlayVideo.call(path)
  end
  
  #--------------------------------------------------------------------------
  # Stops the video (this only stops the video but doesn't close the player
  #--------------------------------------------------------------------------
  def self.StopVideo()
    @StopVideo.call()
  end
  
  #--------------------------------------------------------------------------
  # If playing, it pauses the video. If paused, it resumed the video
  # For some formats, this may not be available
  #--------------------------------------------------------------------------
  def self.PausePlayVideo()
    @PausePlayVideo.call()
  end
  
  #--------------------------------------------------------------------------
  # Duration of the video in ms. For some formats, this may not be available
  #--------------------------------------------------------------------------
  def self.GetTotalTime()
    return @GetTotalTime.call()
  end
  
  #--------------------------------------------------------------------------
  # Current position of the player in ms.
  # For some formats, this may not be available
  #--------------------------------------------------------------------------
  def self.GetCurrentTime()
    return @GetCurrentTime.call()
  end
  
  #--------------------------------------------------------------------------
  # Returns true if the video has reached the end. False otherwise
  #--------------------------------------------------------------------------
  def self.HasEnded()
    return @HasEnded.call() != 0
  end

  #--------------------------------------------------------------------------
  # Returns true if the video is playing. False otherwise
  #--------------------------------------------------------------------------
  def self.IsPlaying()
    return IsPlaying.call() != 0
  end
  
  #--------------------------------------------------------------------------
  # Destroys the player, and releases all the memory involved, returning the
  # window screen to RPG Maker's control.
  #--------------------------------------------------------------------------
  def self.DestroyPlayer()
    @DestroyPlayer.call()
  end
end












Esta clase contiene toda las las llamadas a la DLL. Para usarla, desde cualquier lado debe llamarse:

VLCVideoPlayer.Initialize() - (inicializa las librerías, debe llamarse antes que cualquier otra función de la clase)
VLCVideoPlayer.PreparePlayer() - (inicializa el player de VLC, debe llamarse antes de hacer nada con el reproductor)
VLCVideoPlayer.ToggleFullscreen() - Intercambia el modo normal y pantalla complete [NO FUNCIONA TODAVIA]
VLCVideoPlayer.PlayVideo(path) - Reproduce el video en "path" referido a la ubicación del Game.exe
VLCVideoPlayer.StopVideo() - Detiene la reproducción (pero no sale del modo "Player")
VLCVideoPlayer.PausePlayVideo() - Pausa / Resume el Player
VLCVideoPlayer.GetTotalTime() - Devuelve la duración del vídeo en milisegundos
VLCVideoPlayer.GetCurrentTime() - Devuelve la posición actual del vídeo en milisegundos
VLCVideoPlayer.HasEnded() - Devuelve true si el vídeo llegó a su fin. false si no.
VLCVideoPlayer.IsPlaying() - Devuelve true si el vídeo se está reproduciendo. false si no.
VLCVideoPlayer.DestroyPlayer() - Destruye el player, y libera la memoria relacionada a éste, y devuelve el control de la ventana al RPG Maker.
VLCVideoPlayer.SetFullscreen(enable) - Enciende y apaga el fullscreen.
VLCVideoPlayer.IsFullscreen() - Devuelve true si actualmente se esta en modo fullscreen. false en caso contrario.


Avoid Alt+Enter
Código:

# ------------------------------------------------------------------------------
module HotKeys # by newold
  # ············································································
  RegisterHotKey = Win32API.new('user32', 'RegisterHotKey', 'LIII', 'I')
  UnregisterHotKey = Win32API.new('user32', 'UnregisterHotKey', 'II', 'I')
  FKeys = {
    'F1' => 0x70, 'F2' => 0x71, 'F3' => 0x72, 'F4' => 0x73, 'F5' => 0x74,
    'F6' => 0x75, 'F7' => 0x76, 'F8' => 0x77, 'F9' => 0x78, 'F10' => 0x79,
    'F11' => 0x7A, 'F12' => 0x7B
  }
  Enter = 0x0D
  ALT = 0x0001
  CTRL = 0x0002
  SHIFT = 0x0004
  WIN = 0x0008
  @id = 1
  # ············································································
  def self.set(modKey,key, id=nil)
    if id.class == Fixnum
      RegisterHotKey.call(0, id, modKey, key)
    else
      RegisterHotKey.call(0, @id, modKey, key)
      @id += 1
    end
  end
  # ············································································
  def self.delete(id)
    return unless id.class == Fixnum
    UnregisterHotKey.call(0,id)
  end
  # ············································································
end

HotKeys.set(HotKeys::ALT,HotKeys::Enter,0)








Scene_VideoPlayer

Código:

#==============================================================================
# ** Scene_VideoPlayer
#------------------------------------------------------------------------------
#  Sample to use the VLCVideoPlayer class.
#==============================================================================

class Scene_VideoPlayer
  def initialize(path)
    @path = path
  end
  
  #--------------------------------------------------------------------------
  # * Main Processing
  #--------------------------------------------------------------------------
  def main
    VLCVideoPlayer.PreparePlayer()
    VLCVideoPlayer.PlayVideo(@path)
    
    # Stop playing ME and BGS
    Audio.me_stop
    Audio.bgs_stop
    # Execute transition
    Graphics.transition
    # Main loop
    loop do
      # Update game screen
      Graphics.update
      # Update input information
      Input.update
      # Frame update
      update
      # Abort loop if screen is changed
      if $scene != self
        break
      end
    end
    # Prepare for transition
    Graphics.freeze
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
        
    if Input.trigger?(Input::C)
      VLCVideoPlayer.PausePlayVideo()
    end
    
    if VLCVideoPlayer.HasEnded() or Input.trigger?(Input::B)
      VLCVideoPlayer.DestroyPlayer()
      $scene = Scene_Map.new()
    end
  end
end








VIEJO
Spoiler:

Código:

#==============================================================================
# ** Scene_VideoPlayer
#------------------------------------------------------------------------------
#  Sample to use the VLCVideoPlayer class.
#==============================================================================

class Scene_VideoPlayer
  def initialize(path)
    @path = path
  end
  
  #--------------------------------------------------------------------------
  # * Main Processing
  #--------------------------------------------------------------------------
  def main
    VLCVideoPlayer.Initialize()
    VLCVideoPlayer.PlayVideo(@path)
    
    # Stop playing ME and BGS
    Audio.me_stop
    Audio.bgs_stop
    # Execute transition
    Graphics.transition
    # Main loop
    loop do
      # Update game screen
      Graphics.update
      # Update input information
      Input.update
      # Frame update
      update
      # Abort loop if screen is changed
      if $scene != self
        break
      end
    end
    # Prepare for transition
    Graphics.freeze
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    if Input.trigger?(Input::C)
      VLCVideoPlayer.PausePlayVideo()
    end
    
    if VLCVideoPlayer.HasEnded() or Input.trigger?(Input::B)
      VLCVideoPlayer.DestroyPlayer()
      $scene = Scene_Map.new()
    end
    
    if Input.trigger?(Input::A)
      VLCVideoPlayer.ToggleFullscreen()
      p "asdas"
    end
  end
end












Un scene de muestra, para demostrar como funciona el sistema (no tiene mucha ciencia)

Simplemente se pegan ambos scripts sobre main, y ya esta.

Bugs conocidos
Principalmente hay 2 (relacionados con lo mismo):


  1. Si se maximiza la ventana (con alt+enter) en medio de una reproducción, crashea la aplicación.
  2. Si se maximiza la ventana (con alt+enter) ANTES de la reproducción, y luego se reproduce un vídeo, solo se escucha el sonido y queda la pantalla negra
  3. Aun no se puede cambiar el modo fullscreen (on/off) en medio de una reproduccion (si lo hacen, pasan cosas raras)
  4. En fullscreen el video toma el tamaño de la pantalla (como el maker), por lo tanto si tienen un monitor widescreen, se ve estirado (como el maker XD)


Voy a seguir trabajando durante estos días en arreglar ambos problemas.

Demo
Ahora si, el demo.
Es bastante simple, hay 5 videos con diferentes formatos, y pueden reproducir, pausar y quitar cada uno. (instrucciones dentro del demo)
Me seria muy útil que quienes lo prueben, me den un feedback respecto al desempeño de todos los videos: fallos visuales, fallos de sonido, crashes, etc. ya que tengo pensado usar esto en un juego en el que estoy trabajando, y quiero saber que tan estable es.
En mi computadora (sacando de lado los problemas de la pantalla complete que mencione antes), el unico detalle que tengo, es que en el 2º video (el .wmv), en los primeros 5 segundos, se ven "artifacts" (tipicos de problemas de decodeo) (si no saben a que me refiero, se ve mal la imagen, toda casi del mismo color).

(Nota: el 3º video (el .mov) casi no tiene movimento (no sirve mucho para testear), y puse ese por que fue lo primero que encontré, si alguien quiere probar con otro es bienvenido))
Tambien seria bueno si prueban con otros formatos.

PD: El demo no tiene los nuevos cambios del MODO FULLSCREEN. Para evitar tener que estar subiendo otra version (y que ustedes tengan que bajar otra version), solo voy a subir el la nueva DLL. Solamente tienen que reemplazar la DLL del demo por la nueva, reemplazar los scripts por los nuevos subidos, ya agregar el script "Avoid Alt+Enter" (si, es molesto, pero el demo es muy pesado)
El nuevo demo ya tiene los ultimos cambios y la nueva DLL
El demo tiene la DLL anterior, es recomendable reemplazarla por la ultima DLL subida (ver abajo), para maxima compatibilidad e independencia de otras librerias.

DEMO: https://mega.co.nz/#!wp9nDZrS!-9rCabqito2lS5bSfVLdT7tu0ircZWRVmOvK90QU9_A
http://www.4shared.com/rar/oHsJKnEoce/VideoTest.html


DLL:
Cambiada la DLL. La compile de un modo diferente para evitar dependencias del "Microsoft Redistributable Package"
https://mega.co.nz/#!c58wzQoJ!u2LLWvXWRSLHjzmQmtx31tuYMOamfbGAwS_rSwTDJ3Q

https://mega.co.nz/#!h8siQRQR!3UHNSo4wxGeuXe-oQZ-aLtw6D3m2_FK93XvpDAH87YE

Misc.
Ya esta bien claro en el demo, y repito acá:

Cualquiera puede utilizar o distribuir VLCVideoPlayer - RPG Maker, siempre y cuando me nombre [Juan Martin Leiva] visiblemente en los créditos.

El código fuente de la DLL no lo voy a subir, ya que no le veo mucho sentido.
Si alguien está interesado, puede mandarme un PM para pedirmelo.


¡Que lo disfruten!


Última edición por Metalero el 2014-12-09, 00:23, editado 4 veces

_________________
avatar
Metalero
Administrador
Administrador



Créditos 1710

Gracias : 100

Volver arriba Ir abajo

Re: VLCVideoPlayer - RPG Maker

Mensaje por newold el 2014-08-25, 16:01

para evitar el bug de alt + enter, puedes desactivar esa combinación de teclas mientras se reproduce el vídeo y volverla a activar cuando termine usando esto:

Código:
# ------------------------------------------------------------------------------
module HotKeys # by newold
  # ············································································
  RegisterHotKey = Win32API.new('user32', 'RegisterHotKey', 'LIII', 'I')
  UnregisterHotKey = Win32API.new('user32', 'UnregisterHotKey', 'II', 'I')
  FKeys = {
    'F1' => 0x70, 'F2' => 0x71, 'F3' => 0x72, 'F4' => 0x73, 'F5' => 0x74,
    'F6' => 0x75, 'F7' => 0x76, 'F8' => 0x77, 'F9' => 0x78, 'F10' => 0x79,
    'F11' => 0x7A, 'F12' => 0x7B
  }
  Enter = 0x0D
  ALT = 0x0001
  CTRL = 0x0002
  SHIFT = 0x0004
  WIN = 0x0008
  @id = 1
  # ············································································
  def self.set(modKey,key, id=nil)
    if id.class == Fixnum
      RegisterHotKey.call(0, id, modKey, key)
    else
      RegisterHotKey.call(0, @id, modKey, key)
      @id += 1
    end
  end
  # ············································································
  def self.delete(id)
    return unless id.class == Fixnum
    UnregisterHotKey.call(0,id)
  end
  # ············································································
end
# ------------------------------------------------------------------------------



# Disable Alt + Enter
HotKeys.set(HotKeys::ALT,HotKeys::Enter,0)
# Enable Alt + Enter
HotKeys.delete(0)
avatar
newold
Principiante
Principiante

0/3

Créditos 1232

Gracias : 119

Volver arriba Ir abajo

Re: VLCVideoPlayer - RPG Maker

Mensaje por Metalero el 2014-08-27, 00:41

Aviso! Actualizé el tema, ya esta "casi" arreglar el tema del Fullscreen (leer el post).

Gracias newold por el snipset para desactivar el Alt+Enter, lo estoy usando en la nueva version.

Para arreglarlo tuve que usar alguno "hacks" medio feos, pero salió andando (aun hay algunas cosas que arreglar, pero creo que en esta instancia ya esta usable)
Tengan en cuenta (todo esta explicado en el post principal), que es necesario que el Fullscreen lo maneje puramente la DLL, por eso tuve que deshabilitar el Alt+Enter.
Ahora hay una nueva funcion en el script principal para manejar esto (no solo cuando se reproduce un video, sino para el juego en general). Calculo que se puede o bien poner con un evento comun, o un script, para que al presionar cierta tecla, se ejecute dicha funcion (y que el usuario pueda cambiar a pantalla completa cuando quiera, pero sin usar Alt+Enter).

_________________
avatar
Metalero
Administrador
Administrador



Créditos 1710

Gracias : 100

Volver arriba Ir abajo

Re: VLCVideoPlayer - RPG Maker

Mensaje por newold el 2014-08-27, 10:15

el alt+enter deberías desactivarlo solo al reproducir el vídeo y volverlo a activar al terminar éste, ya que el script desactiva el alt+enter para todos los programas abiertos (las hotkeys son globales de window, alt+enter, alt+f4...).

Yo no se hacerlo, pero lo suyo es crear un hook que intercepte las teclas antes de ser pasadas a la ventana del maker, o una dll (o exe) cargada en paralelo que compruebe si la ventana del maker es la ventana activa, y si lo es, desactivar alt+enter con win32api (RegisterHotKey = Win32API.new('user32', 'RegisterHotKey', 'LIII', 'I')), y si no, volverlo a activar (UnregisterHotKey = Win32API.new('user32', 'UnregisterHotKey', 'II', 'I'))
avatar
newold
Principiante
Principiante

0/3

Créditos 1232

Gracias : 119

Volver arriba Ir abajo

Re: VLCVideoPlayer - RPG Maker

Mensaje por Metalero el 2014-08-27, 12:44


el alt+enter deberías desactivarlo solo al reproducir el vídeo y volverlo a activar al terminar éste, ya que el script desactiva el alt+enter para todos los programas abiertos (las hotkeys son globales de window, alt+enter, alt+f4...).


No sabia eso, sin embargo activarlo solo cuando hay un video activo no es una opción, ya que es necesario que la DLL maneje el fullscreen (en realidad usa una especie de fullscreen "falso" para los videos y si se hace el fullscreen normal de alt+enter funciona mal)

Lo que voy a probar es usar las funciones RegisterHotKey y UnregisterHotKey, pasandole correctamente el primer parametro.
Segun la documentacion, si se le pasa NULL (o cero), lo registra para el Thread en que se llamo en general. Pero si se le pasa un Window Handle (HWND), lo hace solo para ventana (lo cual haria lo que necesito)

_________________
avatar
Metalero
Administrador
Administrador



Créditos 1710

Gracias : 100

Volver arriba Ir abajo

Re: VLCVideoPlayer - RPG Maker

Mensaje por caphiphopstudio el 2014-09-05, 22:06

Haber si me entero, con esto podría poner vídeos en el juego y puedan verlos todos sin tener que descargarse nada y solo con el juego?
avatar
caphiphopstudio
Novato
Novato

0/3

Créditos 80

Gracias : 2

Volver arriba Ir abajo

Re: VLCVideoPlayer - RPG Maker

Mensaje por Metalero el 2014-09-06, 02:16

Subi una nueva DLL, compildad en modo /MT, para evitar dependencias del Microsoft Redistributable Package.


Haber si me entero, con esto podría poner vídeos en el juego y puedan verlos todos sin tener que descargarse nada y solo con el juego?


Si, esa es la idea. Aunque no ha habido mucho feedback como para ver que desenpeño tiene, a la (poca) gente que lo probó, le funcionó correctamente.

_________________
avatar
Metalero
Administrador
Administrador



Créditos 1710

Gracias : 100

Volver arriba Ir abajo

Re: VLCVideoPlayer - RPG Maker

Mensaje por Alec_Dias el 2014-12-08, 01:55

Disculpa buenas noches, soy nuevo en el foro y he estado investigando sobre como deshabilitar las teclas F1 a la F12, podrias indicarme como podria configurar u ordenar las lineas de codigo que utilizaste para deshabilitar las teclas Alt + enter? de verdad te lo agradeceria mucho es un tema que siempre he querido resolver, muchas gracias, hasta pronto.
avatar
Alec_Dias
Iniciado
Iniciado

0/3

Créditos 2

Gracias : 2

Volver arriba Ir abajo

Re: VLCVideoPlayer - RPG Maker

Mensaje por MarstonMuere el 2014-12-08, 12:15

Buenas Metalero, lo he testeado y funciona perfectamente (Incluso con el drago engine de LittleDrago que ya es difícil que algo vaya con sus scripts xD), asi que nada mas que decir que esta bestial! Vaya currada en serio! Vas directo a los créditos de mi juego xD Una cosilla, igual lo has comentado pero no estoy seguro de ello; ¿Hay alguna forma de que el vídeo no se pueda omitir? Vamos que lo tengas que ver si o si.
avatar
MarstonMuere
Iniciado
Iniciado

0/3

Créditos 25

Gracias : 5

Volver arriba Ir abajo

Re: VLCVideoPlayer - RPG Maker

Mensaje por Leaser el 2014-12-08, 22:56

Probaste en Ace esto? Porque si bien Ace trae soporte de video propio no permite omisión de los mismos, tenés que ver sí o sí todo el video. Sería buena una alternativa a ese problema.

De todas formas, veo que prácticamente solucionaste uno de los viejos problemas conocidos sobre los cuales charlamos tantas veces jajajajaj bien!

Saludos
avatar
Leaser
Principiante
Principiante

0/3

Créditos 1007

Gracias : 3

Volver arriba Ir abajo

Re: VLCVideoPlayer - RPG Maker

Mensaje por Metalero el 2014-12-09, 00:32


Disculpa buenas noches, soy nuevo en el foro y he estado investigando sobre como deshabilitar las teclas F1 a la F12, podrias indicarme como podria configurar u ordenar las lineas de codigo que utilizaste para deshabilitar las teclas Alt + enter? de verdad te lo agradeceria mucho es un tema que siempre he querido resolver, muchas gracias, hasta pronto.




Use el codigo que paso newold:

Código:

# ------------------------------------------------------------------------------
module HotKeys # by newold
  # ············································································
  RegisterHotKey = Win32API.new('user32', 'RegisterHotKey', 'LIII', 'I')
  UnregisterHotKey = Win32API.new('user32', 'UnregisterHotKey', 'II', 'I')
  FKeys = {
    'F1' => 0x70, 'F2' => 0x71, 'F3' => 0x72, 'F4' => 0x73, 'F5' => 0x74,
    'F6' => 0x75, 'F7' => 0x76, 'F8' => 0x77, 'F9' => 0x78, 'F10' => 0x79,
    'F11' => 0x7A, 'F12' => 0x7B
  }
  Enter = 0x0D
  ALT = 0x0001
  CTRL = 0x0002
  SHIFT = 0x0004
  WIN = 0x0008
  @id = 1
  # ············································································
  def self.set(modKey,key, id=nil)
    if id.class == Fixnum
      RegisterHotKey.call(0, id, modKey, key)
    else
      RegisterHotKey.call(0, @id, modKey, key)
      @id += 1
    end
  end
  # ············································································
  def self.delete(id)
    return unless id.class == Fixnum
    UnregisterHotKey.call(0,id)
  end
  # ············································································
end




Código:

# Disable Alt + Enter
HotKeys.set(HotKeys::ALT,HotKeys::Enter,0)
# Enable Alt + Enter
HotKeys.delete(0)




Teoricamente, bastaria hacer esto ultimo, pero usando el codigo de los "Efes"

Código:

# Disable Alt + Enter
HotKeys.set(HotKeys::FKeys['F1'],HotKeys::FKeys['F12'])
# Enable Alt + Enter
HotKeys.delete(0)




No lo probé, pero deberia funcionar.


Buenas Metalero, lo he testeado y funciona perfectamente (Incluso con el drago engine de LittleDrago que ya es difícil que algo vaya con sus scripts xD), asi que nada mas que decir que esta bestial! Vaya currada en serio! Vas directo a los créditos de mi juego xD Una cosilla, igual lo has comentado pero no estoy seguro de ello; ¿Hay alguna forma de que el vídeo no se pueda omitir? Vamos que lo tengas que ver si o si.




Esto ya lo hice hace bastante, asi que no me acuerdo muy bien, pero se supone que en

Código:

if VLCVideoPlayer.HasEnded() or Input.trigger?(Input::B)
      VLCVideoPlayer.DestroyPlayer()
      $scene = Scene_Map.new()
end


Quitando el Input.trigger?(Input::B), no se deberia poder omitir.

Código:

if VLCVideoPlayer.HasEnded()
      VLCVideoPlayer.DestroyPlayer()
      $scene = Scene_Map.new()
end


Incluso, si querés, se podria poner algo asi:

Código:

if  VLCVideoPlayer.HasEnded()  or ($game_switches[XXX] and Input.trigger?(Input::B) )
      VLCVideoPlayer.DestroyPlayer()
      $scene = Scene_Map.new()
end


Reemplazando XXX por un numero, para hacer que solo se pueda omitir si el switch XXX esta prendido.


Probaste en Ace esto? Porque si bien Ace trae soporte de video propio no permite omisión de los mismos, tenés que ver sí o sí todo el video. Sería buena una alternativa a ese problema.




La verdad no me acuerdo. En teoria seberia funcionar, pero habria que ver que nombre de proceso tiene el juego ejecutado con el Ace, ya que si no coincide, la DLL no va a poder encontrar la ventana (igualmente, si ese es el caso, hacer una nueva DLL para el ACE seria una pavada, habria que cambiar una linea)
Avisame si lo queres y lo hago, no tengo problemas.


De todas formas, veo que prácticamente solucionaste uno de los viejos problemas conocidos sobre los cuales charlamos tantas veces jajajajaj bien!




Jajaja, si. Me acuerdo la porquería esa que había hecho con todas las imágenes... había tantas que necesitaba una pantalla de carga... pero se veía re bien


Última edición por Metalero el 2014-12-09, 04:33, editado 1 vez

_________________
avatar
Metalero
Administrador
Administrador



Créditos 1710

Gracias : 100

Volver arriba Ir abajo

Re: VLCVideoPlayer - RPG Maker

Mensaje por Leaser el 2014-12-09, 03:50

Si lo querés hacer tendrías el script con compatibilidad para los 3 makers, ya ya no lo necesito, pero me pareció interesante preguntar.

Y sí, necesitaba pantalla de carga pero se veía MUY bien. Ya hace 5 años... como pasa el tiempo ehh! jajajajajaj Tardaste pero lo solucionaste.

Saludos!
avatar
Leaser
Principiante
Principiante

0/3

Créditos 1007

Gracias : 3

Volver arriba Ir abajo

Re: VLCVideoPlayer - RPG Maker

Mensaje por Alec_Dias el 2014-12-11, 01:26

Muchas gracias Metalero por tu respuesta la voy a poner en practica, saludos.
avatar
Alec_Dias
Iniciado
Iniciado

0/3

Créditos 2

Gracias : 2

Volver arriba Ir abajo

Re: VLCVideoPlayer - RPG Maker

Mensaje por VampioroAzul el 2016-07-15, 19:02

Estan todos los links caidos... thumbdown
avatar
VampioroAzul
Iniciado
Iniciado

0/3

Créditos 13

Gracias : 2

Volver arriba Ir abajo

Re: VLCVideoPlayer - RPG Maker

Mensaje por Dangaioh el 2016-07-16, 16:45

@VampioroAzul escribió:Estan todos los links caidos... thumbdown

Sí necesitas ayuda con línks q ya no están disponibles , pide ayuda en la sección de link caídos, no hagas necroposting, gracias

_________________





avatar
Dangaioh
Administrador
Administrador



Créditos 5785

Gracias : 96

Volver arriba Ir abajo

Re: VLCVideoPlayer - RPG Maker

Mensaje por Oscar92player el 2017-11-16, 13:27

Chicos, lamento de veras el necropost, pero ya posteé en el tema de Links rotos y nadie parece tener una respuesta.

¿Podría ser posible contactar con Metalero para conseguir nuevos enlaces al script, las DLLs y add-ons necesarios? O en todo caso, si algún otro usuario tuviese el proyecto con todo lo demás se lo agradecería.

De nuevo, siento hacer necroposting, pero me gustaría mucho echarle un vistazo al script, y ver si puedo hacer que los vídeos se reproduzcan sin muchos más problemas.
avatar
Oscar92player
Principiante
Principiante

0/3

Créditos 346

Gracias : 39

Volver arriba Ir abajo

Re: VLCVideoPlayer - RPG Maker

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


Permisos de este foro:
No puedes responder a temas en este foro.