module Transitions @sprites = [[], [], []] def self.transitioning_out?(sprite) @sprites[0].any? { |i| i[0] == sprite } end def self.transitioning_in?(sprite) @sprites[1].any? { |i| i[0] == sprite } end def self.transition_type(sprite) if self.transitioning_out?(sprite) return [0, @sprites[0].detect { |i| i[0] == sprite }[1]] elsif self.transitioning_in?(sprite) return [1, @sprites[1].detect { |i| i[0] == sprite }[1]] end return nil end def self.sprite(sprite) if self.transitioning_out?(sprite) return @sprites[0].detect { |i| i[0] == sprite } elsif self.transitioning_in?(sprite) return @sprites[1].detect { |i| i[0] == sprite } end return nil end def self.update @sprites[0] = @sprites[0].select { |sprite| if sprite[0].disposed? case sprite[1] when 0, 1, 2, 3, 4: sprite[3].dispose when 5: sprite[3].each { |el| el.dispose } sprite[3] = [] end false else sprite[7] = true tmpvar = true sprite[5] += 1 real_frames = sprite[5] if sprite[6] > 0 sprite[5] = sprite[5] * (sprite[2] * 2 - sprite[5]) / sprite[2] * sprite[6] / 100.0 + sprite[5] * (100 - sprite[6]) / 100.0 else sprite[5] = sprite[5].to_f / (sprite[2] * 2 - sprite[5]) * sprite[2] * sprite[6].abs / 100.0 + sprite[5] * (100 - sprite[6].abs) / 100.0 end case sprite[1] when 0: sprite[0].opacity = 255 - 255 * sprite[5] / sprite[2] sprite[3].opacity = 255 - 255 * sprite[5] / sprite[2] sprite[0].ox = 0 - sprite[4][0] * sprite[5] / sprite[2] sprite[0].oy = 0 - sprite[4][1] * sprite[5] / sprite[2] sprite[3].ox = 0 - sprite[4][2] * sprite[5] / sprite[2] sprite[3].oy = 0 - sprite[4][3] * sprite[5] / sprite[2] if sprite[0].is_a?(Sprite_Battler) sprite[0].pos = [sprite[0].x, sprite[0].y] end tmpvar = real_frames != sprite[2] when 1: sprite[0].opacity = 255 - 255 * sprite[5] / sprite[2] tmpvar = real_frames != sprite[2] when 2: sprite[0].opacity = 255 - 255 * sprite[5] / sprite[2] sprite[0].zoom_x = 1.0 + (sprite[4][0] - 1.0) * sprite[5] / sprite[2] sprite[0].zoom_y = 1.0 + (sprite[4][1] - 1.0) * sprite[5] / sprite[2] tmpvar = real_frames != sprite[2] when 3: sprite[0].opacity = 255 - 255 * sprite[5] / sprite[2] sprite[0].zoom_x = 1.0 + (sprite[4][0] - 1.0) * sprite[5] / sprite[2] sprite[0].zoom_y = 1.0 + (sprite[4][1] - 1.0) * sprite[5] / sprite[2] sprite[0].angle = sprite[4][2] * sprite[5] / sprite[2] tmpvar = real_frames != sprite[2] when 4: sprite[4][3] = (180.0 * sprite[4][1] * sprite[5] / sprite[2]) % 360#(sprite[4][3] + sprite[4][4]) % 360 tmp = sprite[0].mirror sprite[0].mirror = (sprite[4][3] >= 90 and sprite[4][3] <= 270) if tmp != sprite[0].mirror sprite[4][4] += 1 sprite[4][2] = 1.0 - (1.0 - sprite[4][0]) * (sprite[4][4]) / sprite[4][1] end sprite[0].opacity = 255 - 255.0 * sprite[5] / sprite[2] sprite[0].zoom_x = Math.cos(sprite[4][3] * Math::PI / 180.0).abs * sprite[4][2]#[sprite[0].zoom_x + sprite[4][3], sprite[4][2]].min sprite[0].zoom_y = 1 tmpvar = real_frames != sprite[2] when 5: if sprite[4].length == 2 sprite[4].push((sprite[4][0] > 0 ? 0 : 9)) end if sprite[4][0] > 0 tmp = sprite[3][sprite[4][2]] tmp.z = -1 tmp.x += sprite[4][2] if tmp.x >= (sprite[4][2] + 1) * tmp.bitmap.width tmp.visible = false sprite[4][2] += 1 end else tmp = sprite[3][sprite[4][2]] tmp.z = -1 tmp.x -= sprite[4][1] if tmp.x <= sprite[3][sprite[4][2] - 1].x tmp.visible = false sprite[4][2] -= 1 end end tmpvar = sprite[3].select { |el| el.visible }.length > 0 when 6: sprite[3].each { |el| el.zoom_x = 1.0 - 1.0 * sprite[5] / sprite[2] } tmpvar = real_frames != sprite[2] when 7: if sprite[4].length == 4 sprite[4][0] = rand(1 + sprite[4][0].last - sprite[4][0].first) + sprite[4][0].first sprite[4][1] = rand(1 + sprite[4][1].last - sprite[4][1].first) + sprite[4][1].first sprite[4].push(sprite[2]) sprite[4].push(1) sprite[4].push(0) sprite[4][2] = rand(1 + sprite[4][2].last - sprite[4][2].first) + sprite[4][2].first sprite[4][3] = rand(1 + sprite[4][3].last - sprite[4][3].first) + sprite[4][3].first sprite[4].push(sprite[2]) sprite[4].push(1) sprite[4].push(0) end # x _dx = (sprite[4][0] * sprite[4][1] * sprite[4][5]) / 10.0 sprite[4][6] += _dx if sprite[4][6] > sprite[4][0] / 2.0 sprite[4][5] = -1 end if sprite[4][6] < -sprite[4][0] / 2.0 sprite[4][5] = 1 end sprite[4][4] -= 1 # y _dy = (sprite[4][2] * sprite[4][3] * sprite[4][8]) / 10.0 sprite[4][9] += _dy if sprite[4][9] > sprite[4][2] / 2.0 sprite[4][8] = -1 end if sprite[4][9] < -sprite[4][2] / 2.0 sprite[4][8] = 1 end sprite[4][7] -= 1 sprite[0].ox, sprite[0].oy = sprite[4][6], sprite[4][9] sprite[0].opacity = 255 - 255 * sprite[5] / sprite[2] tmpvar = real_frames != sprite[2] when 8: #p sprite[0].x - sprite[0].ox + sprite[0].bitmap.width / 2, sprite[0].y - sprite[0].oy + sprite[0].bitmap.height / 2 len = sprite[4][1] * Math.sin(sprite[5].to_f * Math::PI * sprite[4][2] / sprite[2]) sprite[0].bitmap = Bitmap.new(sprite[3].width + 2 * len.abs, sprite[3].height) sprite[0].ox = len.abs Bitmap::RIPPLE.call(sprite[0].bitmap.__id__, sprite[3].__id__, sprite[4][0], len, 0) sprite[0].opacity = 255 - 255 * sprite[5] / sprite[2] tmp = sprite[0].bitmap.clone len = sprite[4][4] * Math.sin(sprite[5].to_f * Math::PI * sprite[4][5] / sprite[2]) sprite[0].bitmap = Bitmap.new(tmp.width, tmp.height + 2 * len.abs) sprite[0].oy = len.abs Bitmap::RIPPLE.call(sprite[0].bitmap.__id__, tmp.__id__, sprite[4][3], len, 1) sprite[0].opacity = 255 - 255 * sprite[5] / sprite[2] tmpvar = sprite[5] != sprite[2] if !tmpvar sprite[0].ox = sprite[0].oy = 0 end when 9: rects = sprite[4][1] if sprite[5] <= sprite[2] - sprite[4][0] num = rects.length / (sprite[2] - sprite[4][0] - sprite[5] + 1) num.to_i.times { rect = rects[rand(rects.length)] sprite[4][1].delete(rect) sprite[0].bitmap.fill_rect(rect, Color.new(0, 0, 0, 0)) } else frames = sprite[2] - sprite[5] sprite[3].opacity = (255 * frames / sprite[4][0]) end tmpvar = real_frames != sprite[2] when 10: rects = sprite[4][0] num = rects.length / (sprite[2] - sprite[5] + 1) num.to_i.times { rect = rects[rand(rects.length)] sprite[4][0].delete(rect) sprite[0].bitmap.fill_rect(rect, Color.new(0, 0, 0, 0)) } tmpvar = sprite[5] != sprite[2] when 11: sr = sprite[0].src_rect.clone sprite[0].bitmap = sprite[3].clone sprite[0].src_rect = sr Bitmap::TRANSITION_OUT.call(sprite[0].bitmap.__id__, sprite[4][0].__id__, sprite[5], sprite[2], sprite[4][1], sr.x, sr.y) tmpvar = real_frames != sprite[2] end sprite[5] = real_frames tmpvar end } @sprites[1] = @sprites[1].select { |sprite| if sprite[0].disposed? case sprite[1] when 0, 1, 2, 3: sprite[3].dispose when 4, 5: sprite[3].each { |el| el.dispose } sprite[3] = [] end false else sprite[7] = true tmpvar = true sprite[5] += 1 real_frames = sprite[5] if sprite[6] > 0 sprite[5] = sprite[5] * (sprite[2] * 2 - sprite[5]) / sprite[2] * sprite[6] / 100.0 + sprite[5] * (100 - sprite[6]) / 100.0 else sprite[5] = sprite[5].to_f / (sprite[2] * 2 - sprite[5]) * sprite[2] * sprite[6].abs / 100.0 + sprite[5] * (100 - sprite[6].abs) / 100.0 end case sprite[1] when 0: sprite[0].opacity = 255.0 * sprite[5] / sprite[2] tmpvar = real_frames != sprite[2] when 1: sprite[0].opacity = 255.0 * sprite[5] / sprite[2] sprite[0].zoom_x = (1.0 - sprite[4][0]) * sprite[5] / sprite[2] + sprite[4][0] sprite[0].zoom_y = (1.0 - sprite[4][1]) * sprite[5] / sprite[2] + sprite[4][1] tmpvar = real_frames != sprite[2] when 2: sprite[0].opacity = 255.0 * sprite[5] / sprite[2] sprite[0].zoom_x = (1.0 - sprite[4][0]) * sprite[5] / sprite[2] + sprite[4][0] sprite[0].zoom_y = (1.0 - sprite[4][1]) * sprite[5] / sprite[2] + sprite[4][1] sprite[0].angle = sprite[4][2].to_f * sprite[5] / sprite[2] tmpvar = real_frames != sprite[2] when 3: sprite[4][3] = (180.0 * sprite[4][1] * sprite[5] / sprite[2]) % 360#(sprite[4][3] + sprite[4][4]) % 360 tmp = sprite[0].mirror sprite[0].mirror = (sprite[4][3] >= 90 and sprite[4][3] <= 270) if tmp != sprite[0].mirror sprite[4][4] += 1 sprite[4][2] = sprite[4][0] + (1.0 - sprite[4][0]) * (sprite[4][4]) / sprite[4][1] end sprite[0].opacity = 255.0 * sprite[5] / sprite[2] sprite[0].zoom_x = Math.cos(sprite[4][3] * Math::PI / 180.0).abs * sprite[4][2]#[sprite[0].zoom_x + sprite[4][3], sprite[4][2]].min tmpvar = real_frames != sprite[2] when 4: if sprite[4][0] > 0 tmp = sprite[3][sprite[4][2]] if tmp tmp.x += sprite[4][1] if tmp.x >= (sprite[4][2]) * tmp.bitmap.width + sprite[4][3] tmpvar = false if sprite[4][2] == 9 sprite[3][sprite[4][2]].z = 100 sprite[4][2] += 1 sprite[3][sprite[4][2]].visible = true if sprite[3][sprite[4][2]] sprite[3][sprite[4][2]].x = (sprite[4][2] - 1) * tmp.bitmap.width + sprite[4][3] if sprite[3][sprite[4][2]] end end else tmp = sprite[3][sprite[4][2]] if tmp tmp.x -= sprite[4][1] if tmp.x <= tmp.bitmap.width * (sprite[4][2]) tmpvar = false if sprite[4][2] == 0 sprite[3][sprite[4][2]].z = 100 sprite[4][2] -= 1 sprite[3][sprite[4][2]].visible = true if sprite[3][sprite[4][2]] sprite[3][sprite[4][2]].x = tmp.bitmap.width * (sprite[4][2] + 1) if sprite[3][sprite[4][2]] and tmpvar end end end unless tmpvar sprite[0].visible = true sprite[3].each { |i| i.dispose;i=nil } end when 5: _z = [1.0 / sprite[2], 0.001].max sprite[3].each { |el| el.zoom_x = 1.0 * sprite[5] / sprite[2] } if sprite[5] == sprite[2] @sprites[2].push([sprite[0], sprite[3]]) end if sprite[5] == sprite[2] sprite[0].visible = true sprite[3].each { |i| i.dispose;i=nil } end tmpvar = real_frames != sprite[2] when 6: if sprite[4].length == 4 sprite[4][0] = rand(1 + sprite[4][0].last - sprite[4][0].first) + sprite[4][0].first sprite[4][1] = rand(1 + sprite[4][1].last - sprite[4][1].first) + sprite[4][1].first sprite[4].push(sprite[2]) sprite[4].push(1) sprite[4][2] = rand(1 + sprite[4][2].last - sprite[4][2].first) + sprite[4][2].first sprite[4][3] = rand(1 + sprite[4][3].last - sprite[4][3].first) + sprite[4][3].first sprite[4].push(sprite[2]) sprite[4].push(1) end # x _dx = (sprite[4][0] * sprite[4][1] * sprite[4][5]) / 10.0 sprite[0].ox += _dx if sprite[0].ox > sprite[4][0] / 2.0 sprite[4][5] = -1 end if sprite[0].ox < -sprite[4][0] / 2.0 sprite[4][5] = 1 end sprite[4][4] -= 1 # y _dy = (sprite[4][2] * sprite[4][3] * sprite[4][7]) / 10.0 sprite[0].oy += _dy if sprite[0].oy > sprite[4][2] / 2.0 sprite[4][7] = -1 end if sprite[0].oy < -sprite[4][2] / 2.0 sprite[4][7] = 1 end sprite[4][6] -= 1 sprite[0].opacity = 255 * sprite[5] / sprite[2] if sprite[5] == sprite[2] sprite[0].ox, sprite[0].oy = 0, 0 end tmpvar = real_frames != sprite[2] when 7: sr = sprite[0].src_rect.clone sprite[0].bitmap = sprite[3].clone sprite[0].src_rect = sr Bitmap::TRANSITION_IN.call(sprite[0].bitmap.__id__, sprite[4][0].__id__, sprite[5], sprite[2], sprite[4][1], sr.x, sr.y) tmpvar = real_frames != sprite[2] end sprite[5] = real_frames tmpvar end } @sprites[2] = @sprites[2].select { |el| if el[0].disposed? el[1].each { |i| i.dispose } end !el[0].disposed? } end def self.transition_out(sprite, type, duration = 40, args = [], ease = 0) if args.is_a?(Fixnum) ease, args = args, [] end data = self.get_data(0, type, args, sprite) e_sprite = Sprite.new(sprite.viewport) e_sprite.bitmap = Bitmap.new(sprite.bitmap.width, sprite.bitmap.height) case type when 0: sprite.bitmap = sprite.bitmap.clone sprite.bitmap.split_bitmap(e_sprite.bitmap, 1, 1) e_sprite.x = sprite.x = sprite.x - sprite.ox e_sprite.ox = sprite.ox = 0 e_sprite.y = sprite.y = sprite.y - sprite.oy e_sprite.oy = sprite.oy = 0 when 2, 3: sprite.x -= sprite.ox sprite.y -= sprite.oy sprite.ox = sprite.src_rect.width / 2 sprite.oy = sprite.src_rect.height / 2 sprite.x += sprite.ox sprite.y += sprite.oy when 4: sprite.x -= sprite.ox sprite.y -= sprite.oy sprite.ox = sprite.src_rect.width / 2 sprite.oy = sprite.src_rect.height / 2 sprite.x += sprite.ox sprite.y += sprite.oy data.push(1.0) data.push(0) data.push(0) when 5: data.push(sprite.bitmap.width / duration) tmp = [sprite.x, sprite.y, sprite.ox, sprite.oy, sprite.zoom_x, sprite.zoom_y] e_sprite = sprite.tile(10, 1) e_sprite.each { |el| el.x -= tmp[2] * tmp[4] el.y -= tmp[3] * tmp[5] el.x += tmp[0] el.y += tmp[1] } when 6: data.push(sprite.bitmap.width / duration) tmp = [sprite.x, sprite.y, sprite.ox, sprite.oy, sprite.zoom_x, sprite.zoom_y] e_sprite = sprite.tile(10, 1) e_sprite.each { |el| el.x -= tmp[2] * tmp[4] el.y -= tmp[3] * tmp[5] el.ox = el.bitmap.width / 2 el.x += tmp[0] + el.ox el.y += tmp[1] } when 7: sprite.x -= sprite.ox sprite.y -= sprite.oy sprite.ox = 0 sprite.oy = 0 when 8: tmp = Bitmap.new(sprite.src_rect.width, sprite.src_rect.height) tmp.blt(0, 0, sprite.bitmap, tmp.rect) sprite.bitmap = tmp sprite.x -= sprite.ox sprite.y -= sprite.oy sprite.ox = sprite.oy = 0 e_sprite = sprite.bitmap.clone data.push(0) data.push(Win32API.new("rgss_addon.dll", "ripple", "lliii", "b")) when 9: sr = sprite.src_rect.clone e_sprite = sprite.dup e_sprite.bitmap = sprite.bitmap.clone sprite.bitmap = sprite.bitmap.clone e_sprite.src_rect = sr sprite.src_rect = sr e_sprite.z = sprite.z - 1 Bitmap::NEGATIVE.call(e_sprite.bitmap.__id__) if data[3] Bitmap::GRAYSCALE.call(e_sprite.bitmap.__id__, data[8]) Bitmap::TINT.call(e_sprite.bitmap.__id__, *data[4..7]) size = [sprite.src_rect.width, sprite.src_rect.height] data[1] *= size[0] if data[1].is_a?(Float) data[2] *= size[1] if data[2].is_a?(Float) x = 0 rects = [] while x < size[0] y = 0 while y < size[1] rects.push(Rect.new(sr.x + x, sr.y + y, data[1], data[2])) y += data[2] end x += data[1] end data = data[0..0] data.push(rects) data.push(0) when 10: sr = sprite.src_rect.clone sprite.bitmap = sprite.bitmap.clone sprite.src_rect = sr size = [sr.width, sr.height] data[0] *= size[0] if data[0].is_a?(Float) data[1] *= size[1] if data[1].is_a?(Float) x = 0 rects = [] while x < size[0] y = 0 while y < size[1] rects.push(Rect.new(sr.x + x, sr.y + y, data[0], data[1])) y += data[1] end x += data[0] end data = [] data.push(rects) when 11: e_sprite = sprite.bitmap.clone tmp = RPG::Cache.load_bitmap('Graphics/Transitions/', data[0]) data[0] = Bitmap.new(sprite.src_rect.width, sprite.src_rect.height) data[0].stretch_blt(data[0].rect, tmp, tmp.rect) end @sprites[0].push([sprite, type, duration, e_sprite, data, 0, ease, false]) end def self.transition_in(sprite, type, duration = 40, args = [], ease = 0) if args.is_a?(Fixnum) ease, args = args, [] end data = self.get_data(1, type, args, sprite) e_sprite = Sprite.new e_sprite.bitmap = Bitmap.new(sprite.bitmap.width, sprite.bitmap.height) case type when 0: sprite.opacity = 0 when 1: sprite.x -= sprite.ox sprite.y -= sprite.oy sprite.ox = sprite.src_rect.width / 2 sprite.oy = sprite.src_rect.height / 2 sprite.x += sprite.ox sprite.y += sprite.oy sprite.zoom_x, sprite.zoom_y = *data sprite.opacity = 0 when 2: sprite.x -= sprite.ox sprite.y -= sprite.oy sprite.ox = sprite.src_rect.width / 2 sprite.oy = sprite.src_rect.height / 2 sprite.x += sprite.ox sprite.y += sprite.oy sprite.angle = (360 - data[2] % 360) % 360 sprite.opacity = 0 sprite.zoom_x, sprite.zoom_y = data[0], data[1] when 3: sprite.x -= sprite.ox sprite.y -= sprite.oy sprite.ox = sprite.src_rect.width / 2 sprite.oy = sprite.src_rect.height / 2 sprite.x += sprite.ox sprite.y += sprite.oy sprite.opacity = 0 sprite.zoom_x = data[0] data.push(data[0]) data.push(0) data.push(0) when 4: data.push(sprite.bitmap.width / duration) data.push((data[0] > 0 ? 1 : 8)) data.push(sprite.x) tmp = [sprite.x, sprite.y, sprite.ox, sprite.oy, 0] t = sprite.bitmap.clone e_sprite = sprite.tile(10, 1) sprite.bitmap = t sprite.visible = false e_sprite.each { |el| el.x = tmp[2] + el.bitmap.width * (data[0] > 0 ? 0 : 9) el.y = tmp[3] el.x += tmp[0] el.y += tmp[1] el.z = -tmp[4] * data[0] el.visible = false tmp[4] += 1 } e_sprite[data[0] > 0 ? 0 : 9].z = 100 e_sprite[data[0] > 0 ? 0 : 9].visible = true e_sprite[data[2]].visible = true when 5: data.push(sprite.bitmap.width / duration) tmp = [sprite.x, sprite.y, sprite.ox, sprite.oy] t = sprite.bitmap.clone e_sprite = sprite.tile(10, 1) sprite.bitmap = t sprite.visible = false e_sprite.each { |el| el.x -= tmp[2] el.y -= tmp[3] el.ox = el.bitmap.width / 2 el.x += tmp[0] + el.ox el.y += tmp[1] el.zoom_x = 0 } when 6: sprite.x -= sprite.ox sprite.y -= sprite.oy sprite.ox = 0 sprite.oy = 0 when 7: e_sprite = sprite.bitmap.clone sr = sprite.src_rect.clone sprite.bitmap = Bitmap.new(e_sprite.width, e_sprite.height) sprite.src_rect = sr tmp = RPG::Cache.load_bitmap('Graphics/Transitions/', data[0]) data[0] = Bitmap.new(sr.width, sr.height) data[0].stretch_blt(data[0].rect, tmp, tmp.rect) end @sprites[1].push([sprite, type, duration, e_sprite, data, 0, ease, false]) end def self.get_data(dir, type, args, sprite) case dir when 0: case type when 0: min_dim = [sprite.bitmap.width, sprite.bitmap.height].min return (args.length == 1 ? [min_dim * args[0] / 2, min_dim * args[0] / 2, -min_dim * args[0] / 2, -min_dim * args[0] / 2] : [min_dim / 2, min_dim / 2, -min_dim / 2, -min_dim / 2]) when 1: return [] when 2: return (args.length == 1 ? [args[0], args[0]] : (args.length == 2 ? args : [0.5, 0.5])) when 3: return (args.length == 2 ? [args[0], args[0], args[1]] : (args.length == 3 ? args : [0.5, 0.5, 480])) when 4: return args.length == 3 ? args : [0.5, 4] when 5: return args.length == 1 ? args : [1] when 6: return [] when 7: return args.length == 2 ? [args[0], args[0], args[1], args[1]] : args.length == 4 ? args : [3..7, 3..7, 3..7, 3..7] when 8: return args.length == 4 ? [args[0], args[0], args[1], args[2], args[2], args[3]] : args.length == 6 ? args : [20, 20, 2, 20, 20, 2] when 9: return args.length == 1 ? args + [1.0, 1, true, 0, 0, 0, 0] : (args.length == 8 ? args + [0] : (args.length == 9 ? args : [10, 1.0, 1, true, 50, 0, 0, 0, 0])) when 10: return args.length == 2 ? args : [1.0, 1] when 11: return args.length == 2 ? args : [$data_system.battle_transition, 10] end when 1: case type when 0: return [] when 1: return (args.length == 1 ? [args[0], args[0]] : (args.length == 2 ? args : [0.5, 0.5])) when 2: return (args.length == 2 ? [args[0], args[0], args[1]] : (args.length == 3 ? args : [0.5, 0.5, 360])) when 3: return args.length == 2 ? args : [0.5, 4] when 4: return args.length == 1 ? args : [1] when 5: return [] when 6: return args.length == 2 ? [args[0], args[0], args[1], args[1]] : args.length == 4 ? args : [3..7, 3..7, 3..7, 3..7] when 7: return args.length == 2 ? args : [$data_system.battle_transition, 10] end end end end module Graphics class << self alias tdks_transitions_update update alias tdks_transitions_trans transition end def self.update self.tdks_transitions_update Transitions.update end def self.transition(*args) Transitions.update self.tdks_transitions_trans(*args) end end class Sprite def tile(cols, rows, keep_old = true) obmp = self.bitmap.clone self.bitmap = Bitmap.new(obmp.width * self.zoom_x, obmp.height * self.zoom_y) self.bitmap.stretch_blt(self.bitmap.rect, obmp, obmp.rect) sprites = [] w = self.bitmap.width / cols h = self.bitmap.height / rows cols.times { |i| rows.times { |e| sprite = Sprite.new(self.viewport) sprite.bitmap = Bitmap.new(w, h) sprite.bitmap.blt(0, 0, self.bitmap, Rect.new(i * w, e * h, w, h)) sprite.x = i * w sprite.y = e * h sprites.push(sprite) } } unless keep_old self.dispose else self.bitmap = Bitmap.new(1, 1) end return sprites end def dup sprite = Sprite.new(self.viewport) sprite.bitmap = self.bitmap sprite.zoom_x, sprite.zoom_y = self.zoom_x, self.zoom_y sprite.x, sprite.y = self.x, self.y sprite.ox, sprite.oy = self.ox, self.oy sprite.color, sprite.tone = self.color, self.tone sprite.src_rect = self.src_rect sprite.angle = self.angle return sprite end def make_str str = '' tmp = [:visible, :x, :y, :z, :opacity, :zoom_x, :zoom_y, :angle] tmp.each { |i| str += i.to_s + " = " + eval("self." + i.to_s).to_s + ";" } str end def ripple(amplitude, wavelength, horizontal = true) ripple = Win32API.new("rgss_addon.dll", "ripple", "lliii", "b") new_bitmap = Bitmap.new(bitmap.width + (horizontal ? wavelength.abs * 2 : 0), bitmap.height + (horizontal ? 0 : wavelength.abs * 2)) ripple.call(new_bitmap.__id__, bitmap.__id__, amplitude, wavelength, horizontal ? 0 : 1) self.bitmap = new_bitmap if horizontal self.x -= wavelength.abs else self.y -= wavelength.abs end end def scale(w, h) tmp = self.bitmap.clone self.bitmap = Bitmap.new(w, h) self.bitmap.stretch_blt(Rect.new(0, 0, w, h), tmp, tmp.rect) end end class Bitmap SPLIT_BITMAP = Win32API.new('rgss_addon.dll','split_bitmap','llii','i') CLEAR_RECT = Win32API.new('rgss_addon.dll','clear_rect', 'liiii', 'i') BLT = Win32API.new('rgss_addon.dll','blt', 'lliiiiii', 'i') GRAYSCALE = Win32API.new("rgss_addon.dll", "grayscale", "li", "b") NEGATIVE = Win32API.new("rgss_addon.dll", "negative", "l", "b") TINT = Win32API.new("rgss_addon.dll", "tint", "liiii", "b") COLORIZE = Win32API.new("rgss_addon.dll", "colorize", "liiii", "b") RIPPLE = Win32API.new("rgss_addon.dll", "ripple", "lliii", "b") TRANSITION_OUT = Win32API.new('rgss_addon.dll', 'transition_out', 'lliiiii', 'b') TRANSITION_IN = Win32API.new('rgss_addon.dll', 'transition_in', 'lliiiii', 'b') def split_bitmap(dest, ychange, xchange) if (ychange.abs * 4 >= xchange.abs * 3 and xchange < 0 and ychange > 0) or (xchange < 0 and ychange < 0) or (ychange.abs * 4 < xchange.abs * 3 and ychange < 0 and xchange > 0) ychange = -ychange xchange = -xchange end Bitmap::SPLIT_BITMAP.call(self.__id__, dest.__id__, ychange, xchange) end def clear_rect(*args) if args.length == 4 Bitmap::CLEAR_RECT.call(self.__id__, *args) else Bitmap::CLEAR_RECT.call(self.__id__, args[0].x, args[0].y, args[0].width, args[0].height) end end def grayscale(amount = 100) Bitmap::GRAYSCALE.call(self.__id__, amount) end def tint(color = Color.new(0, 0, 0), amount = 50) Bitmap::TINT.call(self.__id__, amount, color.red, color.green, color.blue) end def colorize(color = Color.new(0, 0, 0), amount = 50) Bitmap::COLORIZE.call(self.__id__, amount, color.red, color.green, color.blue) end end