适当的OO 2D动画逻辑

时间:2012-06-23 13:43:47

标签: ruby animation logic

我在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交谈,我想在背景中播放动画时做那些事情。最后,游戏在循环块中“暂停”。

是否有另一种方法可以在没有循环的情况下进行动画,或者在动画结束之前没有“暂停”屏幕的任何内容?提前谢谢。

1 个答案:

答案 0 :(得分:2)

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

draw的工作是改变角色的位置,通常用公式update(在游戏术语中,刻度是游戏循环的迭代)。游戏循环系统针对游戏进行了优化,因为每个动画都可以执行每个动画的一小部分,足够快,它们会产生并发错觉(游戏循环每秒运行很多次)。

position=(x+pixelsPerSecond*secondsSinceLastTick,y+pixelsPerSecond*secondsSinceLastTick)更改了整个对象的位置(例如,快速NPC现在比左边更远5个像素),update用于绘制场景。 draw可以做几件事。它可以在draw指示的位置绘制精灵,并且还可以保持它自己的动画(像腿行走的动画这样的小事情 - update不应该设置腿的位置。步行动画,只是这个刻度的角色的新位置。

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