Project1

标题: 图片缩放循环的设置 [打印本页]

作者: acv255    时间: 2015-8-19 21:48
标题: 图片缩放循环的设置
想写一个会随光标位置改变而在0.8倍和1倍之间来回变动的按钮,目前大概是这样
RUBY 代码复制
  1. def button_zoom(sprite,x,y,k=1)
  2.     if sprite.x != x
  3.     sprite.x = sprite.x < x ? sprite.x += 1 : sprite.x -= 1
  4.     end
  5.     if sprite.y != y
  6.     sprite.y = sprite.y < y ? sprite.y += 1 : sprite.y -= 1
  7.     end
  8.     if sprite.zoom_x != k
  9.     sprite.zoom_x = sprite.zoom_x < k ? sprite.zoom_x += 0.01 : sprite.zoom_x -= 0.01
  10.     end
  11.     if sprite.zoom_y != k
  12.     sprite.zoom_y = sprite.zoom_y < k ? sprite.zoom_y += 0.01 : sprite.zoom_y -= 0.01
  13.     end
  14.   end
  15.  
  16.  
  17.   def slidefx
  18.     if $stopmove == 1
  19.       case @command_window.index
  20.       when 0
  21.       button_zoom(@sprite_enter,140,140)
  22.       button_zoom(@sprite_save,150,200,0.8)
  23.       button_zoom(@sprite_exit,160,250,0.8)
  24.       @sprite_index.x = 140
  25.       @sprite_index.y = 140
  26.       when 1
  27.       button_zoom(@sprite_enter,140,150,0.8)
  28.       button_zoom(@sprite_save,150,200)
  29.       button_zoom(@sprite_exit,160,250,0.8)
  30.       @sprite_index.x = 150
  31.       @sprite_index.y = 200
  32.       when 2
  33.       button_zoom(@sprite_enter,140,140,0.8)
  34.       button_zoom(@sprite_save,150,200,0.8)
  35.       button_zoom(@sprite_exit,160,260)
  36.       @sprite_index.x = 160
  37.       @sprite_index.y = 260
  38.       end
  39.     end
  40.   end


实际运行时发现按钮在不断颤抖进行微小的放大缩小,把p @sprite_exit.zoom_x 插入update跟踪发现它的缩放倍率大概是因为进行浮点运算产生误差,所以不能精确执行从1倍到0.8倍和从0.8倍到1倍的缩放循环。

这个问题应该怎么解决.....

QQ截图20150819213943.jpg (27.67 KB, 下载次数: 21)

QQ截图20150819213943.jpg

作者: cinderelmini    时间: 2015-8-19 22:11
本帖最后由 cinderelmini 于 2015-8-19 22:40 编辑

----误人子弟伪科学----
  1. if sprite.zoom_x != k
  2.   sprite.zoom_x = sprite.zoom_x < k ? sprite.zoom_x += 0.01 : sprite.zoom_x -= 0.01
  3. end
复制代码
类似这种判定,脑内演算的时候似乎可行,实际上忽略了一点细节:
【sprite.zoom_x < k ? sprite.zoom_x += 0.01 : sprite.zoom_x -= 0.01】
sprite.zoom_x 小于 k 的时候,就增加0.01,大于或等于k的时候就减小0.01,
那么设想一个情况,当k = 1.0, sprite.zoom_x处于0.99的情况,
sprite.zoom_x + 0.01 = 1.0,
那么不满足sprite.zoom_x < k这个条件,于是sprite.zoom_x - 0.01 = 0.99,
那么又满足了sprite.zoom_x < k这个条件,于是sprite.zoom_x + 0.01 = 1.0,
以上两个步骤就在那循环了,所以看到的是这个精灵在微弱地抖动。。。


作者: acv255    时间: 2015-8-19 22:19
cinderelmini 发表于 2015-8-19 22:11
类似这种判定,脑内演算的时候似乎可行,实际上忽略了一点细节:
【sprite.zoom_x < k ? sprite.zoom_x +=  ...

问题不出在这里
对于你说的问题我有前置判断 if sprite.zoom_y != k 的

我的问题如截图...程序计算1-0.01的时候实际上并不是0.01...我想问的是怎么摆脱这该死的浮点数
作者: 喵呜喵5    时间: 2015-8-19 22:33
即使是浮点数,仍然毫无任何问题
  1. sprite = Sprite.new
  2. sprite.bitmap = Cache.system("06_avatar_big")

  3. class << sprite
  4.   def update
  5.     super   
  6.     if @zoom_in_flag
  7.       self.zoom_x += 0.01
  8.       self.zoom_y = self.zoom_x
  9.       @zoom_in_flag = false if self.zoom_x > 1      
  10.     else
  11.       self.zoom_x -= 0.01
  12.       self.zoom_y = self.zoom_x
  13.       @zoom_in_flag = true if self.zoom_x < 0.8      
  14.     end   
  15.   end
  16. end

  17. loop do
  18.   
  19.   sprite.update
  20.   
  21.   Graphics.update
  22.   
  23. end
复制代码

作者: acv255    时间: 2015-8-19 23:22
喵呜喵5 发表于 2015-8-19 22:33
即使是浮点数,仍然毫无任何问题


你这个的效果好像是自动放大缩小循环...跟我的设想不一样
大概是我标题起错了。

不过我刚刚用了一个勉强的解决方案
  1. if sprite.zoom_x < k - 0.01
  2.       sprite.zoom_x += 0.05
  3.       sprite.zoom_y = sprite.zoom_x
  4.     elsif sprite.zoom_x > k + 0.01
  5.       sprite.zoom_x -= 0.05
  6.       sprite.zoom_y = sprite.zoom_x
  7.     end
复制代码
损失了一点精度,肉眼分辨不出来




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