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.
#==============================================================================#
# 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:
# 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#==============================================================================
# ** 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":
# 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:
# 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:
# 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_giNBdjF1sDo you like it
??? well, this is just the beginning
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/MyBXLv4YIf you see, i added a a
(Flash Bbacks (lol)) to help you xP.
#=======================================================================
#=====================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?vtVrvvznGhxwlooks goods no
Extra: Light effects on battle scene#=======================================================================
#=====================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