TUTORIAL: ADDING VIDEOS TO YOUR GAME (PART 1)

RMFlash is maaaagical.

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 = s2u
end

def u2s!
self = 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") + 8
RtlMoveMemory_pi.call(buffer, ad, 4); ad = buffer.unpack("L") + 16
RtlMoveMemory_pi.call(buffer, ad, 4); return buffer.unpack("L")
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 = 0x0D
GetKeyState = Win32API.new("user32","GetAsyncKeyState",,'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)
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
@flash_file = "1.swf"


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
@fondo.update
# 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
@fondo.pause
@fondo.z = -2
@fondo.dispose
# Normal frame rate
Graphics.frame_rate = @fr

end


Result:



Do you like it ;D??? well, this is jsut the ebginning ;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.

http://pastebin.com/MyBXLv4Y

If 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 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:



looks goods no ;D

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
@variable_del_fondo = Sprite.new
@variable_del_fondo.bitmap = Bitmap.new("Graphics/Pictures/#{$game_map.map_id}")
@variable_del_fondo.z = 400


@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

asdf


Posts

Pages: 1
Well, this is awesome. It's a pity so few people seem to have seen this page or be aware that videos/Flash are possible in our engine. Really want to see more Flashes in our games now after seeing this.
It's really awsome! ^^

But there is (well I got) a problem:
It says: SynthexError on line 68.
Maybe I did something wrong, but is there something missing/wrong?
68 self = s2u

Dude you rock! These look awesome. Thanks for the great scripts ♥♥♥!
Sad, it didnt appear on the main page :c
Pages: 1