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

Project1

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

[已经解决] 怎么在任意两个事件之间画一条直线?

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
95 小时
注册时间
2013-4-10
帖子
86
跳转到指定楼层
1
发表于 2013-9-18 08:32:25 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

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

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

x
本帖最后由 嫉妒の榛子 于 2013-9-20 15:00 编辑

搜了一下,以前貌似有其它人问过这种问题,不过全都打不开是怎么个情况?  -_-
...

Lv1.梦旅人

梦石
0
星屑
50
在线时间
95 小时
注册时间
2013-4-10
帖子
86
10
 楼主| 发表于 2013-9-20 14:59:42 | 只看该作者
Sion 发表于 2013-9-20 12:15

完美实用好评!大爱Sion大!太感谢了!!!
...
回复 支持 反对

使用道具 举报

Lv2.观梦者 (暗夜天使)

梦石
0
星屑
266
在线时间
2355 小时
注册时间
2009-3-13
帖子
2309

贵宾

9
发表于 2013-9-20 12:15:06 | 只看该作者
本帖最后由 Sion 于 2013-9-20 12:16 编辑
嫉妒の榛子 发表于 2013-9-20 10:59
报告,实测中,当dx < dy 的时候,会出现这个问题
  1. class << SceneManager
  2.   #事件中调用此方法 SceneManager.draw_event_line(event_id1, event_id2)
  3.   def draw_event_line(id1, id2)
  4.     @scene.draw_event_line(id1, id2) if @scene.is_a?(Scene_Map)
  5.   end
  6. end
  7. class Scene_Map
  8.   def draw_event_line(id1, id2)
  9.     @spriteset.create_event_line(id1, id2)
  10.   end
  11. end
  12. #
  13. class Spriteset_Map
  14.   alias_method :update_2013920, :update
  15.   alias_method :dispose_2013920, :dispose
  16.   def update
  17.     update_2013920
  18.     update_event_line
  19.   end
  20.   def dispose
  21.     dispose_2013920
  22.     dispose_event_line
  23.   end
  24.   #
  25.   def create_event_line(id1, id2)
  26.     dispose_event_line
  27.     es1 = nil
  28.     es2 = nil
  29.     @character_sprites.each {|s|
  30.       next unless s.character.is_a?(Game_Event)
  31.       case s.character.id
  32.       when id1; es1 = s
  33.       when id2; es2 = s
  34.       end
  35.     }
  36.     @event_line = Sprite_EventLine.new(@viewport1, es1, es2)
  37.   end
  38.   def update_event_line
  39.     @event_line.update if @event_line
  40.   end
  41.   def dispose_event_line
  42.     @event_line.dispose if @event_line
  43.   end
  44. end
  45. #
  46. class Sprite_EventLine < Sprite
  47. include Math
  48. #参数设定
  49. def line_w; 700 end #最大长度
  50. def line_h;   2 end #宽度
  51. def line_c; Color.new(255, 0, 0) end
  52.   #
  53.   def initialize(vp, es1, es2)
  54.     super(vp)
  55.     @es1 = es1
  56.     @es2 = es2
  57.     self.bitmap = Bitmap.new(line_w, line_h)
  58.     self.bitmap.fill_rect(bitmap.rect, line_c)
  59.     self.z = 1
  60.     update
  61.   end
  62.   def update
  63.     x1 = @es1.x
  64.     x2 = @es2.x
  65.     y1 = @es1.y
  66.     y2 = @es2.y
  67.     self.x = x1     #更新x坐标
  68.     self.y = y1 - 8 #更新y坐标
  69.     self.angle = radian_by(x1, x2, y1, y2) / PI * 180
  70.     src_rect.width = ((x1 - x2) ** 2 + (y1 - y2) ** 2) ** 0.5
  71.   end
  72.   def dispose
  73.     bitmap.dispose
  74.     super
  75.   end
  76.   def radian_by(x1, x2, y1, y2)
  77.     if x1 > x2
  78.       if y1 > y2
  79.         aatan(x1 - x2, y1 - y2) + PI / 2
  80.       elsif y1 < y2
  81.         aatan(y2 - y1, x1 - x2) + PI
  82.       else
  83.         PI
  84.       end
  85.     elsif x1 < x2
  86.       if y1 > y2
  87.         aatan(y1 - y2, x2 - x1)
  88.       elsif y1 < y2
  89.         aatan(x2 - x1, y2 - y1) + PI * 3 / 2
  90.       else
  91.         0
  92.       end
  93.     else
  94.       if y1 > y2
  95.         PI / 2
  96.       else
  97.         PI * 3 / 2
  98.       end
  99.     end
  100.   end
  101.   def aatan(t, s)
  102.     atan(t.fdiv(s))
  103.   end
  104. end
复制代码

评分

参与人数 1星屑 +132 梦石 +1 收起 理由
taroxd + 132 + 1 补上认可

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
95 小时
注册时间
2013-4-10
帖子
86
8
 楼主| 发表于 2013-9-20 10:59:34 | 只看该作者
本帖最后由 嫉妒の榛子 于 2013-9-20 11:01 编辑
Sion 发表于 2013-9-19 20:15
@imsy
fdiv: 整型除法的结果取浮点值。


报告,实测中,当dx < dy 的时候,会出现这个问题



代码水平不够……修改半天也搞不定……@Sion

(PS:其实这种做法貌似还有些很难处理的地方,比如说当事件移动的话……)

点评

没@到,再@Sion  发表于 2013-9-20 11:00
...
回复 支持 反对

使用道具 举报

Lv2.观梦者 (暗夜天使)

梦石
0
星屑
266
在线时间
2355 小时
注册时间
2009-3-13
帖子
2309

贵宾

7
发表于 2013-9-19 20:15:19 | 只看该作者
本帖最后由 Sion 于 2013-9-19 20:18 编辑
嫉妒の榛子 发表于 2013-9-19 18:37
瞎鼓捣了半天,依旧不行,游戏中就没成功显示过哪怕一次,也不知道问题错在哪里。
这是改动至今的版本, ...
  1. # 抗锯齿
  2. class Bitmap
  3.   def draw_wu_line(x1, y1, x2, y2, r,g,b,a=255)
  4.     dx = x2 - x1
  5.     dy = y2 - y1
  6.     if dx.abs < dy.abs
  7.       t_ = x1; x1 = y1; y1 = t_
  8.       t_ = x2; x2 = y2; y2 = t_
  9.       t_ = dx; dx = dy; dy = t_
  10.     end
  11.     if x2 < x1
  12.       t_ = x1; x1 = x2; x2 = t_
  13.       t_ = y1; y1 = y2; y2 = t_
  14.     end
  15.     set_pixel(x1, y1, Color.new(r,g,b,a))
  16.     set_pixel(x2, y2, Color.new(r,g,b,a))
  17.     gradient = dy.fdiv(dx)
  18.     intery = y1 + gradient
  19.     for x in (x1 + 1)..(x2 - 1)
  20.       y1 = intery.to_i
  21.       y2 = intery.ceil
  22.       set_pixel(x, y1, Color.new(r,g,b, intery.rfpart * a))
  23.       set_pixel(x, y2, Color.new(r,g,b, intery.fpart * a)) if y1 != y2
  24.       intery = intery + gradient
  25.     end
  26.   end
  27. end
  28. class Numeric
  29.   def fpart; self - self.to_i end #获取小数部分
  30.   def rfpart; 1 - fpart end # 1 - 小数部分
  31. end

  32. #test code:

  33. $t = Sprite.new
  34. bitmap = Bitmap.new(Graphics.width, Graphics.height)
  35. bitmap.draw_wu_line(12,35, 455,321, 255,255,255)
  36. $t.bitmap = bitmap

  37. loop {Graphics.update}
复制代码
@imsy
fdiv: 整型除法的结果取浮点值。
  1. 3/4        #=> 0
  2. 3.fdiv(4) #=> 0.75
复制代码

点评

哦哦,多谢。测试成功。  发表于 2013-9-19 20:24
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
95 小时
注册时间
2013-4-10
帖子
86
6
 楼主| 发表于 2013-9-19 18:37:05 | 只看该作者
Sion 发表于 2013-9-19 13:40
上面的方法是在 Bitmap 上画直线,从点(x1,y1)到点(x2,y2),颜色参数 r g b + alpha。
生成一个精灵 ...
  1. class Bitmap

  2.   def draw_wu_line(x1, y1, x2, y2, r,g,b,a)

  3.     @zhixian = Sprite.new
  4.     @zhixian.bitmap = Bitmap.new(544, 416)    #两行
  5.    
  6.     dx = x2 - x1
  7.     dy = y2 - y1
  8.     if dx.abs < dy.abs
  9.       t_ = x1; x1 = y1; y1 = t_
  10.       t_ = x2; x2 = y2; y2 = t_
  11.       t_ = dx; dx = dy; dy = t_
  12.     end
  13.     if x2 < x1
  14.       t_ = x1; x1 = x2; x2 = t_
  15.       t_ = y1; y1 = y2; y2 = t_
  16.     end
  17.     set_pixel(x1, y1, Color.new(r,g,b,a))
  18.     set_pixel(x2, y2, Color.new(r,g,b,a))
  19.     gradient = dy.fdiv(dx)
  20.     intery = y1 + gradient
  21.     for x in (x1 + 1)..(x2 - 1)
  22.       y1 = intery.to_i
  23.       y2 = intery.ceil
  24.       set_pixel(x, y1, Color.new(r,g,b, intery.rfpart * a))
  25.       set_pixel(x, y2, Color.new(r,g,b, intery.fpart * a)) if y1 != y2
  26.       intery = intery + gradient
  27.     end
  28.    
  29.     @zhixian.bitmap.draw_wu_line(50,50,255,255 , 255 , 128 , 0 , 255)  
  30.     #测试常量,想着成功再改为变量……然后一直没成功
  31.    
  32. loop do
  33.   Graphics.update
  34. end

  35.   end

  36. end
复制代码
瞎鼓捣了半天,依旧不行,游戏中就没成功显示过哪怕一次,也不知道问题错在哪里。
这是改动至今的版本,我已经不行了……让我厚着脸皮再伸手党一回吧……@Sion ,灰常感谢&抱歉
...
回复 支持 反对

使用道具 举报

Lv2.观梦者 (暗夜天使)

梦石
0
星屑
266
在线时间
2355 小时
注册时间
2009-3-13
帖子
2309

贵宾

5
发表于 2013-9-19 13:40:12 | 只看该作者
嫉妒の榛子 发表于 2013-9-19 12:35
好吧,先表示感谢。
不过昨天花了几个小时楞是没搞懂这玩意儿要怎么用(我自重……)。

上面的方法是在 Bitmap 上画直线,从点(x1,y1)到点(x2,y2),颜色参数 r g b + alpha。
生成一个精灵,直接用指定事件的 screen_x, screen_y 来确定这个直线精灵的位置就可以了。
其实也可以用旋转精灵的方法获得任意角度的直线。

另感谢试玩游戏。Demo应该不会再修复非致命Bug了。正式版的难度会比较亲民的 ;)

点评

概念懂,就是实现不懂,囧……创建了精灵弄半天没弄出来……  发表于 2013-9-19 15:29
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
95 小时
注册时间
2013-4-10
帖子
86
4
 楼主| 发表于 2013-9-19 12:35:57 | 只看该作者
Sion 发表于 2013-9-18 10:22
这是网上能找到的算法 Link,不过刚好我要用就转成Ruby了
另外,要不带抗锯齿的参考这里 Link
# 抗锯齿

好吧,先表示感谢。
不过昨天花了几个小时楞是没搞懂这玩意儿要怎么用(我自重……)。

另外,《原点》有个小小的BUG,人物移动到地图边缘的时候,菜单会超出边缘看不到……
还有石头人的谜题太难啦~不看视频攻略完全不知道要怎么过(看了后都跪了四五次)仇恨系统太难掌握……
...
回复 支持 反对

使用道具 举报

Lv2.观梦者 (暗夜天使)

梦石
0
星屑
266
在线时间
2355 小时
注册时间
2009-3-13
帖子
2309

贵宾

3
发表于 2013-9-18 10:22:58 | 只看该作者
本帖最后由 Sion 于 2013-9-18 10:32 编辑

这是网上能找到的算法 Link,不过刚好我要用就转成Ruby了
另外,要不带抗锯齿的参考这里 Link
RUBY 代码复制
  1. # 抗锯齿
  2. class Bitmap
  3.   def draw_wu_line(x1, y1, x2, y2, r,g,b,a=255)
  4.     dx = x2 - x1
  5.     dy = y2 - y1
  6.     if dx.abs < dy.abs
  7.       t_ = x1; x1 = y1; y1 = t_
  8.       t_ = x2; x2 = y2; y2 = t_
  9.       t_ = dx; dx = dy; dy = t_
  10.     end
  11.     if x2 < x1
  12.       t_ = x1; x1 = x2; x2 = t_
  13.       t_ = y1; y1 = y2; y2 = t_
  14.     end
  15.     set_pixel(x1, y1, Color.new(r,g,b,a))
  16.     set_pixel(x2, y2, Color.new(r,g,b,a))
  17.     gradient = dy.fdiv(dx)
  18.     intery = y1 + gradient
  19.     for x in (x1 + 1)..(x2 - 1)
  20.       y1 = intery.to_i
  21.       y2 = intery.ceil
  22.       set_pixel(x, y1, Color.new(r,g,b, intery.rfpart * a))
  23.       set_pixel(x, y2, Color.new(r,g,b, intery.fpart * a)) if y1 != y2
  24.       intery = intery + gradient
  25.     end
  26.   end
  27. end

忘了还需要这个
RUBY 代码复制
  1. class Numeric
  2.   def fpart; self - self.to_i end #获取小数部分
  3.   def rfpart; 1 - fpart end # 1 - 小数部分
  4. end

点评

17行那个gradient = dy.fdiv(dx),请问fdiv是啥  发表于 2013-9-19 19:02
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
362
在线时间
1292 小时
注册时间
2013-1-12
帖子
3590

贵宾

2
发表于 2013-9-18 08:34:11 | 只看该作者
這我就不知道了
不过搜索的話要復制連結然後把66rpg改為cgyouxi

点评

好家伙,看到一大堆不明觉厉的东西。我研究研究下先(虽然目测研究不出结果)  发表于 2013-9-18 09:11

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-17 16:32

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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