查看: 2105|回复: 4

[已经解决] 图片缩放循环的设置

[复制链接]
梦石
3
星屑
75
在线时间
200 小时
注册时间
2008-7-8
回帖
145
发表于 2015-8-19 21:48:14 | 显示全部楼层 |阅读模式

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

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

×
想写一个会随光标位置改变而在0.8倍和1倍之间来回变动的按钮,目前大概是这样
[pre lang="ruby"]def button_zoom(sprite,x,y,k=1)
    if sprite.x != x
    sprite.x = sprite.x < x ? sprite.x += 1 : sprite.x -= 1
    end
    if sprite.y != y
    sprite.y = sprite.y < y ? sprite.y += 1 : sprite.y -= 1
    end
    if sprite.zoom_x != k
    sprite.zoom_x = sprite.zoom_x < k ? sprite.zoom_x += 0.01 : sprite.zoom_x -= 0.01
    end
    if sprite.zoom_y != k
    sprite.zoom_y = sprite.zoom_y < k ? sprite.zoom_y += 0.01 : sprite.zoom_y -= 0.01
    end
  end
  
  
  def slidefx
    if $stopmove == 1
      case @command_window.index
      when 0
      button_zoom(@sprite_enter,140,140)
      button_zoom(@sprite_save,150,200,0.8)
      button_zoom(@sprite_exit,160,250,0.8)
      @sprite_index.x = 140
      @sprite_index.y = 140
      when 1
      button_zoom(@sprite_enter,140,150,0.8)
      button_zoom(@sprite_save,150,200)
      button_zoom(@sprite_exit,160,250,0.8)
      @sprite_index.x = 150
      @sprite_index.y = 200
      when 2
      button_zoom(@sprite_enter,140,140,0.8)
      button_zoom(@sprite_save,150,200,0.8)
      button_zoom(@sprite_exit,160,260)
      @sprite_index.x = 160
      @sprite_index.y = 260
      end
    end
  end[/pre]

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

这个问题应该怎么解决.....
QQ截图20150819213943.jpg

梦石
0
星屑
9716
在线时间
2775 小时
注册时间
2008-9-5
回帖
3458

开拓者短篇八RM组冠军短篇九导演组亚军白银编剧

发表于 2015-8-19 22:11:25 | 显示全部楼层
本帖最后由 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,
以上两个步骤就在那循环了,所以看到的是这个精灵在微弱地抖动。。。

回复

使用道具 举报

梦石
3
星屑
75
在线时间
200 小时
注册时间
2008-7-8
回帖
145
 楼主| 发表于 2015-8-19 22:19:49 | 显示全部楼层
cinderelmini 发表于 2015-8-19 22:11
类似这种判定,脑内演算的时候似乎可行,实际上忽略了一点细节:
【sprite.zoom_x < k ? sprite.zoom_x +=  ...

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

我的问题如截图...程序计算1-0.01的时候实际上并不是0.01...我想问的是怎么摆脱这该死的浮点数

点评

啊啊~抱歉,窝把前置if忽略掉了……  发表于 2015-8-19 22:39
回复

使用道具 举报

梦石
1
星屑
23246
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2015-8-19 22:33:18 | 显示全部楼层
即使是浮点数,仍然毫无任何问题
  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
复制代码
回复

使用道具 举报

梦石
3
星屑
75
在线时间
200 小时
注册时间
2008-7-8
回帖
145
 楼主| 发表于 2015-8-19 23:22:06 | 显示全部楼层
喵呜喵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
复制代码
损失了一点精度,肉眼分辨不出来

点评

一般浮点数就是这么做的 zoom > k + epsilon, epsilon 是一个较小的数字  发表于 2015-9-5 13:30
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部