2012-06-23 66 views
0

我正在RPG Maker XP(用红宝石制作)中制作一些动画脚本,允许您显示动态图像。我的问题在这里并不是严格意义上的RPG Maker,而是一般性的术语。这是我发现至今的代码和它的工作原理,但有问题的:正确的OO 2D动画逻辑

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

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

回答

2

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

update的工作是改变角色的位置,通常通过公式position=(x+pixelsPerSecond*secondsSinceLastTick,y+pixelsPerSecond*secondsSinceLastTick)(在游戏术语中,刻度是游戏循环的迭代)。游戏循环系统针对游戏进行了优化,因为每个动画可以执行每个动画中的一小部分,并且足够快,从而给出并发幻觉(游戏循环每秒运行多次)。

update已经改变了整个对象的位置(例如,快速NPC现在向左5个像素),draw用于绘制场景。 draw可以做几件事情。它可以在update指示的位置上绘制精灵,并且它还可以保持它自己的动画(像行走动画这样的小动作 - update不应该在行走动画中设置双腿的位置,这个勾号的字符)。

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

+0

谢谢你的输入,是的,该方法在游戏主循环中调用。我在做的是在游戏主循环中循环播放动画,所以当然结果就是这样。现在我要弄清楚如何让这个对象与游戏主循环“并行”运行。真的有可能有“多循环”吗?就像多线程一样,进程a转到线程A,b转到B,两个线程都在主循环上运行? – AzDesign

+0

不,不。这不完全是。你必须打电话,几乎是该方法的一小部分。每次游戏循环被调用时,做一小部分动作。在某种程度上,只需将方法中的代码放在循环中并将其放入游戏循环中(通过更改,再次阅读答案)。 – Linuxios

+0

工作时间在脚本上摆弄之后,我从你的答案中得到了建议,而不是在我自己的方法中定义自己的循环,而是在游戏的主循环的Update方法中采用动画行为(move(x,y))搜索这个位置在哪里)。它的工作原理现在我可以在动画在后台运行时移动。谢谢,这解决了我的问题 – AzDesign