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

Project1

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

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

[复制链接]

Lv3.寻梦者

梦石
3
星屑
65
在线时间
200 小时
注册时间
2008-7-8
帖子
180
跳转到指定楼层
1
发表于 2015-8-19 21:48:14 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
想写一个会随光标位置改变而在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

Lv4.逐梦者

「Pemercyia」


Urhurrenna

梦石
0
星屑
9397
在线时间
2748 小时
注册时间
2008-9-5
帖子
3543

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

2
发表于 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,
以上两个步骤就在那循环了,所以看到的是这个精灵在微弱地抖动。。。

回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
3
星屑
65
在线时间
200 小时
注册时间
2008-7-8
帖子
180
3
 楼主| 发表于 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
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21631
在线时间
9415 小时
注册时间
2012-6-19
帖子
7118

开拓者短篇九导演组冠军

4
发表于 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
复制代码
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
3
星屑
65
在线时间
200 小时
注册时间
2008-7-8
帖子
180
5
 楼主| 发表于 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
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-16 13:05

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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