Project1

标题: 怎么让Sprite精灵的坐标移动支持小数? [打印本页]

作者: 失去的记忆    时间: 2011-5-6 07:50
标题: 怎么让Sprite精灵的坐标移动支持小数?
众所周知,Sprite类给我们提供了太多的边路,如显示一个独立的图片等等....
今天无意间发现,Sprite竟然不支持小数的坐标移动!!
def main
@sprite = Sprite.new
@sprite.bitmap = 图片路径
@sprite.x = 100
@sprite.z = 9999
end
def update
@sprite.x += 0.5
#@sprite.x += 1
end
测试发现,红色的代码完全不起作用,但是蓝色代码去掉注释后,图片会缓慢的移动,
也就是会所精灵的移动不能用小数!!!(试验了无数次....)
PS:在这里请教大家这个问题的解决方法,小弟对底层的RGSS不怎么懂。。。dsu_plus_rewardpost_czw
作者: 禾西    时间: 2011-5-6 10:23
為甚麼要支持小數移動- -b難道還有半個像數不成?抱歉,不是RGSS做不到,而是咱們的計算姬做不到。
作者: 魔能奶糖猫    时间: 2011-5-6 11:30
回复 禾西 的帖子

可能楼主需要做缓速移动之类的吧,比如3祯移动2象素。
另回楼主,可以取整啥的。
作者: 禾西    时间: 2011-5-6 11:44
回复 魔能奶糖猫 的帖子

如果是這樣的話,可以跳幀呀- -
  1. count += 1
  2. if count == 3
  3.   ...
  4.   count = 0
  5. end
复制代码

作者: 小⑨    时间: 2011-5-6 17:56
http://ishare.iask.sina.com.cn/f/6218750.html
这是一个高手做的东西,虽然是一个很综合的东西,但是里面有浮点精灵,可以参考下~
作者: 失去的记忆    时间: 2011-5-7 10:31
恩...首先谢谢大家的回复,可能大家理解错了,我现在的问题是这样的:
起始图片A的X坐标155,现在要让他在10祯之内移动到X坐标 0 的地方,所以
如果这样写的话:
if A.x > 0
  A.x -= 155/10
end
显然这样写是行不通的....
如果这样写:
if A.x > 0
  A.x -= 150/10
if A.x == 5
   A.x = 0
end
end
那么在最后5个像素的时候会出现好像是直接跳过去的情况......
难道非要这样写吗?
if A.x > 2
  A.x -= 153/9
elsif A.x <= 2
  A.x = 0
end
如果这样写也不行啊....最后2祯还是有问题啊......
所以请教:10祯内移动155像素的最佳方法.....
作者: 小⑨    时间: 2011-5-7 12:03
本帖最后由 小⑨ 于 2011-5-7 12:04 编辑

  1. #==============================================================================
  2. # ■ FSprite V1.00
  3. #------------------------------------------------------------------------------
  4. #  浮点精灵 V1.00 by TimPKS
  5. #
  6. #   V1.00 : 初次增加此类。
  7. #==============================================================================

  8. class FSprite < Sprite
  9.   def initialize(viewport = nil)
  10.     super
  11.     @_tx = 0
  12.     @_ty = 0
  13.     @_spd = 10.0
  14.   end
  15.   def x
  16.     @_x = super if !@_x
  17.     @_tx = @_x
  18.     return @_x
  19.   end
  20.   def y
  21.     @_y = super if !@_y
  22.     @_ty = @_y
  23.     return @_y
  24.   end
  25.   def ox
  26.     @_ox = super if !@_ox
  27.     @_tox = @_ox
  28.     return @_ox
  29.   end
  30.   def oy
  31.     @_oy = super if !@_oy
  32.     @_toy = @_oy
  33.     return @_oy
  34.   end
  35.   def opacity
  36.     @_opa = super if !@_opa
  37.     return @_opa
  38.   end
  39.   def x=(value)
  40.     @_x = value
  41.     super(@_x.round)
  42.   end
  43.   def y=(value)
  44.     @_y = value
  45.     super(@_y.round)
  46.   end
  47.   def ox=(value)
  48.     @_ox = value
  49.     super(@_ox.round)
  50.   end
  51.   def oy=(value)
  52.     @_oy = value
  53.     super(@_oy.round)
  54.   end
  55.   def opacity=(value)
  56.     @_opa = value
  57.     super(@_opa.round)
  58.   end
  59. end
复制代码
上面是TimPKS写的浮点精灵代码(来自AMTT,有一些多余的东西没去掉= =,其实也就是在表达的时候可以用浮点了而已),插入上面的以后,你可以用下面的试试能不能实现。

  1. A = FSprite.new
  2. #下面是关于精灵的一些性质
  3. #=====================
  4. #下面是刷新中的内容
  5. if A.x > 0
  6.   A.x -= 155/10
  7. end

复制代码
具体效果也不会是真正的浮点(显示器必须要以像素为基础),但是在使用上肯定会方便很多~
作者: ZAndiH    时间: 2011-5-7 12:09
本帖最后由 ZAndiH 于 2011-5-7 12:12 编辑

因为像素数量是整数,像素是图像显示的最小单位,目前为止不可能分开像素的- -
(好比元电荷是最小的电量单位、、当然你要是说到介子水平我也没辙- -)

于是可分的只剩下了时间,也就是让它出现几次1s移动2个像素效果。
如果不是眼睛特别的尖,我想应该没人看得出来吧、、



手动方法:
就是希望其中5次移动2而非1像素,而且这5次要分散开(以避免看起来太难受),那么直接在其中判断一下、、除以30取下余就好了、、等于某数值时,再 A.x += 1

自动方法:
像上面所说的那样,取整(不大于它的最大整数)。具体是哪个函数请自行寻找。(因为我也忘了RGSS里的取整函数是什么了- -)

恩、、解决问题了?

作者: 忧雪の伤    时间: 2011-5-7 12:28
本帖最后由 忧雪の伤 于 2011-5-7 12:39 编辑
  1. #Sprite#
  2. class Sprite
  3.   #move_to#
  4.   def move_to(x, y, time)
  5.     move_x = x - self.x;  move_y = y - self.y
  6.     time.times {Graphics.update; self.x += move_x / time; self.y += move_y / time}
  7.     self.x, self.y = x, y
  8.   end
  9. end
复制代码
啊喂,无视我吧,我是打酱油的……
以下为测试……

  1. sprite = Sprite.new
  2. sprite.bitmap = RPG::Cache.icon("001-Weapon01")
  3. sprite.move_to(50, 50, 50)
  4. print sprite.x
  5. print sprite.y
复制代码

作者: 禾西    时间: 2011-5-7 13:41
本帖最后由 禾西 于 2011-5-8 16:00 编辑

看不懂嗎,那麼我改個說法吧:

  1. count ||= 0
  2. if count < 2
  3.   count += 1
  4.   dx = 12 + count
  5. else
  6.   dx = 16
  7. end
  8. spr.x -= dx
  9. count = 0 if spr.x == 0
复制代码

作者: 忧雪の伤    时间: 2011-5-7 13:50
再次说一下..Graphics.update执行的时候所有图像都会停止!!这个方法实在是!!!  

这是为了偷懒罢了,这种方法并不支持多个图片同时移动。
作者: 失去的记忆    时间: 2011-5-8 13:55
算了...还是没有得到想要的答案....
PS:希望大家能够解决这个问题:
就是想办法实现这句脚本:A.x += 155/10 让它在10帧之内从0移动到155的位置...
作者: 退屈£无聊    时间: 2011-5-8 15:49
本帖最后由 退屈£无聊 于 2011-5-8 15:57 编辑

【想到一个办法...】
【是155/10么...那么就是每桢15.5】
  1. @time = 0   # 这句话最好插入到初始化中.
  2. @time += 1                                            # 以下两句请插入到update中.
  3. A.x -= @time % 2 == 0 ? 15 : 16
复制代码
这样的话只有1点X的偏差....不过方法有危险,使用需谨慎
作者: IamI    时间: 2011-5-8 17:13
@sprite.x += 0.5
-->
@_sprite_x += 0.5
@sprite.x = @_sprite_x.floor
作者: Wind2010    时间: 2011-5-8 19:11
  1. SHIZI = Sprite.new
  2. old_x = 0.0
  3. for i in 1..10
  4.   old_x += 155/10
  5.   SHIZI.x = old_x.round
  6. end
复制代码
分10帧运行即可




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