0

我在 RPG Maker XP(用 ruby​​ 制作)中编写了一些动画脚本,允许您显示动态图像。我的问题不是严格意义上的 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交谈,我想在后台播放动画时做这些事情。最后,游戏在循环块中“暂停”了。

是否有另一种方法可以在不循环的情况下制作动画,或者在动画完成之前不会“暂停”屏幕的任何方法?提前致谢。

4

1 回答 1

2

通常,游戏使用称为游戏循环的系统。游戏循环是程序主要功能中的一个循环,它尽可能快地执行。每次执行时,它都会执行两个函数(或者这些函数可以是循环体,这是您可以做出的设计选择):drawupdate( update, then draw)。

update的工作是改变角色的位置,通常通过position=(x+pixelsPerSecond*secondsSinceLastTick,y+pixelsPerSecond*secondsSinceLastTick)(在游戏术语中,滴答是游戏循环的迭代)的公式。游戏循环的系统针对游戏进行了优化,因为每个滴答声您都可以执行每个动画的一小部分,它们的速度足够快,以至于它们给人一种并发的错觉(游戏循环每秒运行多次)。

update改变了整个对象的位置之后(例如,一个快速的 NPC 现在距离左侧 5 个像素),draw用于绘制场景。draw可以做几件事。它可以在 指示的位置绘制精灵,update也可以保持自己的动画(腿走路的动画之类的小东西--update不应该在走路的动画中设置腿的位置,只是角色的新位置对于这个勾号)。

我不确定我是否准确地回答了你的问题,因为我对 RPG Maker 一无所知(所以也许你必须完全做其他事情),但因为你说的一般来说,这就是它。

于 2012-06-23T14:12:19.093 回答