Mundo Maker
¡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 4133 miembros registrados.
El último usuario registrado es Neysersitoh.

Nuestros miembros han publicado un total de 84769 mensajes en 12064 argumentos.

Ayuda con Script

Ver el tema anterior Ver el tema siguiente Ir abajo

Ayuda con Script

Mensaje por teivko el 2017-07-10, 13:39

Buenas, estoy intentando desarrollar por mi mismo un script de un menu nuevo. Estoy mirando otros scripts junto con el original, y el caso es que poco despues de haber empezado ya me he atascado con un problemilla. El problema es el siguiente, cuando yo le doy para que aparezca el menu, aparece una parte de este (es la unica parte que por ahora he programado) pero con el fondo completamente negro. Me gustaria saber como puedo quitarle ese fondo negro, o ponerle otro diferente (mi idea es que salga el fondo muy difuminado)

El codigo del Scene_Menu es este

Código:
#==============================================================================
# ** Scene_Menu
#------------------------------------------------------------------------------
#  This class performs menu screen processing.
#==============================================================================

class Scene_MenuSao
  #--------------------------------------------------------------------------
  # * Object Initialization
  #     menu_index : command cursor's initial position
  #--------------------------------------------------------------------------
  def initialize(menu_index = 0)
    @menu_index = menu_index
  end
  #--------------------------------------------------------------------------
  # * Main Processing
  #--------------------------------------------------------------------------
  def main
    #@menu = MenuSaoPrincipal.new
    @menu = MenuSaoStatus.new
    
    # Execute transition
    Graphics.transition
    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
    @menu.dispose
    
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    @menu.update
    update_command
    ind = 1
  end
  #--------------------------------------------------------------------------
  # * Frame Update (when command window is active)
  #--------------------------------------------------------------------------
  def update_command
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Switch to map screen
      $scene = Scene_Map.new
      return
    end
    ind = 1
  end
  #--------------------------------------------------------------------------
  # * Frame Update (when status window is active)
  #--------------------------------------------------------------------------
  #def update_status  
  #  
  #end
end

El codigo del menu que aparece es este:
Código:
class MenuSaoStatus < Window_Base
    def initialize
      super(26,33,202,302)
      self.windowskin = nil
      self.contents = Bitmap.new(width-32, height-32)
      self.opacity = 0
      self.back_opacity = 0
      #self.z = 115
      refresh
    end
   
    def refresh
      self.contents.clear
      bg= RPG::Cache.picture('menu/bgStatusPj')
      self.contents.blt(0, 0, bg, Rect.new(0, 0, 170, 270))
      actor = $game_party.actors[0]
      draw_actor_graphic(actor,52+32,99+32)
    end     
end



Y esta es la captura de como aparece:



Muchas gracias de antemano.
avatar
teivko
Iniciado
Iniciado

0/3

Créditos 45

Gracias : 3

Volver arriba Ir abajo

Re: Ayuda con Script

Mensaje por Wecoc el 2017-07-10, 15:17

Consejos:
- Cuando crees una clase de ventana acostúmbrate a usar el formato Window_(nombre), lo mismo cuando creas una escena Scene_(nombre), Sprite_(nombre)... indicar bien de qué tipo es ayuda mucho a entender mejor el script. En tu caso puedes usar Window_MenuSaoStatus o algo sí.
- Lo mismo, o al menos parecido, cuando crees la variable que contiene esa ventana. En tu caso la llamaste @menu pero iras mejor llamándola algo más concreto, como @equip_window o @status_window...
- La imagen que usaste tienes que pulirla un poco. Te dejaste algunas partes más blancas que otras.

Dudas:
- ¿El menú es para solo un personaje? Porque ahora mismo esa ventana solo soporta usarse con el actor principal.
- El fondo sale negro porque no hay fondo asignado. ¿Cuando dices "quitarlo" te refieres a que se vea el mapa de fondo? ¿O bien otra imagen completamente distinta? Ámbos son posibles pero se hace de modo distinto.
avatar
Wecoc
Administrador
Administrador



Créditos 9217

Gracias : 493

Volver arriba Ir abajo

Re: Ayuda con Script

Mensaje por teivko el 2017-07-10, 15:27

Respecto a la nomenclatura, tienes toda la razón. Primera norma de un buen programador.

El menú sería para todos los personajes de la party, pero eso se ve cuando te metes en otro submenú, después cuelgo la imagen para que lo veas. Y si, quisiera que se viera el mapa pero en vez de tal cual, difuminado.
avatar
teivko
Iniciado
Iniciado

0/3

Créditos 45

Gracias : 3

Volver arriba Ir abajo

Re: Ayuda con Script

Mensaje por Wecoc el 2017-07-10, 16:10

Otro consejo:
Otra cosa que me dejé de comentar antes es que pusiste # desactivando Graphics.freeze y esa línea no puedes quitarla porque es importante para luego volver del menú.

Vale, sobre tu duda, te respondo. En los menús en los que se ve el fondo de mapa casi siempre lo que se ve es todo el mapa en sí, es decir el Spriteset_Map con cada uno de los sprites. Los efectos como difuminar y esas cosas se aplican a imágenes, por lo que sería necesario pasar el mapa actual a imagen (como una captura de pantalla).

Hay scripts que hacen eso, es un proceso un poco lento para el programa pero si de verdad quieres el efecto difuminado no tienes elección.
Te paso uno: Efecto Distorsion Motion Blur

Te he editado un poco el script para integrar eso, prueba a ver qué tal.
Código:
module Graphics
  
  RtlMoveMemory          =
    Win32API.new("kernel32", "RtlMoveMemory",          "pii",       "i")
  BitBlt                 =
    Win32API.new("gdi32",    "BitBlt",                 "iiiiiiiii", "i")
  CreateCompatibleBitmap =
    Win32API.new("gdi32",    "CreateCompatibleBitmap", "iii",       "i")
  CreateCompatibleDC     =
    Win32API.new("gdi32",    "CreateCompatibleDC",     "i",         "i")
  DeleteObject           =
    Win32API.new("gdi32",    "DeleteObject",           "i",         "i")
  GetDIBits              =
    Win32API.new("gdi32",    "GetDIBits",              "iiiiipi",   "i")
  SelectObject           =
    Win32API.new("gdi32",    "SelectObject",           "ii",        "i")
  SetDIBits              =
    Win32API.new("gdi32",    "SetDIBits",              "iiiiipi",   "i")
  GetForegroundWindow    =
    Win32API.new("user32",   "GetForegroundWindow",    "",          "i")
  GetSystemMetrics       =
    Win32API.new("user32",   "GetSystemMetrics",       "i",         "i")
  
  HWnd = GetForegroundWindow.call
  DC   = Win32API.new("user32", "GetDC", "i", "i").call(HWnd)
  
  def self.snapshot(width = 640, height = 480)
    bitmap  = Bitmap.new(width, height)
    address = "\0" * 4
    RtlMoveMemory.call(address, bitmap.__id__ * 2 + 16, 4)
    RtlMoveMemory.call(address, address.unpack("L")[0] + 8, 4)
    RtlMoveMemory.call(address, address.unpack("L")[0] + 16, 4)
    address = address.unpack("L")[0]
    info    = [40, width, height, 1, 32, 0, 0, 0, 0, 0, 0].pack("LllSSLLllLL")
    hDC     = CreateCompatibleDC.call(DC)
    hBM     = CreateCompatibleBitmap.call(DC, width, height)
    DeleteObject.call(SelectObject.call(hDC, hBM))
    SetDIBits.call(hDC, hBM, 0, height, address, info, 0)
    BitBlt.call(hDC, 0, 0, width, height, DC, 0, 0, 0xCC0020)
    GetDIBits.call(hDC, hBM, 0, height, address, info, 0)
    DeleteObject.call(hBM)
    DeleteObject.call(hDC)
    return bitmap
  end
end

class Game_Temp
  attr_accessor :map_screen
end

class Scene_Map
  alias map_screen_call_menu call_menu unless $@
  def call_menu
    $game_temp.map_screen = Graphics.snapshot
    map_screen_call_menu
  end
end

#==============================================================================
# ** Scene_Menu
#==============================================================================

class Scene_Menu
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(menu_index = 0)
    @menu_index = menu_index
  end
  #--------------------------------------------------------------------------
  # * Main Processing
  #--------------------------------------------------------------------------
  def main
    @status_window = Window_MenuSaoStatus.new(0)
    @bg_sprites = []
    sprite = Sprite.new
    sprite.bitmap = $game_temp.map_screen
    @bg_sprites.push(sprite)
    for iy in 0..2
      for ix in 0..2
        next if ix == 0 && iy == 0
        sprite = Sprite.new
        sprite.bitmap = $game_temp.map_screen
        sprite.x = ix - 1
        sprite.y = iy - 1
        sprite.opacity = 32
        @bg_sprites.push(sprite)
      end
    end
    
    @bg_sprites.each do |sprite|
      sprite.color = Color.new(0, 0, 0, 32)
      sprite.tone = Tone.new(-64, -64, -48, 48)
    end
    
    # Execute transition
    Graphics.transition
    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
    @status_window.dispose
    @bg_sprites.each {|sprite| sprite.dispose}
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    @status_window.update
    @bg_sprites.each {|sprite| sprite.update}
    #if @status_window.active == true
    #  update_status
    #  return
    #end
    update_command
  end
  #--------------------------------------------------------------------------
  # * Frame Update (when command window is active)
  #--------------------------------------------------------------------------
  def update_command
    # If B button was pressed
    if Input.trigger?(Input::B)
      # Play cancel SE
      $game_system.se_play($data_system.cancel_se)
      # Switch to map screen
      $scene = Scene_Map.new
      return
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update (when status window is active)
  #--------------------------------------------------------------------------
  def update_status  
    
  end
end

class Window_MenuSaoStatus < Window_Base
  def initialize(actor_id)
    super(26,33,202,302)
    self.windowskin = nil
    self.contents = Bitmap.new(width-32, height-32)
    self.opacity = 0
    self.back_opacity = 0
    self.z = 115
    @actor_id = actor_id
    @bg = Sprite.new
    @bg.bitmap = RPG::Cache.picture('menu/bgStatusPj') rescue nil
    @bg.x = self.x
    @bg.y = self.y
    @bg.z = self.z
    refresh
  end
    
  def dispose
    super
    @bg.dispose
  end
  
  def update
    super
    @bg.update
  end
  
  def refresh
    self.contents.clear
    actor = $game_party.actors[@actor_id]
    draw_actor_graphic(actor, 52 + 32, 99 + 32)
  end      
end
avatar
Wecoc
Administrador
Administrador



Créditos 9217

Gracias : 493

Volver arriba Ir abajo

Re: Ayuda con Script

Mensaje por newold el 2017-07-10, 16:14

un truco para difuminar sin mucho gasto de recursos:

Código:
imagen_fondo = Sprite.new
imagen_fondo.bitmap = Bitmap.new("direccion de imagen")


imagenes_difuminadas = []

desplazamiento_x = [10,30,-30,-10]

max_opacity = 60

for i in 0...desplazamiento_x.size
  imagenes_difuminadas << Sprite.new
  imagenes_difuminadas[-1].bitmap = imagen_fondo.bitmap
  imagenes_difuminadas[-1].blend_type = 1
  imagenes_difuminadas[-1].x += desplazamiento_x[i]
  imagenes_difuminadas[-1].opacity = 0
end


while true
  if imagen_fondo.tone.gray < 40
    imagen_fondo.tone.gray += 1
    imagen_fondo.opacity -= 3
  end
  imagenes_difuminadas.each {|sp| sp.opacity += 2 unless sp.opacity > max_opacity}
  Graphics.update
end

Tan solo hay que especificar una imagen al bitmap de imagen_fondo y cambiar los desplazamientos en el array desplazamiento_x
avatar
newold
Principiante
Principiante

0/3

Créditos 1096

Gracias : 71

Volver arriba Ir abajo

Re: Ayuda con Script

Mensaje por kyonides-arkanthos el 2017-07-10, 19:33

Ten cuidado con el consejo, newold, que puede ser un poco inconveniente para quien no está acostumbrado a utilizar un while loop y más si la única condición es que sea true... quizás un begin block sería mejor ahí... Pero también está la opción de cambiar la opacidad y el tono gris de forma más directa, generalizando, al crear un único sprite del tamaño de la pantalla completa. Dicho sprite único sería creado antes que todas las ventanas del script de escena (Scene_comolollames), pero iría después del Spriteset_Map.new.

Código:
imagen_fondo = Sprite.new
imagen_fondo.bitmap = Bitmap.new(640,480)
imagen_fondo.opacity = 80

Y luego opcionalmente vendría el cambio de tonalidad de gris.
avatar
kyonides-arkanthos
Principiante
Principiante

0/3

Créditos 466

Gracias : 68

Volver arriba Ir abajo

Re: Ayuda con Script

Mensaje por teivko el 2017-07-11, 11:08

Muchas gracias a los tres. He probado Wecoc tu metodo, y es fabuloso, pero al tener ya bastantes scripts metidos, me carga un poco el sistema, por lo que he optado por crear una imagen del tamaño de la pantalla, y cargarlo encima del Spriteset_Map con una opacidad de 100.

De nuevo, gracias a los 3.

P.D. Teneis algun truco para averiguar las coordenadas x,y a la hora de colocar un sprite? Es que me da mucha pereza tener que estar probando una y otra vez hasta que se coloca el sprite.
avatar
teivko
Iniciado
Iniciado

0/3

Créditos 45

Gracias : 3

Volver arriba Ir abajo

Re: Ayuda con Script

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.