设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1934|回复: 4
打印 上一主题 下一主题

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

[复制链接]

Lv3.寻梦者

梦石
0
星屑
3755
在线时间
740 小时
注册时间
2016-6-2
帖子
211

开拓者

跳转到指定楼层
1
发表于 2019-10-5 15:47:55 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

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

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

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

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

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

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

如何实现这个功能呢?


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

Lv5.捕梦者

梦石
10
星屑
39440
在线时间
1914 小时
注册时间
2010-11-14
帖子
3315

R考场第七期纪念奖

2
发表于 2019-10-5 18:14:42 | 只看该作者
本帖最后由 KB.Driver 于 2019-10-6 02:08 编辑

RUBY 代码复制
  1. $calendar99 ||= {}
  2. $calendar99[:Bitmap] = $calendar99["Bitmap"] = 20190302
  3.  
  4. class Bitmap
  5.   DEFAULT_COLOR = Color.new(77,88,99)
  6.  
  7.   def para_blt(src_bitmap, src_rect, color = DEFAULT_COLOR, color2 = nil)
  8.     self.width.times do |x|
  9.       self.height.times do |y|
  10.         next unless get_pixel(x, y) == color  
  11.         x2 = src_rect.x + x ; y2 = src_rect.y + y
  12.         src_color = src_bitmap.get_pixel(x2, y2)
  13.         next if color2 && src_color == color2  
  14.         set_pixel(x, y, src_color)
  15.       end
  16.     end
  17.   end
  18.  
  19.   def para_blt_r(src_bitmap, color = DEFAULT_COLOR, differ = 0)
  20.     self.width.times do |x|
  21.       self.height.times do |y|
  22.         next unless get_pixel(x, y).difference(color) <= differ  
  23.         src_bitmap.set_pixel(x, y, get_pixel(x, y) )
  24.       end
  25.     end
  26.   end
  27. end


RUBY 代码复制
  1. module Math
  2.   def self.mDistance(x1, y1, z1, x2, y2, z2)
  3.     (x1 - x2).abs + (y1 - y2).abs + (z1 - z2).abs
  4.   end  
  5. end
  6.  
  7. class Color
  8.   def difference(other_color)
  9.     (Math.mDistance3D(self.red, self.green, self.blue,
  10.     other_color.red, other_color.green, other_color.blue) +
  11.     self.alpha - other_color.alpha) / 4
  12.   end
  13. end


RUBY 代码复制
  1. Cache = RPG::Cache
  2. Sprite = RPG::Sprite
  3. def rgss_stop
  4.   loop{ Graphics.update }
  5. end


para_back.png


para_item.png


Take 1

Take 2

Take 3


评分

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

查看全部评分

用头画头像,用脚写脚本
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3755
在线时间
740 小时
注册时间
2016-6-2
帖子
211

开拓者

3
 楼主| 发表于 2019-10-6 13:17:08 | 只看该作者
KB.Driver 发表于 2019-10-5 18:14
$calendar99 ||= {}
$calendar99[:Bitmap] = $calendar99["Bitmap"] = 20190302

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

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

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

使用道具 举报

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
39665
在线时间
7484 小时
注册时间
2009-7-6
帖子
13483

开拓者贵宾

4
发表于 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
不接受对其他插件维护的委托
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3755
在线时间
740 小时
注册时间
2016-6-2
帖子
211

开拓者

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

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-26 13:36

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表