Submit Your Article


 
RPG Maker

Welcome Guest ( Log In | Register )


  Games Resources RPG Maker VX RPG Maker XP Scripts Tutorials Downloads

 
Reply to this topicStart new topic
> GIF Animated Script Events, Hi, im making a DOOM project whit this script and..
de22lano
post Aug 8 2011, 02:32 PM
Post #1


Level 3
Group Icon

Group: Member
Posts: 44
Type: Artist
RM Skill: Skilled




Hi, im making a DOOM project whit this script:
1
=begin

脚本:【怨念产物 - GIF图片播放】

功能:在游戏中播放GIF图片 ※ 表情优先。

说明: 使用步骤:

1、使用 @gs = GIFSprite.new([viewport,[x,[,y,[loop_counts]]]])
创建GIF图片对象;

2、然后使用 @gs.bitmap = "gif_filename" ※ 包含文件夹路径;

3、可以 @gs.loop_counts = n

设置循环次数,-1表示无限循环(默认的),0就释放图片。

4、@gs.x = x,@gs.y = y,@gs.z = z 等设置各种坐标值。

补充:1、由于考虑的效率问题,提供了生成临时文件技术,

��
��
��
��
��第一运行之后以后每次运

行会直接读取临时文件生成对象,可以使用 GIFSprite.TmpFileclear 清空临时

文件。

2、可以使用 GIFSprite.pre_load(filename_arr) 数组预加载一组图片。

版本:v1.0

作者:灼眼的夏娜

=end


#==============================================================================
# ■ System
#------------------------------------------------------------------------------
#  处理系统相关的模块 。
#==============================================================================
module System

#--------------------------------------------------------------------------
# ● 模块函数
#--------------------------------------------------------------------------
module_function

#--------------------------------------------------------------------------
# ● API函数声明
#--------------------------------------------------------------------------
WinExec = Win32API.new("kernel32","WinExec",'pi','i')

#--------------------------------------------------------------------------
# ● 查看或修改文件及文件夹属性
# filename :文件或文件夹名字
#
# +a -a :添加、删除 存档 属性
# +r -r :添加、删除 只读 属性
# +s -s :添加、删除 系统 属性
# +h -h :添加、删除 隐藏 属性
#--------------------------------------------------------------------------
def attrib(filename,*args)
if args.empty?
astr = `attrib #{filename}`
attri_arr = Array.new
astr = astr.split(/:/)[0]
astr = astr[0,astr.size - 1]
astr.gsub!(/ /,"")
return astr.split(//)
else
cmdline = ""
for cmdchar in args
cmdchar.downcase!
next if cmdline.include? cmdchar
if ["+a","-a","+r","-r","+s","-s","+h","-h"].include? cmdchar
cmdline += " " + cmdchar
end
end
cmdline += " "
result = WinExec.call("attrib #{cmdline}#{filename}",0)
if result < 31
return
end
end
end

end

#==============================================================================
# ■ GIF
#------------------------------------------------------------------------------
#  分析处理GIF图片的核心模块 。
#==============================================================================
module GIF

# 定义常量
SIZE_GIFH = 6

SIZE_GIFS = 7

SIZE_GIFI = 9

SIZE_GIFC = 6

SIZE_GIFP = 13

SIZE_GIFA = 12

CODE_MASK = [0x0000,
0x0001,0x0003,0x0007,0x000f,
0x001f,0x003f,0x007f,0x00ff,
0x01ff,0x03ff,0x07ff,0x0fff]

INC_TABLE = [8,8,4,2,0]

BGN_TABLE = [0,4,2,1,0]

# 建立文件夹
Dir.mkdir("GIF") unless Dir["*"].include?("GIF")

# 函数定义
module_function

#--------------------------------------------------------------------------
# ● 分解gif图片
#--------------------------------------------------------------------------
def analyze_gif
@old_dir = Dir.pwd
Dir.chdir("GIF")
@total_gif = []
for g in Dir["*"]
suf = g.split(/\./)
if suf[1].is_a?(String) and suf[1].downcase == "gif"
@total_gif.push(g)
Dir.mkdir(suf[0]) unless Dir["*"].include? suf[0]
end
end
@total_gif.each{|file| self.readdata(file)}
Dir.chdir(@old_dir)
p '全部分解完毕,点击确定退出'
exit
end

#--------------------------------------------------------------------------
# ● 读取文件数据:成功返回@gif_infos,失败返回nil
#--------------------------------------------------------------------------
def readdata(filename)
# 检查是否有临时记忆文件
tmp_filename = File.basename(filename,".*")
unless Dir["~TEMP/#{tmp_filename}_infos.fmd"].empty?
begin
giffr = open("~TEMP/#{tmp_filename}_infos.fmd","rb")
tmp_infos = Marshal.load(giffr)
giffr.close
if Dir["~TEMP/#{tmp_filename}_*.png"].size == tmp_infos.total_frames
return tmp_infos
end
rescue
end
end
# 初始化数据
self.initial_var(filename)
# 打开文件
begin
@f = open(filename,"rb")
# 读取文件头
self.read_gifh
# 读取逻辑屏幕描述块
self.read_gifs
# 读取下一个字节
@temp = @f.read(1)[0]
# 循环读取每个图象描述块
while true
if @temp == 0x2c
# 读取图象描述块
self.read_gifi
end
if @temp == 0x21
# 读取图象扩展块
self.read_gife
end
if @temp == 0x3b
break
end
# 读取下一个字节
@temp = @f.read(1)[0]
end
# ※ 设置图象帧数
@gif_infos.total_frames = @frame_count
# ※ 写入图象分解数据
giffw = open("~TEMP/#{@filename}_infos.fmd","wb")
Marshal.dump(@gif_infos,giffw)
giffw.close
rescue
return nil
ensure
@f.close
end
return @gif_infos
end

#--------------------------------------------------------------------------
# ● 初始化变量
#--------------------------------------------------------------------------
def initial_var(filename)
# ※ 生成图象数据对象
@gif_infos = GIFSprite::Infos.new
# 帧数计数
@frame_count = 0
@f = nil
@temp = nil
# 获取文件名
@filename = File.basename(filename,".*")
end

#--------------------------------------------------------------------------
# ● 读取文件头
#--------------------------------------------------------------------------
def read_gifh
@gifh = @f.read(SIZE_GIFH)
if @gifh[0,3] != "GIF"
raise "不是GIF文件!"
end
if @gifh[3,3] != "87a" and @gifh[3,3] != "89a"
raise "不支持的版本!"
end
end

#--------------------------------------------------------------------------
# ● 读取逻辑屏幕描述块
#--------------------------------------------------------------------------
def read_gifs
@gifs = @f.read(SIZE_GIFS).unpack("S2C3")
# 获取调色板位数
@_pal_bits = (@gifs[2] & 7) + 1
# ※ 获取图象宽度
@gif_infos.width = @gifs[0]
# ※ 获取图象高度
@gif_infos.height = @gifs[1]
# 是否有全局调色板
if @gifs[2] >> 7 == 1
# 全局调色板大小
@g_pal_size = 3 * (1 << @_pal_bits)
# 读取全局调色板数据
@g_pal = @f.read(@g_pal_size).unpack("C*")
end
end

#--------------------------------------------------------------------------
# ● 读取图象描述块
#--------------------------------------------------------------------------
def read_gifi
# 读取图象描述块
@gifi = @f.read(SIZE_GIFI).unpack("S4C")
# ※ 生成临时帧数据对象
@gif_fd = GIFSprite::Infos::FrameData.new if @gif_fd.nil?
# ※ 获取帧偏移
@gif_fd.offset_x = @gifi[0]
@gif_fd.offset_y = @gifi[1]
# 获取宽度和高度
@_width = @gifi[2]
@_height = @gifi[3]
# 清空局部调色板
@l_pal = nil
# 是否有局部调色板
if @gifi[4] >> 7 == 1
# 获取调色板位数
@_pal_bits = (@gifi[4] & 7) + 1
# 局部调色板大小
@l_pal_size = 3 * (1 << @_pal_bits)
# 读取局部调色板数据
@l_pal = @f.read(@l_pal_size).unpack("C*")
end
# 获取交错标记
@_lace = (@gifi[4] >> 6) & 1
# 修正调色板位数
@_pal_bits = @_pal_bits == 1 ? 1 : (@_pal_bits <= 4 ? 4 : 8)
# 获取行字节数
@_width_bytes = (((@_width * @_pal_bits) + 31) >> 5) << 2
# 读取图象压缩数据
self.read_lzw_data
# ※ 设置GIF帧数据
@gif_infos.frame_data[@frame_count - 1] = @gif_fd
# ※ 清除帧数据
@gif_fd = nil
end

#--------------------------------------------------------------------------
# ● 读取图象压缩数据
#--------------------------------------------------------------------------
def read_lzw_data
# 解码用
lzw_mincodelen = @f.read(1)[0]
# 帧数加 1
@frame_count += 1
# 图象块数据
image_data = ""
# 块大小
blocksize = @f.read(1)[0]
while blocksize > 0
image_data += @f.read(blocksize)
blocksize = @f.read(1)[0]
end
# 导出图象
self.dump_imgs(image_data,lzw_mincodelen)
end

#--------------------------------------------------------------------------
# ● 读取扩充块
#--------------------------------------------------------------------------
def read_gife
label = @f.read(1)[0]
case label
when 0xf9 # 图形控制扩展块
@gifc = @f.read(SIZE_GIFC).unpack("C2SC2")
# ※ 生成帧数据对象
@gif_fd = GIFSprite::Infos::FrameData.new
# ※ 获取帧数据 延迟时间
@gif_fd.delay_time = @gifc[2]
# ※ 获取下一帧的处理方法
@gif_fd.disposal_method = (@gifc[1] & 28) >> 2
# 获取透明颜色
@_trans_index = nil
if @gifc[1] & 1 > 0
@_trans_index = @gifc[3]
end
when 0x01 # 图形说明扩展块
@gifp = @f.read(SIZE_GIFP).unpack("CS4C4")
blocksize = @f.read(1)[0]
while blocksize > 0
@f.read(blocksize)
blocksize = @f.read(1)[0]
end
when 0xfe # 注解说明扩展块
blocksize = @f.read(1)[0]
while blocksize > 0
@f.read(blocksize)
blocksize = @f.read(1)[0]
end
when 0xff # 应用程序扩展块
@gifa = @f.read(SIZE_GIFA).unpack("C*")
blocksize = @f.read(1)[0]
while blocksize > 0
@f.read(blocksize)
blocksize = @f.read(1)[0]
end
end
end

#--------------------------------------------------------------------------
# ● 设置调色板
#--------------------------------------------------------------------------
def set_pal
@_pal = []
if @l_pal != nil
@_pal = @l_pal
elsif @g_pal != nil
@_pal = @g_pal
else
for i in 0...1 << @_pal_bits
@_pal.push i,i,i
end
end
end

#--------------------------------------------------------------------------
# ● 解码图形数据
#--------------------------------------------------------------------------
def dump_imgs(image_data,lze_len)
@image_data = image_data.unpack("C*")

self.set_pal

@png_data = []

@stack = []
@images = []

@prefix = []
@suffix = []

@bitcount = @_pal_bits
@widthcount = 0

@left_bits = 0x00
@current_bits = lze_len + 0x01

@lzw_clear = 1 << lze_len
@lzw_eoi = @lzw_clear + 1
@nowtablendx = @lzw_clear + 2
@toptablendx = 1 << @current_bits

@wdata = 0
@wcode = 0
@oldcode = 0xffff
@row_num = 0
@tempchar = 0x00
@pass = 0x00
@firstchar = 0
@tempndx = 0
# 读取编码字符
self.read_byte
# 不是@lzw_eoi则循环
while @wcode != @lzw_eoi
# @lzw_clear码
if @wcode == @lzw_clear
for i in 0...@lzw_clear
@prefix[i] = 0xffff
@suffix[i] = i
end
for i in @nowtablendx...4096
@prefix[i] = 0xffff
@suffix[i] = 0x00
end
@current_bits = lze_len + 0x01
@nowtablendx = @lzw_clear + 2
@toptablendx = 1 << @current_bits
@oldcode = 0xffff
# 读取编码字符
self.read_byte
if @wcode != @lzw_eoi
while @prefix[@wcode] != 0xffff
@stack.push(@suffix[@wcode])
@wcode = @prefix[@wcode]
end
@stack.push(@suffix[@wcode])
@firstchar = @stack[-1]
# 输出解码数据
self.output_data
end
else
if @wcode < @nowtablendx
@tempndx = @wcode
else
@tempndx = @oldcode
@stack.push(@firstchar)
end
while @prefix[@tempndx] != 0xffff
@stack.push(@suffix[@tempndx])
@tempndx = @prefix[@tempndx]
end
@stack.push(@suffix[@tempndx])
@firstchar = @stack[-1]
@prefix[@nowtablendx] = @oldcode
@suffix[@nowtablendx] = @firstchar
@nowtablendx += 1
if @nowtablendx == @toptablendx and @current_bits < 12
@current_bits += 1
@toptablendx = 1 << @current_bits
end
# 输出解码数据
self.output_data
end
@oldcode = @wcode
# 读取编码字符
self.read_byte
end
Graphics.update
# 生成png图
self.make_png
end

#--------------------------------------------------------------------------
# ● 读取下一个字节
#--------------------------------------------------------------------------
def read_byte
while @left_bits < @current_bits
@next_char = @image_data.shift
@wdata |= (@next_char << @left_bits)
@left_bits += 0x08
end
@wcode = @wdata & CODE_MASK[@current_bits]
@wdata >>= @current_bits
@left_bits -= @current_bits
end

#--------------------------------------------------------------------------
# ● 输出解码数据
#--------------------------------------------------------------------------
def output_data
while !@stack.empty?
@tempchar |= (@stack.pop << (8 - @bitcount))
if @bitcount == 8
@images.push(@tempchar)
@tempchar = 0x00
@bitcount = @_pal_bits
else
@bitcount += @_pal_bits
end
@widthcount += 1
if @widthcount == @_width
if @bitcount != @_pal_bits
@images.push(@tempchar)
@tempchar = 0x00
@bitcount = @_pal_bits
end
@png_data[@row_num] = @images.clone
@images.clear
if @_lace > 0
@row_num += INC_TABLE[@pass]
if @row_num >= @_height
@pass += 1
@row_num = BGN_TABLE[@pass]
end
else
@row_num += 1
end
@widthcount = 0
end
end
end

#--------------------------------------------------------------------------
# ● 生成png图片
#--------------------------------------------------------------------------
def make_png
fp = open("~TEMP/#@filename" + sprintf("_%02d",@frame_count)+".png","wb")
fp.write(self.make_png_header)
fp.write(self.make_png_ihdr)
fp.write(self.make_png_plte) if @_trans_index.nil?
fp.write(self.make_png_idat)
fp.write(self.make_png_iend)
fp.close
end

#--------------------------------------------------------------------------
# ● png头文件
#--------------------------------------------------------------------------
def make_png_header
return [0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a].pack("C*")
end

#--------------------------------------------------------------------------
# ● png信息头块
#--------------------------------------------------------------------------
def make_png_ihdr
ih_size = [13].pack("N")
ih_sign = "IHDR"
ih_width = [@_width].pack("N")
ih_height = [@_height].pack("N")
if @_trans_index != nil
ih_bit_depth = [@_pal_bits > 8 ? 16 : 8].pack("C")
ih_color_type = [6].pack("C")
else
ih_bit_depth = [@_pal_bits].pack("C")
ih_color_type = [3].pack("C")
end
ih_compression_method = [0].pack("C")
ih_filter_method = [0].pack("C")
ih_interlace_method = [0].pack("C")
string = ih_sign + ih_width + ih_height + ih_bit_depth + ih_color_type +
ih_compression_method + ih_filter_method + ih_interlace_method
ih_crc = [Zlib.crc32(string)].pack("N")
return ih_size + string + ih_crc
end

#--------------------------------------------------------------------------
# ● png调色板块
#--------------------------------------------------------------------------
def make_png_plte
pl_size = [@_pal.size].pack("N")
pl_sign = "PLTE"
pl_data = @_pal.pack("C*")
pl_crc = [Zlib.crc32(pl_sign + pl_data)].pack("N")
return pl_size + pl_sign + pl_data + pl_crc
end

#--------------------------------------------------------------------------
# ● png数据块
#--------------------------------------------------------------------------
def make_png_idat
lz_data = []
if @_trans_index != nil
for i in 0...@png_data.size
lz_data.push 0
for j in @png_data[i]
if j == @_trans_index
lz_data.push @_pal[j*3],@_pal[j*3+1],@_pal[j*3+2],0
else
lz_data.push @_pal[j*3],@_pal[j*3+1],@_pal[j*3+2],255
end
end
end
else
for i in 0...@png_data.size
lz_data.push 0
lz_data += @png_data[i]
end
end
id_data = Zlib::Deflate.deflate(lz_data.pack("C*"),9)
id_size = [id_data.size].pack("N")
id_sign = "IDAT"
id_crc = [Zlib.crc32(id_sign + id_data)].pack("N")
return id_size + id_sign + id_data + id_crc
end

#--------------------------------------------------------------------------
# ● png 结尾块
#--------------------------------------------------------------------------
def make_png_iend
ie_size = [0].pack("N")
ie_sign = "IEND"
ie_crc = [Zlib.crc32(ie_sign)].pack("N")
return ie_size + ie_sign + ie_crc
end

end

#==============================================================================
# ■ Graphics
#------------------------------------------------------------------------------
#  处理画面的模块 。
#==============================================================================
class << Graphics

#--------------------------------------------------------------------------
# ● 添加别名、线程、临界区
#--------------------------------------------------------------------------
unless method_defined? :origin_update
alias origin_update update
def update_critical
Thread.critical = true
origin_update
Thread.critical = false
end
Thread.new{loop{Graphics.update_critical;sleep(9)}}
end

#--------------------------------------------------------------------------
# ● 定义类变量
#--------------------------------------------------------------------------
@@gif_sprites = Array.new

#--------------------------------------------------------------------------
# ● 添加GIF图片精灵
#--------------------------------------------------------------------------
def add(gs)
@@gif_sprites << gs
end

#--------------------------------------------------------------------------
# ● 删除GIF图片精灵
#--------------------------------------------------------------------------
def del(gs)
@@gif_sprites.delete gs
end

#--------------------------------------------------------------------------
# ● 更新画面
#--------------------------------------------------------------------------
def update
update_critical
@@gif_sprites.each{|gs| gs.update}
end

end

#==============================================================================
# ■ GIFSprite
#------------------------------------------------------------------------------
#  GIF精灵的核心类 。
#==============================================================================
class GIFSprite

#============================================================================
# ● GIFSprite::Infos
#----------------------------------------------------------------------------
#  GIF图片信息类 。
#============================================================================
class Infos

#------------------------------------------------------------------------
# ● 定义实例变量
#------------------------------------------------------------------------
attr_accessor :total_frames
attr_accessor :width
attr_accessor :height
attr_accessor :frame_data

#------------------------------------------------------------------------
# ● 初始化
#------------------------------------------------------------------------
def initialize
@total_frames = 0
@width = 0
@height = 0
@frame_data = Array.new
end

#==========================================================================
# ● GIFSprite::Infos::FrameData
#--------------------------------------------------------------------------
#  GIF图片每帧信息类 。
#==========================================================================
class FrameData

#----------------------------------------------------------------------
# ● 定义实例变量
#----------------------------------------------------------------------
attr_accessor :offset_x
attr_accessor :offset_y
attr_accessor :delay_time
attr_accessor :disposal_method

#----------------------------------------------------------------------
# ● 初始化
#----------------------------------------------------------------------
def initialize
@offset_x = 0
@offset_y = 0
@delay_time = 0
@disposal_method = 0
end

end

end

#--------------------------------------------------------------------------
# ● 预处理:建立临时文件夹
#--------------------------------------------------------------------------
unless Dir["*"].include?("~TEMP")
Dir.mkdir("~TEMP")
System.attrib("~TEMP","+h","+s")
end

#--------------------------------------------------------------------------
# ● 清空硬缓存
#--------------------------------------------------------------------------
def self.TmpFileclear
begin
Dir["~TEMP/*"].each{|filename| File.delete filename}
rescue
end
end

#--------------------------------------------------------------------------
# ● 预加载图片
#--------------------------------------------------------------------------
def self.pre_load(filename_arr)
filename_arr.each{|fn| GIF.readdata(fn)}
end

#--------------------------------------------------------------------------
# ● 定义实例变量
#--------------------------------------------------------------------------
attr_accessor :x
attr_accessor :y
attr_reader :z
attr_accessor :loop_counts
attr_accessor :viewport

#--------------------------------------------------------------------------
# ● 创建对象
#--------------------------------------------------------------------------
def self.new(viewport = nil,x = 0,y = 0,loop_counts = -1)
obj = super()
obj.viewport = viewport
obj.x = x
obj.y = y
obj.loop_counts = loop_counts
Graphics.add(obj)
obj
end

#--------------------------------------------------------------------------
# ● 获取图片信息
#--------------------------------------------------------------------------
def bitmap
@gif_infos
end

#--------------------------------------------------------------------------
# ● 设置图片文件名
#--------------------------------------------------------------------------
def bitmap=(filename)
@gif_infos = GIF.readdata(filename)
if @gif_infos != nil
@sp_arr = Array.new
basename = File.basename(filename,".*")
for i in 0...@gif_infos.total_frames
sp = Sprite.new(@viewport)
sp.bitmap = Bitmap.new(sprintf("~TEMP/#{basename}_%02d.png",i + 1))
sp.visible = i == 0
sp.x = @gif_infos.frame_data[i].offset_x
sp.y = @gif_infos.frame_data[i].offset_y
@sp_arr << sp
end
@update_frame_count = 0
@current_show_frame = 0
@next_frame_counts =
(@gif_infos.frame_data[0].delay_time * Graphics.frame_rate / 100)
end
end

#--------------------------------------------------------------------------
# ● 定义x=
#--------------------------------------------------------------------------
def x=(x)
if @gif_infos.nil?
@x = 0
return
end
@x = x
for i in 0...@gif_infos.total_frames
@sp_arr[i].x = @gif_infos.frame_data[i].offset_x + @x
end
end

#--------------------------------------------------------------------------
# ● 定义y=
#--------------------------------------------------------------------------
def y=(y)
if @gif_infos.nil?
@y = 0
return
end
@y = y
for i in 0...@gif_infos.total_frames
@sp_arr[i].y = @gif_infos.frame_data[i].offset_y + @y
end
end

#--------------------------------------------------------------------------
# ● 定义z=
#--------------------------------------------------------------------------
def z=(z)
if @gif_infos.nil?
@z = 0
return
end
@z = z
for i in 0...@gif_infos.total_frames
@sp_arr[i].z = @z
end
end

#--------------------------------------------------------------------------
# ● 获取宽度
#--------------------------------------------------------------------------
def width
return @gif_infos.nil? ? 0 : @gif_infos.width
end

#--------------------------------------------------------------------------
# ● 获取高度
#--------------------------------------------------------------------------
def height
return @gif_infos.nil? ? 0 : @gif_infos.height
end

#--------------------------------------------------------------------------
# ● 释放精灵
#--------------------------------------------------------------------------
def dispose
Graphics.del(self)
@sp_arr.each{|sp|
sp.bitmap.dispose
sp.dispose
}
@sp_arr.clear
@gif_infos = nil
end

#--------------------------------------------------------------------------
# ● 更新精灵
#--------------------------------------------------------------------------
def update
if @gif_infos.nil?
return
end
@update_frame_count += 1
if @update_frame_count >= @next_frame_counts
@current_show_frame = (@current_show_frame + 1) % @gif_infos.total_frames
case @gif_infos.frame_data[@current_show_frame - 1].disposal_method
when 0 # 不处理

when 1 # 图象保留在原处

when 2 # 当前图象消失
@sp_arr[@current_show_frame - 1].visible = false
when 3 # 尚不明 = =

end
@sp_arr[@current_show_frame].visible = true
if @current_show_frame == 0
@loop_counts -= 1 if @loop_counts > 0
if @loop_counts == 0
self.dispose
return
end
for i in 0...@sp_arr.size
@sp_arr[i].visible = i == @current_show_frame
end
end
@update_frame_count = 0
@next_frame_counts = (@gif_infos.frame_data[@current_show_frame].\
delay_time * Graphics.frame_rate / 100)
end
end

end

GIF Script Topic
And i wonder if anyone know how to Change this part:
@sp = GIFSprite.new
@sp.bitmap="Graphics/GIF/name_of_gif.gif"
@sp.x = 100
@sp.y = 200


So the GIF ll show up at the (walking monster)Events place and not at:
@sp.x = 100
@sp.y = 200 ..

Regards,

This post has been edited by de22lano: Aug 9 2011, 05:46 AM


__________________________
CDB
Go to the top of the page
 
+Quote Post
   
Redd
post Aug 9 2011, 11:05 PM
Post #2


:<
Group Icon

Group: Revolutionary
Posts: 2,310
Type: Developer
RM Skill: Advanced




Moving to RGSS Script Support


__________________________
Go to the top of the page
 
+Quote Post
   
de22lano
post Aug 17 2011, 02:02 PM
Post #3


Level 3
Group Icon

Group: Member
Posts: 44
Type: Artist
RM Skill: Skilled




QUOTE (Redd @ Aug 9 2011, 11:05 PM) *
Moving to RGSS Script Support

Bump


__________________________
CDB
Go to the top of the page
 
+Quote Post
   
de22lano
post Sep 7 2011, 05:12 AM
Post #4


Level 3
Group Icon

Group: Member
Posts: 44
Type: Artist
RM Skill: Skilled




bump


__________________________
CDB
Go to the top of the page
 
+Quote Post
   
Night_Runner
post Sep 8 2011, 11:08 PM
Post #5


Level 50
Group Icon

Group: +Gold Member
Posts: 1,520
Type: Scripter
RM Skill: Undisclosed






At the end of the code for the normal GIFSprite, append:
CODE
class Game_Character
  
  attr_accessor :gif_following
  
  alias nr_followingGIF_initialize  initialize
  def initialize(*args)
    @gif_following = nil
    # Run the original initialize
    return nr_followingGIF_initialize(*args)
  end
end



class Spriteset_Map
  
  alias nr_followingGIF_initialize  initialize
  def initialize(*args)
    @gif_following_ev = {}
    @last_filename_gif_following_ev = {}
    gif_handler
    # Run the original initialize
    return nr_followingGIF_initialize(*args)
  end
  
  def gif_handler
    for ev in $game_map.events.values + [$game_player]
      # Get the X & Y of the event now
      # If they changed GIF's
      if @last_filename_gif_following_ev[ev] != ev.gif_following
        # Dispose the old one
        if @gif_following_ev[ev].is_a?(GIFSprite)
          @gif_following_ev[ev].dispose
          @gif_following_ev.delete(ev)
        end
        # Store the new filename
        @last_filename_gif_following_ev[ev] = ev.gif_following
        # Do nothing if the new GIF is blank
        next if not ev.gif_following.is_a?(String)
        # Make the new one
        @gif_following_ev[ev] = GIFSprite.new(@viewport_1)
        @gif_following_ev[ev].bitmap = ev.gif_following
        @gif_following_ev[ev].x = ev.screen_x - @gif_following_ev[ev].width / 2
        @gif_following_ev[ev].y = ev.screen_y - @gif_following_ev[ev].height
      # If the GIF is the same (and it exists)
      elsif ev.gif_following != nil
        # Update the X & Y (if it's changed)
        new_x = ev.screen_x - @gif_following_ev[ev].width / 2
        new_y = ev.screen_y - @gif_following_ev[ev].height
        if (@gif_following_ev[ev].x != new_x) or (@gif_following_ev[ev].y != new_y)
          @gif_following_ev[ev].x = new_x
          @gif_following_ev[ev].y = new_y
        end
      # If the GIF doesn't exist
      else
        next
      end
      # Update the gif
      @gif_following_ev[ev].update
    end
  end
          
  
  alias nr_followingGIF_update  update  unless $@
  def update(*args)
    gif_handler
    # Run the original update
    return nr_followingGIF_update(*args)
  end
  
  alias nr_followingGIF_dispose  dispose  unless $@
  def dispose(*args)
    # Dispose each GIF
    @gif_following_ev.each_value { |v| v.dispose }
    # Run the original dispose
    return nr_followingGIF_dispose(*args)
  end
end


And then you need to have an event run the script:
CODE
$game_map.events[3].gif_following =
"Graphics/GIF/g6.gif"

Where 3 is the ID of the event that will have the GIF, and "Graphics/GIF/g6.gif" is the name of the GIF to show on them.

If you want to take the GIF off, instead of "Graphics/GIF/g6.gif" just use nil


__________________________
K.I.S.S.
Want help with your scripting problems? Upload a demo! Or at the very least; provide links to the scripts in question.

Most important guide ever: Newbie's Guide to Switches
Go to the top of the page
 
+Quote Post
   
de22lano
post Sep 19 2011, 04:26 AM
Post #6


Level 3
Group Icon

Group: Member
Posts: 44
Type: Artist
RM Skill: Skilled




QUOTE (Night_Runner @ Sep 8 2011, 11:08 PM) *
At the end of the code for the normal GIFSprite, append:
CODE
class Game_Character
  
  attr_accessor :gif_following
  
  alias nr_followingGIF_initialize  initialize
  def initialize(*args)
    @gif_following = nil
    # Run the original initialize
    return nr_followingGIF_initialize(*args)
  end
end



class Spriteset_Map
  
  alias nr_followingGIF_initialize  initialize
  def initialize(*args)
    @gif_following_ev = {}
    @last_filename_gif_following_ev = {}
    gif_handler
    # Run the original initialize
    return nr_followingGIF_initialize(*args)
  end
  
  def gif_handler
    for ev in $game_map.events.values + [$game_player]
      # Get the X & Y of the event now
      # If they changed GIF's
      if @last_filename_gif_following_ev[ev] != ev.gif_following
        # Dispose the old one
        if @gif_following_ev[ev].is_a?(GIFSprite)
          @gif_following_ev[ev].dispose
          @gif_following_ev.delete(ev)
        end
        # Store the new filename
        @last_filename_gif_following_ev[ev] = ev.gif_following
        # Do nothing if the new GIF is blank
        next if not ev.gif_following.is_a?(String)
        # Make the new one
        @gif_following_ev[ev] = GIFSprite.new(@viewport_1)
        @gif_following_ev[ev].bitmap = ev.gif_following
        @gif_following_ev[ev].x = ev.screen_x - @gif_following_ev[ev].width / 2
        @gif_following_ev[ev].y = ev.screen_y - @gif_following_ev[ev].height
      # If the GIF is the same (and it exists)
      elsif ev.gif_following != nil
        # Update the X & Y (if it's changed)
        new_x = ev.screen_x - @gif_following_ev[ev].width / 2
        new_y = ev.screen_y - @gif_following_ev[ev].height
        if (@gif_following_ev[ev].x != new_x) or (@gif_following_ev[ev].y != new_y)
          @gif_following_ev[ev].x = new_x
          @gif_following_ev[ev].y = new_y
        end
      # If the GIF doesn't exist
      else
        next
      end
      # Update the gif
      @gif_following_ev[ev].update
    end
  end
          
  
  alias nr_followingGIF_update  update  unless $@
  def update(*args)
    gif_handler
    # Run the original update
    return nr_followingGIF_update(*args)
  end
  
  alias nr_followingGIF_dispose  dispose  unless $@
  def dispose(*args)
    # Dispose each GIF
    @gif_following_ev.each_value { |v| v.dispose }
    # Run the original dispose
    return nr_followingGIF_dispose(*args)
  end
end


And then you need to have an event run the script:
CODE
$game_map.events[3].gif_following =
"Graphics/GIF/g6.gif"

Where 3 is the ID of the event that will have the GIF, and "Graphics/GIF/g6.gif" is the name of the GIF to show on them.

If you want to take the GIF off, instead of "Graphics/GIF/g6.gif" just use nil

Woww nice dude, thankssz whas waiting for this so long, appreciated..
I think its time to put on a demo soon.. ive been working on the projec for a long time now nd its been awhile that i didnt post anything!!

Bless


__________________________
CDB
Go to the top of the page
 
+Quote Post
   

Reply to this topicStart new topic
1 User(s) are reading this topic (1 Guests and 0 Anonymous Users)
0 Members:

 

Lo-Fi Version Time is now: 20th May 2013 - 10:53 AM
RPG RPG Revolution is an Privacy Policy and Legal
eXTReMe Tracker