Project1

标题: 如果让RM填充不规则图形? [打印本页]

作者: 圣灵战士    时间: 2008-2-24 05:11
标题: 如果让RM填充不规则图形?
比如,现在有A B C不在直线上的3点组成的面
需要RMXP来填充,我应该怎么做?

我是个脚本盲,根本对这个一巧不通。如果可能的话,最好有一个独立的小脚本就好了。

这个对于各位大大门来说很容易,但对我来说非常难,请大大门帮忙下好么? [LINE]1,#dddddd[/LINE]此贴于 2008-3-3 0:06:48 被版主水迭澜提醒,请楼主看到后对本贴做出回应。
[LINE]1,#dddddd[/LINE]
----------------版务----------------
如果问题未解决,请继续提问
如果问题已解决,请结贴
若到末贴发贴时间后一周仍未结贴
管理员会自动为你过期帖子、结贴或强行认可答案(好人卡-1)

作者: 水迭澜    时间: 2008-2-24 05:14

这个我去写个脚本好了-v-+好象满好玩~~
作者: 圣潔の水晶    时间: 2008-2-24 05:14
提示: 作者被禁止或删除 内容自动屏蔽
作者: 幻の飞鱼    时间: 2008-2-24 06:02
一个点一个点画?=。=

其实我都不知道怎么画直线……难道用很扁的四边形么?
作者: 亿万星辰    时间: 2008-2-24 06:03
扫描线填充
逐行或逐列扫描,与范围边界交替的奇数点为进点,偶数点为出点,然后以这两点为边界fill_rect即可,如果你给的是封闭区域,那么在已知宽高以后,这个算法的效率还是蛮高的,你如果整个屏幕扫的话,效率会很低
作者: 美兽    时间: 2008-2-24 06:03
算了,与楼上重复了。
作者: 幻の飞鱼    时间: 2008-2-24 06:09
以下引用亿万星辰于2008-2-23 22:03:47的发言:

扫描线填充
逐行或逐列扫描,与范围边界交替的奇数点为进点,偶数点为出点,然后以这两点为边界fill_rect即可,如果你给的是封闭区域,那么在已知宽高以后,这个算法的效率还是蛮高的,你如果整个屏幕扫的话,效率会很低


就是用fill_rect画直线咯……=。=那……height是不是就应该是1=。=

其实我倒想问……如果我要画的是一个方框,中间是透明的……
除了画一个大的框。再画一个透明的小框外,有更方便的方法没=。=
作者: 美兽    时间: 2008-2-24 06:13
以下引用幻の飞鱼于2008-2-23 22:09:25的发言:


以下引用亿万星辰于2008-2-23 22:03:47的发言:

扫描线填充
逐行或逐列扫描,与范围边界交替的奇数点为进点,偶数点为出点,然后以这两点为边界fill_rect即可,如果你给的是封闭区域,那么在已知宽高以后,这个算法的效率还是蛮高的,你如果整个屏幕扫的话,效率会很低



就是用fill_rect画直线咯……=。=那……height是不是就应该是1=。=

其实我倒想问……如果我要画的是一个方框,中间是透明的……
除了画一个大的框。再画一个透明的小框外,有更方便的方法没=。=


[本贴由作者于 2008-2-23 22:11:15 最后编辑]


若是不考虑工具的特殊性,应该是最简单的镂空了,另外我做窗体万花筒时,使用过扫描线算法。
作者: 圣灵战士    时间: 2008-2-24 06:18
可以给一个通用脚本么?
比如密闭的话,只用输入3个点的X Y坐标和颜色就可以了的那种。
偶想做个真3D游戏来玩玩。(不要说效率,这个我有点子)
作者: 水迭澜    时间: 2008-2-24 06:58
def draw_triangle(x1,y1,x2,y2,x3,y3,color=Color.new(0,0,0,255))
  triangle=Sprite.new
  triangle.bitmap=Bitmap.new(640,480)
  x=0
  k1=(y2-y1)*1.0/(x2-x1)
  k2=(y3-y1)*1.0/(x3-x1)
  k3=(y3-y2)*1.0/(x3-x2)
  height=1
  for x in x1..x2
      y = (x-x1)*k1+y1 #求出点
      height = (x-x1)*k2+y1-y
      if height < 0
        y+=height
        height = 0 - height
      end
      triangle.bitmap.fill_rect(x, y, 1, height, color)
    end
    for x in x2..x3
      y = (x-x2)*k3+y2
      height = (x-x1)*k2+y1-y
      if height < 0
        y+=height
        height = 0 - height
      end
      triangle.bitmap.fill_rect(x, y, 1, height, color)
    end
end
大概是这样。
不过这个东西有点局限性,x1,x2,x3必须从小到大,y坐标则没所谓
LZ看懂的话就自己改吧=v=

P。S 我又犯了白痴错误……竟然用int来算斜率……orz|||
作者: 圣灵战士    时间: 2008-2-25 01:07
大概是这样。
不过这个东西有点局限性,x1,x2,x3必须从小到大,y坐标则没所谓
LZ看懂的话就自己改吧=v=
---------------------------
虽然偶完全无法理解你这个脚本
但是如果问题仅仅只有[x1,x2,x3必须从小到大]这个的话,偶或许还是有办法解决了。在前面加上一段修正过程,在执行脚本前重新将3个点排列一便。
恩,这么一来就可以做面的渲染了。用数组来筐定每个面的点,计算Z的在屏幕上的偏移,最后填充。
似乎可以放弃直接在点上显示图片的这种低劣的仿3d显示方法了。
这就拿去试试。
作者: 圣灵战士    时间: 2008-2-25 01:26
发现2个问题
首先,不光是必须从下到大,相等都不可以...
然后,显示出来的图象过一段时间就会消失。似乎和以前Rock给我的那个显示文字的脚本差不多的样子,总是自动消失。

作者: 幻の飞鱼    时间: 2008-2-25 04:04
以下引用圣灵战士于2008-2-24 17:26:30的发言:

发现2个问题
首先,不光是必须从下到大,相等都不可以...
然后,显示出来的图象过一段时间就会消失。似乎和以前Rock给我的那个显示文字的脚本差不多的样子,总是自动消失。


关于消失,以前遇到过一些很扭曲的情况
明明是俩个精灵,名字也不一样……对其中一个bitmap.clear,结果两个都消失了……

改了很久没有好……于是给其中一个设了个viewport就好了……到现在依然没明白为什么
作者: 美兽    时间: 2008-2-25 04:05
以下引用幻の飞鱼于2008-2-24 20:04:48的发言:


以下引用圣灵战士于2008-2-24 17:26:30的发言:

发现2个问题
首先,不光是必须从下到大,相等都不可以...
然后,显示出来的图象过一段时间就会消失。似乎和以前Rock给我的那个显示文字的脚本差不多的样子,总是自动消失。



关于消失,以前遇到过一些很扭曲的情况
明明是俩个精灵,名字也不一样……对其中一个bitmap.clear,结果两个都消失了……

改了很久没有好……于是给其中一个设了个viewport就好了……到现在依然没明白为什么


因为调用了同一个位图引用.
作者: 诡异の猫    时间: 2008-2-25 04:06
以下引用圣灵战士于2008-2-24 17:26:30的发言:

发现2个问题
首先,不光是必须从下到大,相等都不可以...
然后,显示出来的图象过一段时间就会消失。似乎和以前Rock给我的那个显示文字的脚本差不多的样子,总是自动消失。

消失..是因为你没有刷新
你建立了一个不规则图形后
要把他放到Scene中刷新
作者: 水迭澜    时间: 2008-2-25 08:29
恩恩,同上……
因为LZ只问如何填充……没有问刷新……汗= =
p。s 我觉得LZ如果能理解3D的构造,理解我这个脚本应该不难吧?也就是高中数学而已……根据点的位置求直线方程……= =
作者: 圣灵战士    时间: 2008-2-27 21:19
首先,偶数学没学好...所以到现在都写不出可以任意旋转摄象机角度的公式...我用的是勾股定律求投影,结果是只能当摄象机角度和其中1个面垂直时才能使用...那个COS,SIN什么的,饿...数学老师,原谅我吧{/pz}
我根本不会任何脚本的说,我只是喜欢自己胡乱DIY而已。对于显示色块这方面,我根本不了解。

我的构思是这样的,因为我之前已经做出了仿3d脚本,是根据3D透视得到点在屏幕上的投影,最后在这个投影上显示图片,并根据深度缩方。这个方法和PS1上不少3d RPG的原理类似。但现在,如果能够填充三角形的话,实际上就是把以前用来显示图片的点连接起来,这样也就构成面了。至于坐标的存放,我的方法是[总面数,定位X,定位Y,定位Z,第一面X,第一面Y,第一面Z,第一面颜色1,第一面颜色2,第一面颜色3,第一面颜色4...(之后从第4位循环)]。所以我才求这个只要3个坐标就可以填充的脚本...饿...
结果,又是死在刷新上....{/pz}
作者: 水迭澜    时间: 2008-2-27 21:25
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

我可以囧一下么?
刷新问题比3D问题好解决多了……
直线方程比你所谓的3D投影好解决更多了……我压根没用到sin和cos……= =
另,问题解决了请结帖吧……
作者: 劍之飛龍☆    时间: 2008-2-27 21:26
大哥,求你了,上Q!!!脚本已经好了!!!




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1