我在RPG Maker XP(用红宝石制作)中做一些动画脚本,可以让你显示动态图像。我的问题不是严格来说是RPG Maker,而是一般而言。这是我到目前为止发现的代码,它有效,但有问题:
class Poser
attr_accessor :images
def initialize
@images = Sprite.new
@images.bitmap = RPG::Cache.picture('Character.png') #display picture
@images.x = 540 #place it on the bottom right corner of the screen
@images.y = 180
end
def move(x,y)
@images.x += x
@images.y += y
end
def animate(x,y,step,delay) #Animate moving the picture up and down with delay
forward = true
2.times { #the first loop, do code 2 times of :
step.times {
wait(delay) #wait x frame
if forward
move(x/step,y/step) #move the picture down
else
move(-x/step,-y/step) #move the picture up
end
}
wait(delay*3)
forward = false
}
end
def wait(time)
while time > 0
time -= 1
Graphics.update
end
end
end
然后我创建它的一个实例并调用方法:
$test = Poser.new
$test.animate(0,10,10,10)
以上代码的作用是上下移动图片(就像呼吸动画一样,你的头部上下摆动)
如您所见,我使用循环功能来延迟移动图片。我得到的是,无法做其他任何直到 动画完成。我所说的“其他任何东西”就像是和我的角色走来走去,和NPC交谈,我想在背景中播放动画时做那些事情。最后,游戏在循环块中“暂停”。
是否有另一种方法可以在没有循环的情况下进行动画,或者在动画结束之前没有“暂停”屏幕的任何内容?提前谢谢。
答案 0 :(得分:2)
通常,游戏使用称为游戏循环的系统。游戏循环是程序主要功能中的循环,它尽可能快地执行。每次执行时,它都会执行两个函数(或者这些函数可以是循环的主体,这是您可以做出的设计选择):draw
和update
(update
,然后{ {1}})。
draw
的工作是改变角色的位置,通常用公式update
(在游戏术语中,刻度是游戏循环的迭代)。游戏循环系统针对游戏进行了优化,因为每个动画都可以执行每个动画的一小部分,足够快,它们会产生并发错觉(游戏循环每秒运行很多次)。
position=(x+pixelsPerSecond*secondsSinceLastTick,y+pixelsPerSecond*secondsSinceLastTick)
更改了整个对象的位置(例如,快速NPC现在比左边更远5个像素),update
用于绘制场景。 draw
可以做几件事。它可以在draw
指示的位置绘制精灵,并且还可以保持它自己的动画(像腿行走的动画这样的小事情 - update
不应该设置腿的位置。步行动画,只是这个刻度的角色的新位置。
我不确定我是否正在回答你的问题,因为我对RPG Maker一无所知(所以也许你必须完全做其他事情),但因为你说的一般,这就是它。