查看: 2580|回复: 4

[已经解决] 如何在RPG Maker XP中实现多边形裁剪呢?

[复制链接]
梦石
0
星屑
3810
在线时间
744 小时
注册时间
2016-6-2
回帖
175

开拓者

发表于 2019-10-5 15:47:55 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 David_Exmachina 于 2019-10-6 13:17 编辑

好久都没来这里了。
这次我想提一些问题。

比如说,我有一张图片。
我(们)知道如果要将图片(的一部分)显示到屏幕上,
应调用以下脚本:

blt(X坐标,Y坐标,图片,矩形,[透明度])

可是这样的话,画面只会显示矩形的图像,
而我想要的效果就是让画面显示
五边形、五角星或者是六边形那样不是矩形的形状。
也就是进行“多边形裁剪”。
需要调用的脚本可能是这样的:

blt2(X坐标,Y坐标,图片,坐标组成的数组,反选,[透明度])

如何实现这个功能呢?


追加:我希望的是用这个来制作
屏幕作为玻璃碎掉的效果(类似FF10的遇敌动画)
或者是绘制扇形或者扇形的UI。
梦石
10
星屑
39550
在线时间
1919 小时
注册时间
2010-11-14
回帖
3214

R考场第七期纪念奖

发表于 2019-10-5 18:14:42 | 显示全部楼层
本帖最后由 KB.Driver 于 2019-10-6 02:08 编辑

[pre lang="ruby"]
$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[/pre]

[pre lang="ruby"]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[/pre]

[pre lang="ruby"]Cache = RPG::Cache
Sprite = RPG::Sprite
def rgss_stop
  loop{ Graphics.update }
end[/pre]

para_back.png
para_back.png

para_item.png
para_item.png

[fold=Take 1]
[pre lang="ruby"]# Take 1
src_bitmap = Cache.picture("para_item")

sprite = Sprite.new
sprite.bitmap = Bitmap.new("Graphics/Pictures/para_back")
sprite.bitmap.para_blt(src_bitmap, src_bitmap.rect)

rgss_stop
[/pre]

QQ截图20191005174855.png
[/fold]

[fold=Take 2]
[pre lang="ruby"]# Take 2
src_bitmap = Cache.picture("para_item")

sprite = Sprite.new
sprite.bitmap = Bitmap.new(640, 480)
src_bitmap.para_blt_r(sprite.bitmap, Color.new(255, 244, 198), 50)

rgss_stop[/pre]

QQ截图20191005180943.png
[/fold]

[fold=Take 3]
[pre lang="ruby"]# Take 3
src_bitmap = Cache.picture("para_item")
back_bitmap = Cache.picture("para_back")
test_bitmap = Bitmap.new(640, 480)

back_bitmap.para_blt_r(test_bitmap, Color.new(255,255,255,0))
back_bitmap.para_blt_r(test_bitmap, Color.new(77,88,99,0))
test_bitmap.para_blt(src_bitmap, src_bitmap.rect, Color.new(255,255,255,0))
test_bitmap.para_blt(src_bitmap, src_bitmap.rect, Color.new(77, 88, 99, 0))

sprite = Sprite.new
sprite.bitmap = test_bitmap[/pre]

QQ截图20191005183435.png
[/fold]

评分

参与人数 2星屑 +160 赞 +2 收起 理由
RyanBern + 160 + 1 认可答案
David_Exmachina + 1 认可答案

查看全部评分

用头画头像,用脚写脚本
回复

使用道具 举报

梦石
0
星屑
3810
在线时间
744 小时
注册时间
2016-6-2
回帖
175

开拓者

 楼主| 发表于 2019-10-6 13:17:08 | 显示全部楼层
KB.Driver 发表于 2019-10-5 18:14
$calendar99 ||= {}
$calendar99[:Bitmap] = $calendar99["Bitmap"] = 20190302

很不错啊,只是感觉这速度有点慢,
(稍微解读了一下脚本,用的是比较慢的描点法)
而且能够绘制的形状仍然受限。

我希望的是用这个来制作
屏幕作为玻璃碎掉的效果(类似FF10的遇敌动画)
或者是绘制扇形或者扇形的UI。

也许用API的话可以解决问题。
(因为我真的不会用API啊QAQ)
回复

使用道具 举报

老黄鸡

梦石
4
星屑
45694
在线时间
7948 小时
注册时间
2009-7-6
回帖
13337

MZ评测员RM创作大赛01组委会开拓者贵宾

发表于 2019-10-6 14:09:12 | 显示全部楼层
单纯的碎屏效果你可以在这里找到范例,速度还算可以接受
https://rpg.blue/thread-229995-1-1.html

RGSS性能瓶颈就在这里,想要突破只能引入外部手段(比如DLL,直接跑bytecode)
会这些的话基本也不会提这个问题了

评分

参与人数 2星屑 +45 赞 +2 收起 理由
RyanBern + 45 + 1 醋疯
David_Exmachina + 1 认可答案

查看全部评分

RGDirect - DirectX驱动的RGSS,点我了解.
(排满,暂停)RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复

使用道具 举报

梦石
0
星屑
3810
在线时间
744 小时
注册时间
2016-6-2
回帖
175

开拓者

 楼主| 发表于 2019-10-6 20:12:59 | 显示全部楼层
好吧,看来我也只能问到这里了,谢谢大家的帮助。
这就是RGSS的极限了吗?看来只能用描线法来解决这个问题了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部