¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.
Conectarse

Recuperar mi contraseña

Temas importantes
----------------------------------------
Páginas con recursos RPG Maker
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
Afiliados
Estadísticas
Tenemos 3378 miembros registrados.
El último usuario registrado es Max003.

Nuestros miembros han publicado un total de 79742 mensajes en 11241 argumentos.
Navega con Google Chrome
[DESCARGA]

Probando tonteces con Win32API

 :: RPG Maker :: Scripts

Ver el tema anterior Ver el tema siguiente Ir abajo

Probando tonteces con Win32API

Mensaje por Wecoc el 2014-01-28, 16:05

Estaba probando tonterías con el Win32API a ver qué sacaba de bueno, pero es que no tengo ni idea de hasta donde se puede llegar con ello. Quería hacer algunos experimentos... xD Conste que no soy programador y la mayoría de cosas para mí son chino mandarino.

Resulta que hay un programa parecido al Resource Hacker llamado Dependency Walker que devuelve todas las funciones usadas por el exe o dll, y quise probar algunas via script. Lo único que logré fue maximizar la ventana del maker usando ShowWindow.call(hwnd, 3) y minimizar la ventana con CloseWindow.call(hwnd) los dos usando user32.dll

Pero lo que quería era hacer alguna de éstas cosas:

- Poner la pantalla del maker a cierto zoom, por ejemplo a 2x como en maker antíguos.

Siempre me gustó más la resolución de pantalla que ofrecen los maker antíguos, supongo que usan ResizeMode a la ventana desde el C# o algo así (chino mandarino)
Se de sobra que no hay opción para cambiar el zoom de la pantalla via script call pero encontré algo dentro del método ChangeDisplaySettings de user32 que parece que controla el tamaño de los píxeles de la ventana. Ni idea de como funciona, cuando cargo EnumDisplaySettings al maker se lo carga xDD

- Evitar minimize.

Cuando minimizas la ventana la música sigue sonando y el juego no y eso puede descuadrar escenas, quería ver si se podía hacer que el juego siempre estuviera en la prioridad más alta y no se pudiera minimizar o cambiar de ventana mientras estuviera activo.

- Cambiar el Title de la ventana.

Cambiar el título del juego ingame. En realidad no se si tiene mucha utilidad, solo quería probar si se podía pero no logré ver como va xD

- Aplicar get-pixel a viewports o a la ventana directamente.

Hay un método llamado GetPixel en el gdi32. Quise probarlo, pero me devuelve cosas raras como 0 o -1

(( Éste topic es para que comentéis si sabéis algo acerca de mis experimentos fallidos y también para que comentéis vuestros experimentos con Win32API que seguro que habréis hecho algunos ))

Spoiler:
Por si os interesa, aquí un script que maximiza la ventana

Código:
#==============================================================================
# Maximizar ventana
#==============================================================================

module Wecoc_Window
  #--------------------------------------------------------------------------
  GWL_STYLE = -16
  Readini = Win32API.new('kernel32', 'GetPrivateProfileStringA', 'pppplp', 'l')
  Findwindow = Win32API.new('user32', 'FindWindow', 'pp', 'l')
  ShowWindow = Win32API.new('user32', 'ShowWindow', 'll', 'l')
    
  #--------------------------------------------------------------------------
  def self.hwnd
    game_name = "\0" * 256
    Readini.call('Game','Title','',game_name,255,".//Game.ini")
    game_name.delete!("\0")
    return Findwindow.call('RGSS Player',game_name)
  end
  #--------------------------------------------------------------------------
  def self.maximize
    hwnd = self.hwnd
    ShowWindow.call(hwnd, 3) # Maximize
  end
  #--------------------------------------------------------------------------
end

Wecoc_Window.maximize

Y de regalo uno que hace que no puedas cerrar la ventana mediante la X excepto si estas en modo $DEBUG o $TEST (éste experimento lo hice hace tiempo y no tiene demasiado que ver con los demás pero bueno)

Código:
module Kernel
  alias debug_exit exit unless $@
  def exit(*args)
    if $DEBUG or $TEST
      debug_exit(*args)
    end
  end
end

Los dos deberían funcionar en XP, VX y Ace

Wecoc
Administrador
Administrador



Créditos 8263

Gracias : 372

Volver arriba Ir abajo

Re: Probando tonteces con Win32API

Mensaje por orochii el 2014-01-28, 18:41

Sólo una aclaración Wecoc, el RPG Maker 2k/2k3 está hecho en Delphi, no en C# xD.

El maximizar la ventana... bueno, podría usarse para ajustar siempre la resolución a la nativa de Windows xD. ¿No has probado quitándole el borde a la ventana? Se hace también con llamada al user32, pero no tengo idea cómo es xD, esas cosas yo no me las aprendo x'D.

El zoom de ventana... bueno, los makers antiguos no valen como ejemplo, si se puede simplemente aplicar zoom en el momento previo a dibujar la pantalla. Pero el ChangeDisplaySettings, eso sí ni idea xD.

El evitar Minimize, o más específicamente el evitar que el juego se detenga al perder el focus. Eso es cosa del intérprete, no lo vas a lograr con Win32. Había uno de esos Netplays que incluía un ejecutable hackeado para que siguiera corriendo el intérprete ruby si perdía el focus, pero ni idea cuál ni dónde encontrarlo (y tampoco estoy seguro fuera un Netplay xd, pero era para algún script de online).

El Title, en buena teoría debería ser fácil...

Yo creo que el GetPixel te funcionó xD. Al menos el 0 es razonable, es false si se toma como un bit apagado. Los valores negativos normalmente son valores de escape cuando una función crashea (cuando la función debía retornar un valor X, como un 0, y retorna alguna estupidez que estuviera en el momento en esa parte de la memoria).

Maldito Wecoc, me vienes con pruebas sepsis. ¡Ahora tendré razones para procastinar hoy haciendo pruebas con el Win32!

Es broma xD. Está interesante.

orochii
Caballero Shiro
Caballero Shiro

0/3

Créditos 6045

Gracias : 266

http://drekirokr.weebly.com/

Volver arriba Ir abajo

Re: Probando tonteces con Win32API

Mensaje por Wecoc el 2014-01-28, 20:55

Yo también creí que sería facil cambiar el título pero al cambiarlo se vuelve a poner el normal automáticamente.

Posteo mi script de pruebas, en el que hice dos cosas que putean al jugador pero bueno xDD
- Cuando minimizas vuelve a restaurarse automáticamente. ¡FLAS!
- Cuando mueves la ventana ésta vuelve a su sitio.

Código:
#==============================================================================
# Pruebas random
#==============================================================================

module Wecoc_Window
  #--------------------------------------------------------------------------
  GWL_STYLE = -16
  Readini = Win32API.new('kernel32', 'GetPrivateProfileStringA', 'pppplp', 'l')
  Findwindow = Win32API.new('user32', 'FindWindow', 'pp', 'l')
  ShowWindow = Win32API.new('user32', 'ShowWindow', 'll', 'l')
  GetWindowLong = Win32API.new('user32', 'GetWindowLong', 'll', 'l')
  SetWindowLong = Win32API.new('user32', 'SetWindowLong', 'lll', 'l')
  SetWindowPos = Win32API.new('user32', 'SetWindowPos', 'lllllll', 'l')
  SetWindowText = Win32API.new('user32', 'SetWindowText', 'lpl', 'l')
  #--------------------------------------------------------------------------
  def self.hwnd
    game_name = "\0" * 256
    Readini.call('Game','Title','',game_name,255,".//Game.ini")
    game_name.delete!("\0")
    return Findwindow.call('RGSS Player',game_name)
  end
  #--------------------------------------------------------------------------
  def self.show_normal
    hwnd = self.hwnd
    ShowWindow.call(hwnd, 1)
  end
  #--------------------------------------------------------------------------
  def self.define_normals
    style = GetWindowLong.call(hwnd, -16) & ~0x00000000
    SetWindowLong.call(hwnd, -16, style)
    SetWindowPos.call(hwnd, -2, 317, 241, 646, 512, 0)
  end
  #--------------------------------------------------------------------------
  def self.set_title(text)
    hwnd = self.hwnd
    SetWindowText.call(hwnd, text, text.size)
  end
end

module Kernel
  alias window_loop loop unless $@
  def loop(*args, &block)
    Wecoc_Window.show_normal # Cuando minimizas la ventana ésta vuelve a abrirse
                             # (Lo cual es tan inútil como yo aproximadamente)
    Wecoc_Window.define_normals # Cuando mueves la ventana ésta vuelve a su sitio
                                # (Ésto sirve para putear básicamente)
    window_loop(*args, &block)
  end
end

# class Win32API
#   alias window_call call unless $@
#   def call(*args, &block)
#     p self, args
#     window_call(*args, &block)
#   end
# end

Ahí está la... cosa xD Lo del GetPixel, no supe mucho como hacer la llamada así que no creo que me funcionara bien, aunque quien sabe.

A los que no sepáis como se llama el Win32API ahí tenéis ejemplos, jejeje.

Wecoc
Administrador
Administrador



Créditos 8263

Gracias : 372

Volver arriba Ir abajo

Re: Probando tonteces con Win32API

Mensaje por Ledai el 2014-01-28, 21:10

Bueno, no está muy mal... solo que la ventana me sale super abajo y queda medio juego sin verse XDDDD
Lo otro no me deja hacerlo; osea, que sí la minimiza con normalidad...

Ledai
Aventurero
Aventurero

0/3

Créditos 1360

Gracias : 124

http://ahurallg.blogspot.com.es/

Volver arriba Ir abajo

Re: Probando tonteces con Win32API

Mensaje por Wecoc el 2014-01-28, 23:04

Leda escribió:Bueno, no está muy mal... solo que la ventana me sale super abajo y queda medio juego sin verse XDDDD
Lo otro no me deja hacerlo; osea, que sí la minimiza con normalidad...


Lo de que la minimiza con normalidad quizá sea por la versión de Windows que estés usando. Ah, y tienes que considerar la diferencia entre minimizar y cambiar de ventana, no es lo mismo. Para que también funcionara cuando cambias de ventana habría que usar otro método pero no se cual.

Y lo de la posición sé que depende de la resolución de pantalla, a mi se me ve bien pero a algunos no se les moverá al centro. Para hacerlo de modo que se viera siempre bien habría que cargar las coordenadas default al iniciar la ventana y luego devolver esas, pero como es un script de prueba de llamada de Win32API no le di más importancia. Sería bueno si se pudiera hacer alguno de los 4 puntos en azul que dije, entre otras cosas, pero parece no ser posible.

Descubrí algunos scripts interesantes que usan éstas cosas a parte de los que ya conocía (por ejemplo reproducir vídeos o flash se hace con éstas cosas).

Uno de ellos es el Screen Module, algo así buscaba hacer yo. Y allí también juega un poco con el nombre del juego, aunque creo que solo lo devuelve xD

Orochii escribió:Maldito Wecoc, me vienes con pruebas sepsis. ¡Ahora tendré razones para procastinar hoy haciendo pruebas con el Win32!

Es broma xD. Está interesante.


En serio Orochii a ver si haces alguna prueba, a ti se te dan bien éstas cosas xD

Spoiler:


Seguiré probando cosas a ver si saco algo bueno de ésto. Ya os informaré.

¡Más tonteces con Win32API!

Éste script hace que cuando pongas nombre ("Poner nombre a personaje") al héroe (Id = 1), su nombre por defecto sea el user name del ordenador del que está cargando el juego (en mi caso sale "Wecoc")

Código:
class Window_NameEdit < Window_Base
  attr_reader  :name
  attr_reader  :index

  def initialize(actor, max_char)
    super(0, 0, 640, 128)
    self.contents = Bitmap.new(width - 32, height - 32)
   
    @GetComputerName  = Win32API.new('kernel32' ,"GetComputerName",['p','p'],'i')
    @GetUserName      = Win32API.new('advapi32' ,"GetUserName",['p','p'],'i')
   
    @actor = actor
    @name = actor.name
   
    if @actor.id == 1
      if @name == $data_actors[1].name
        @name = user_name
      end
    end
    @max_char = max_char

    name_array = @name.split(//)[0...@max_char]
    @name = ""
    for i in 0...name_array.size
      @name += name_array[i]
    end
    @default_name = @name
    @index = name_array.size
    refresh
    update_cursor_rect
  end

  def pc_name
    name = " " * 128
    @GetComputerName.call(name, "128")
    return(name.unpack("A*").first)
  end

  def user_name
    name = " " * 128
    @GetUserName.call(name, "128")
    return(name.unpack("A*").first)
  end
end


Es la primera vez que uso advapi32 para algo xD

Edito: Ahora que soy un poco más listo me doy cuenta que habría podido usar ENV -__-

Código:
class Window_NameEdit < Window_Base
  attr_reader  :name
  attr_reader  :index

  def initialize(actor, max_char)
    super(0, 0, 640, 128)
    self.contents = Bitmap.new(width - 32, height - 32)
 
    @GetComputerName  = ENV["USERDOMAIN"]
    @GetUserName      = ENV["USERNAME"]
 
    @actor = actor
    @name = actor.name
 
    if @actor.id == 1
      if @name == $data_actors[1].name
        @name = user_name
      end
    end
    @max_char = max_char

    name_array = @name.split(//)[0...@max_char]
    @name = ""
    for i in 0...name_array.size
      @name += name_array[i]
    end
    @default_name = @name
    @index = name_array.size
    refresh
    update_cursor_rect
  end
end



Última edición por Wecoc el 2014-05-12, 00:39, editado 1 vez

Wecoc
Administrador
Administrador



Créditos 8263

Gracias : 372

Volver arriba Ir abajo

Re: Probando tonteces con Win32API

Mensaje por Contenido patrocinado Hoy a las 02:27


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


 :: RPG Maker :: Scripts

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