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
回复
魔能奶糖猫
的帖子
如果是這樣的話,可以跳幀呀- -
count += 1
if count == 3
...
count = 0
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 编辑
#==============================================================================
# ■ FSprite V1.00
#------------------------------------------------------------------------------
# 浮点精灵 V1.00 by TimPKS
#
# V1.00 : 初次增加此类。
#==============================================================================
class FSprite < Sprite
def initialize(viewport = nil)
super
@_tx = 0
@_ty = 0
@_spd = 10.0
end
def x
@_x = super if !@_x
@_tx = @_x
return @_x
end
def y
@_y = super if !@_y
@_ty = @_y
return @_y
end
def ox
@_ox = super if !@_ox
@_tox = @_ox
return @_ox
end
def oy
@_oy = super if !@_oy
@_toy = @_oy
return @_oy
end
def opacity
@_opa = super if !@_opa
return @_opa
end
def x=(value)
@_x = value
super(@_x.round)
end
def y=(value)
@_y = value
super(@_y.round)
end
def ox=(value)
@_ox = value
super(@_ox.round)
end
def oy=(value)
@_oy = value
super(@_oy.round)
end
def opacity=(value)
@_opa = value
super(@_opa.round)
end
end
复制代码
上面是TimPKS写的浮点精灵代码(来自AMTT,有一些多余的东西没去掉= =,其实也就是在表达的时候可以用浮点了而已),插入上面的以后,你可以用下面的试试能不能实现。
A = FSprite.new
#下面是关于精灵的一些性质
#=====================
#下面是刷新中的内容
if A.x > 0
A.x -= 155/10
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 编辑
#Sprite#
class Sprite
#move_to#
def move_to(x, y, time)
move_x = x - self.x; move_y = y - self.y
time.times {Graphics.update; self.x += move_x / time; self.y += move_y / time}
self.x, self.y = x, y
end
end
复制代码
啊喂,无视我吧,我是打酱油的……
以下为测试……
sprite = Sprite.new
sprite.bitmap = RPG::Cache.icon("001-Weapon01")
sprite.move_to(50, 50, 50)
print sprite.x
print sprite.y
复制代码
作者:
禾西
时间:
2011-5-7 13:41
本帖最后由 禾西 于 2011-5-8 16:00 编辑
看不懂嗎,那麼我改個說法吧:
count ||= 0
if count < 2
count += 1
dx = 12 + count
else
dx = 16
end
spr.x -= dx
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】
@time = 0 # 这句话最好插入到初始化中.
@time += 1 # 以下两句请插入到update中.
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
SHIZI = Sprite.new
old_x = 0.0
for i in 1..10
old_x += 155/10
SHIZI.x = old_x.round
end
复制代码
分10帧运行即可
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1