Project1
标题: 如何在RPG Maker XP中实现多边形裁剪呢? [打印本页]
作者: David_Exmachina 时间: 2019-10-5 15:47
标题: 如何在RPG Maker XP中实现多边形裁剪呢?
本帖最后由 David_Exmachina 于 2019-10-6 13:17 编辑
好久都没来这里了。
这次我想提一些问题。
比如说,我有一张图片。
我(们)知道如果要将图片(的一部分)显示到屏幕上,
应调用以下脚本:
blt(X坐标,Y坐标,图片,矩形,[透明度])
可是这样的话,画面只会显示矩形的图像,
而我想要的效果就是让画面显示
五边形、五角星或者是六边形那样不是矩形的形状。
也就是进行“多边形裁剪”。
需要调用的脚本可能是这样的:
blt2(X坐标,Y坐标,图片,坐标组成的数组,反选,[透明度])
如何实现这个功能呢?
追加:我希望的是用这个来制作
屏幕作为玻璃碎掉的效果(类似FF10的遇敌动画)
或者是绘制扇形或者扇形的UI。
作者: KB.Driver 时间: 2019-10-5 18:14
本帖最后由 KB.Driver 于 2019-10-6 02:08 编辑
$calendar99 ||= {}
$calendar99[:Bitmap] = $calendar99["Bitmap"] = 20190302
class Bitmap
DEFAULT_COLOR = Color.new(77,88,99)
def para_blt(src_bitmap, src_rect, color = DEFAULT_COLOR, color2 = nil)
self.width.times do |x|
self.height.times do |y|
next unless get_pixel(x, y) == color
x2 = src_rect.x + x ; y2 = src_rect.y + y
src_color = src_bitmap.get_pixel(x2, y2)
next if color2 && src_color == color2
set_pixel(x, y, src_color)
end
end
end
def para_blt_r(src_bitmap, color = DEFAULT_COLOR, differ = 0)
self.width.times do |x|
self.height.times do |y|
next unless get_pixel(x, y).difference(color) <= differ
src_bitmap.set_pixel(x, y, get_pixel(x, y) )
end
end
end
end
$calendar99 ||= {}
$calendar99[:Bitmap] = $calendar99["Bitmap"] = 20190302
class Bitmap
DEFAULT_COLOR = Color.new(77,88,99)
def para_blt(src_bitmap, src_rect, color = DEFAULT_COLOR, color2 = nil)
self.width.times do |x|
self.height.times do |y|
next unless get_pixel(x, y) == color
x2 = src_rect.x + x ; y2 = src_rect.y + y
src_color = src_bitmap.get_pixel(x2, y2)
next if color2 && src_color == color2
set_pixel(x, y, src_color)
end
end
end
def para_blt_r(src_bitmap, color = DEFAULT_COLOR, differ = 0)
self.width.times do |x|
self.height.times do |y|
next unless get_pixel(x, y).difference(color) <= differ
src_bitmap.set_pixel(x, y, get_pixel(x, y) )
end
end
end
end
module Math
def self.mDistance(x1, y1, z1, x2, y2, z2)
(x1 - x2).abs + (y1 - y2).abs + (z1 - z2).abs
end
end
class Color
def difference(other_color)
(Math.mDistance3D(self.red, self.green, self.blue,
other_color.red, other_color.green, other_color.blue) +
self.alpha - other_color.alpha) / 4
end
end
module Math
def self.mDistance(x1, y1, z1, x2, y2, z2)
(x1 - x2).abs + (y1 - y2).abs + (z1 - z2).abs
end
end
class Color
def difference(other_color)
(Math.mDistance3D(self.red, self.green, self.blue,
other_color.red, other_color.green, other_color.blue) +
self.alpha - other_color.alpha) / 4
end
end
Cache = RPG::Cache
Sprite = RPG::Sprite
def rgss_stop
loop{ Graphics.update }
end
Cache = RPG::Cache
Sprite = RPG::Sprite
def rgss_stop
loop{ Graphics.update }
end
para_back.png
para_item.png
Take 1
Take 2
Take 3
作者: David_Exmachina 时间: 2019-10-6 13:17
很不错啊,只是感觉这速度有点慢,
(稍微解读了一下脚本,用的是比较慢的描点法)
而且能够绘制的形状仍然受限。
我希望的是用这个来制作
屏幕作为玻璃碎掉的效果(类似FF10的遇敌动画)
或者是绘制扇形或者扇形的UI。
也许用API的话可以解决问题。
(因为我真的不会用API啊QAQ)
作者: fux2 时间: 2019-10-6 14:09
单纯的碎屏效果你可以在这里找到范例,速度还算可以接受
https://rpg.blue/thread-229995-1-1.html
RGSS性能瓶颈就在这里,想要突破只能引入外部手段(比如DLL,直接跑bytecode)
会这些的话基本也不会提这个问题了
作者: David_Exmachina 时间: 2019-10-6 20:12
好吧,看来我也只能问到这里了,谢谢大家的帮助。
这就是RGSS的极限了吗?看来只能用描线法来解决这个问题了。
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |