Tutorial: Adding Videos To Your Game (Part 1)

0 Members and 1 Guest are viewing this topic.

**
Rep: +0/-0Level 69
RMRK Junior
Okay, hi to all. Today we are going to add something pretty flashy for your game. We are going to add videos !!! For that, we are going to use the Script RMFLASH. With this script we can play .swf files. But, what the advantage over a Avi player or a Mpg player??? With some modifications to our script we can put Videos as background on Menus, the title screen or as a Battle Background!!

Okay, lets start. First add the RMFLASH script to your project:

First, create a folder called "Flash" on the "Graphics" folders.
Code: [Select]
#==============================================================================#
#                                                               Version 0.3.1  #
#                         RPG Maker XP Flash Player                            #
#                                                                              #
#  Author: ?????                     Updated by: Dark_Wolf_Warrior/Dahrkael and   #
#                                             Playhome                         #
#                                                                              #
#  How to Use:                                                                 #
#                                      Graphics.freeze                         #
#  1. Go to Main Script and add ---->  $flash = Play.new                       #
#                                      $scene = Scene_Title.new                #
#                                                                              #
#  2. Copy the .dll and the .ocx to the game folder                            #
#                                                                              #
#  3. Make a folder called "Flash" in the folder "Graphics" -> Graphics/Flash/ #
#                                                                              #
#  4. To play a flash file use:                                                #
#    $flash.play("file.swf", button)                                           #
#                                                                              #
#    button can be 0 or 1, if 1 you can skip the flash using "Enter"           #
#                                                                              #
#                                                                              #
#                                                                              #
#  Interactive flashes requires RGSS knownledge to make they work              #
#                                                                              #
#  Original Keyb module by HoundNinja                                          #
#                                                                              #
#==============================================================================#



class String
 
  CP_ACP = 0
  CP_UTF8 = 65001
 
  def u2s
    m2w = Win32API.new("kernel32", "MultiByteToWideChar", "ilpipi", "i")
    w2m = Win32API.new("kernel32", "WideCharToMultiByte", "ilpipipp", "i")
   
    len = m2w.call(CP_UTF8, 0, self, -1, nil, 0)
    buf = "?" * (len*2)
    m2w.call(CP_UTF8, 0, self, -1, buf, buf.size/2)
   
    len = w2m.call(CP_ACP, 0, buf, -1, nil, 0, nil, nil)
    ret = "?" * len
    w2m.call(CP_ACP, 0, buf, -1, ret, ret.size, nil, nil)
   
    return ret
  end
 
  def s2u
    m2w = Win32API.new("kernel32", "MultiByteToWideChar", "ilpipi", "i")
    w2m = Win32API.new("kernel32", "WideCharToMultiByte", "ilpipipp", "i")
 
    len = m2w.call(CP_ACP, 0, self, -1, nil, 0);
    buf = "?" * (len*2)
    m2w.call(CP_ACP, 0, self, -1, buf, buf.size/2);
 
    len = w2m.call(CP_UTF8, 0, buf, -1, nil, 0, nil, nil);
    ret = "?" * len
    w2m.call(CP_UTF8, 0, buf, -1, ret, ret.size, nil, nil);
     
    return ret
  end

  def s2u!
    self[0, length] = s2u
  end 
 
  def u2s!
    self[0, length] = u2s
  end
 
end

class Bitmap
 
  RtlMoveMemory_pi = Win32API.new('kernel32', 'RtlMoveMemory', 'pii', 'i')
  RtlMoveMemory_ip = Win32API.new('kernel32', 'RtlMoveMemory', 'ipi', 'i')

  def address
    buffer, ad = "xxxx", object_id * 2 + 16
    RtlMoveMemory_pi.call(buffer, ad, 4); ad = buffer.unpack("L")[0] + 8
    RtlMoveMemory_pi.call(buffer, ad, 4); ad = buffer.unpack("L")[0] + 16
    RtlMoveMemory_pi.call(buffer, ad, 4); return buffer.unpack("L")[0]
  end
 
end

class RMFlash

    API_NEW              = Win32API.new("RMFlash", "_new", "piil", "l")
    API_UPDATE        = Win32API.new("RMFlash", "_update", "l", "v")
    API_FREE          = Win32API.new("RMFlash", "_free", "l", "v")
    API_PLAYING     = Win32API.new("RMFlash", "_is_playing", "l", "i")
    API_PAUSE          = Win32API.new("RMFlash", "_pause", "l", "v")
    API_RESUME        = Win32API.new("RMFlash", "_resume", "l", "v")
    API_BACK          = Win32API.new("RMFlash", "_back", "l", "v")
    API_REWIND        = Win32API.new("RMFlash", "_rewind", "l", "v")
    API_FORWARD        = Win32API.new("RMFlash", "_forward", "l", "v")
    API_CURFRAME      = Win32API.new("RMFlash", "_cur_frame", "l", "i")
    API_TOTALFRAME    = Win32API.new("RMFlash", "_total_frames", "l", "i")
    API_GOTOFRAME      = Win32API.new("RMFlash", "_goto_frame", "li", "v")
    API_GETLOOP          = Win32API.new("RMFlash", "_get_loop", "l", "i")
    API_SETLOOP          = Win32API.new("RMFlash", "_set_loop", "li", "v")
    API_CLEARALL      = Win32API.new("RMFlash", "_clear_all", "v", "v")
  API_VALID       = Win32API.new("RMFlash", "_valid", "l", "i")
  API_SENDMSG     = Win32API.new("RMFlash", "_send_message", "liii", "l")
   
  CUR_PATH        = Dir.pwd
 
    def self.get_version

    end

    def self.clear_all
        API_CLEARALL.call
    end
 
  def self.load(name, width, height, v = nil)
    new("#{CUR_PATH}/Graphics/Flash/#{name}".u2s, width, height, v)
  end
 
  attr_reader   :valid

    def initialize(flash_name, flash_width, flash_height, viewport = nil)
        @sprite = Sprite.new(viewport)
        @sprite.bitmap = Bitmap.new(flash_width, flash_height)
        @value = API_NEW.call(flash_name, flash_width, flash_height, @sprite.bitmap.address)
        @loop = API_GETLOOP.call(@value) > 0
    @valid = API_VALID.call(@value) > 0
    end

    def viewport
        @sprite.viewport
    end

    def update
        API_UPDATE.call(@value)
    end

    def dispose
        API_FREE.call(@sprite.bitmap.address)
    end

    def playing?
        API_PLAYING.call(@value) > 0
    end

    def pause
        API_PAUSE.call(@value)
    end

    def resume
        API_RESUME.call(@value)
    end

    def back
        API_BACK.call(@value)
    end

    def rewind
        API_REWIND.call(@value)
    end

    def forward
        API_FORWARD.call(@value)
    end

    def current_frame
        API_CURFRAME.call(@value)
    end

    def total_frames
        API_TOTALFRAME.call(@value)
    end

    def goto_frame(goal_frame)
        API_GOTOFRAME.call(@value, goal_frame)
    end

    def x
        @sprite.x
    end

    def x=(v)
        @sprite.x = v
    end

    def y
        @sprite.y
    end

    def y=(v)
        @sprite.y = v
    end

    def z
        @sprite.z
    end

    def z=(v)
        @sprite.z = v
    end

    def width
        @sprite.bitmap.width
    end

    def height
        @sprite.bitmap.height
    end

    def loop?
        @loop
    end

    def loop=(v)
        if @loop != v
            @loop = v
            API_SETLOOP.call(@value, v)
        end
    end
 
  def msg_to_flash(msg, wParam, lParam)
    return API_SENDMSG.call(@value, msg, wParam, lParam)
  end
 
  #  ?
  WM_MOUSEMOVE  = 0x0200
 
  def make_long(a, b)
    return (a & 0xffff ) | (b & 0xffff) << 16
  end
 
  def on_mouse_move(x, y)
    return msg_to_flash(WM_MOUSEMOVE, 0, make_long(x, y))
  end

end

module Kernel

  alias origin_exit exit unless method_defined? :exit
 
  def exit(*args)
    RMFlash.clear_all
    origin_exit(*args)
  end
 
end

module Keyb
  $keys = {}
  $keys["Enter"] = 0x0D
  GetKeyState = Win32API.new("user32","GetAsyncKeyState",['i'],'i')
  module_function
  def trigger(rkey)
    GetKeyState.call(rkey) & 0x01 == 1
  end
end

class Play
 
  def play(filename, button)
    fondo = Sprite.new
    fondo.bitmap = Bitmap.new(640, 480)
    fondo.bitmap.fill_rect(0, 0, 640, 480, Color.new(0,0,0,255))
    fls = RMFlash.load(filename, 640, 480)
    fls.loop = 1
    fls.z = 9999
    @button = button
    @fr = Graphics.frame_rate
    Graphics.frame_rate = 40
    while true
      Graphics.update
      #Input.update
      fls.update
      break if @button == 1 and Keyb.trigger($keys["Enter"])
      break if !fls.playing?
    end
    fls.pause
    fls.z = -2
    fls.dispose
    Graphics.frame_rate = @fr
    fondo.dispose
  end
end

Then, modify You main, add this line ( $flash = Play.new   ) above ( $scene = Scene_Title.new)

Now your main should look like:

Code: [Select]
# Transition preparation
  # Prepare for transition
  Graphics.freeze
  # Make scene object (title screen)
  $flash = Play.new   
  $scene = Scene_Title.new

Ok, now, the funny part.

Video as background on the tittle screen:

Okay, go to your Scene_Title and add the blackened line on the def main

Code: [Select]
#==============================================================================
# ** Scene_Title
#------------------------------------------------------------------------------
#  This class performs title screen processing.
#==============================================================================

class Scene_Title
  #--------------------------------------------------------------------------
  # * Main Processing
  #--------------------------------------------------------------------------
  def main
[b]    @flash_file = "1.swf"[/b]

Change "1.swf" with the name of your swf.

And add the Next lines after The "Makes Command Windows":

Code: [Select]
# Flash background
@fondo = RMFlash.load(@flash_file, 640, 480)
@fondo.z = @sprite.z - 1
#@fondo.loop = 1
@fr = Graphics.frame_rate
Graphics.frame_rate = 60

Then, go to the update method and add:

Code: [Select]
      # Update game screen
      Graphics.update
      # Update input information
      Input.update
      #Flash update
      [b]@fondo.update[/b]
      # Frame update
      update

Finally, add on the dispose method:

 
Code: [Select]
# Prepare for transition
    Graphics.freeze
    # Dispose of command window
    @command_window.dispose
    # Dispose of title graphic
    @sprite.bitmap.dispose
    @sprite.dispose
    [b]@fondo.pause
    @fondo.z = -2
    @fondo.dispose
    # Normal frame rate
    Graphics.frame_rate = @fr[/b]
end

Result:

http://www.youtube.com/watch?v=h_giNBdjF1s

Do you like it ;D??? well, this is just the beginning ;D

Video as background on Battle:

This is almost the same thing, but you have to modify some others thing.

First, i use Enu Tankentai Xp, so i will explain how to implement it on that system. It should be the same for other CBS.

For tankentai:

I will post the entire "Sideview 2" script to show it. [Posting Pastebin, the script was screwing the formatting]

http://pastebin.com/MyBXLv4Y

If you see, i added a a (Flash Bbacks (lol)) to help you xP.

Code: [Select]
#=======================================================================
#=====================Flash Bbacks (lol)================================
#=======================================================================
# Use a different variable Value for differents flashs
# Lights Effects Can be done aswell, just use images
      @archivo_flash = $game_map.map_id
      @asdf = RMFlash.load(@archivo_flash, 640, 480)
      #@asdf.loop = 1
      @variable_del_fondo = Sprite.new
      @variable_del_fondo.bitmap = Bitmap.new("Graphics/Pictures/#{$game_map.map_id}")
      @variable_del_fondo.z = 400

This is how it works:

As you can see, @archivo_flash remembers the Map id and @asdf plays the flash file. @asdf is gonna load a File on the "Flash" folder with the number of the map as name (Without extension), so, if you want to put a Flash battleback on the map number 34, you have to put a flash file with the name "34" (without extension)

Result:

http://www.youtube.com/watch?vtVrvvznGhxw

looks goods no ;D

Extra: Light effects on battle scene

Code: [Select]
#=======================================================================
#=====================Flash Bbacks (lol)================================
#=======================================================================
# Use a different variable Value for differents flashs
# Lights Effects Can be done aswell, just use images
      @archivo_flash = $game_map.map_id
      @asdf = RMFlash.load(@archivo_flash, 640, 480)
      #@asdf.loop = 1
     [b] @variable_del_fondo = Sprite.new
      @variable_del_fondo.bitmap = Bitmap.new("Graphics/Pictures/#{$game_map.map_id}")
      @variable_del_fondo.z = 400[/b]

@variable_del_fondo is going to load an image file from the "Pictures" with the same name as the map id (without the extension)

Result:




Okay, this is all for now, in part 2 i will explain how to put videos on your menus ^^

Cya