Email:

高级指南:猴子趣事

此指导包含一个高级示例程序,帮助你全面理解Mama开发环境和语言。
内容
此指导中的主题包括:
  • 移动摄影机,淡出,淡入
  • 把程序代码分成模块
  • 更多关于3D运动,移作和转向
  • 更多关于指令的并行执行
  • 定义事件
  • 使用函数


布置舞台

我们必须首先把对象数插入到舞台中:
  • 插入树木和植物。
  • 插入电视,沙发和遥控器 - 从文件夹对象添加电视和遥控器,并从文件夹家具添加扶手椅。 按照上面的图片式样,把对象放好。
  • 插入猴子 - 从文件夹动物添加2只猴子。 把第一只猴子放在电视右边,第二只放到电视左边,如上面图片所示。
  • 插入角色 - 从文件夹字符_/小孩添加角色特雷弗克里斯滕。 从字符_/宠物添加狗萨姆
既然刚刚添加的最后一个角色只在动画运行时进入舞台,我们就把它放到左侧,摄像机视野之外。你可以通过变焦,拖住角色到左侧,然后恢复到原来的焦距来实现。 这是一种设置带有对象的舞台的常用技术,以帮助对象在视频播放时进入画面。 这和真实剧院很相似。 演员会在幕后等着,当表演时再进入舞台。
一个使摄像机回到原来的位置的简便技术是在摄像机旁边放置三脚架: 在舞台编辑模式下,右边面板包含按键place tripod at the camera。 如果您单击该按键,将显示一个对话框,要求你命名在当前摄像机位置的三脚架。 如果你移动摄像机,通过从场景选择框(3D窗口上边)选择被保存位置,你可以回到原始位置。


程序脚本

就像在话剧中一样,我们需要编写动画剧本。 我们将逐步完成:
  • 黑色屏幕,显示介绍标题,渐渐出现。
  • 摄像机从树梢开始,然后慢慢下降到原来的舞台高度。
  • 开始的场景: 两只树上的猴子,树枝上两只猴子之间的电视机,地面的控制器和扶手椅上,扶手椅是倒下的。
  • 电视右边的猴子(猴子1)尖叫。
  • 特雷弗萨姆(从左边)进入舞台。
  • 特雷弗看了一下遥控器,然后又看了看尖叫的猴子,最后又看了一下遥控器- 他知道猴子想要遥控器。
  • 特雷弗用他的脚把遥控器弹给猴子。
  • 猴子停止了尖叫,特雷弗萨姆(从右边)离开舞台。
  • 猴子2在扶手椅上跳跃,开始看电视。
  • 猴子1把遥控器扔到了猴子2的头上。
  • monkey2开始尖叫并逃跑了(从左边离开舞台)。
  • 克里斯滕(从左边)进入舞台。
  • 猴子1又开始尖叫。
  • 相机上升到树梢。
  • 淡出,结束标题。


设置程序为方法

我们可以看到,脚本太长以至于不能写在world主方法中。 把它分成方法将简化程序代码的编写和维护,也可以简化更改或添加新的功能。 方法:
  • 世界程序.主要_方法() - 程序的主要方法,调用其它方法
  • 介绍() - 淡出,显示开始的标题和淡入。然后把摄像机取景从树梢向下移动到地面
  • 猴子1尖叫 - 我们并不需要定义方法。 在猴子对象中已经有一个名为尖叫的方法
  • 世界程序.特雷弗_进入() - 特雷弗萨姆进入第二阶段
  • 世界程序.特雷弗_见到_猴子() - 特雷弗见到猴子
  • 特雷弗.转换_视线() - 特雷弗在猴子和遥控器之间转换视线
  • 特雷弗.弹跳() - 特雷弗把遥控器弹到猴子的手中
  • 世界程序.特雷弗_离开()- 特雷弗萨姆离开舞台
  • 世界程序.猴子2_跳_上_扶手椅() - 猴子2在扶手椅上跳跃
  • 世界程序.猴子_扔出_电视_遥控器() - 猴子1把遥控器扔在猴子2的头上
  • 世界程序.猴子2_逃走() - 猴子2逃跑
  • 世界程序.克里斯滕_进入() - 克里斯滕进入舞台
  • 世界程序.结束() - 移动摄像机到树梢,淡出,显示标题结束


以上两种方法,大多没有具体到某个特定的对象,但工作在几个对象,因此应被视为是在世界对象的方法定义。 这两个例外是特雷弗.转换_视线()和特雷弗.弹跳()。 此外,我们可能需要确定该方案的写作过程中更多的方法。 在本教程的其余部分,我们将省略的简单方法世界程序
为了测试写好的方法,可以使用一种有用的技术 - 通过点击创建一个新的事件在事件窗口中添加事件,并选择类型为当世界程序启动时的事件。 然后选择刚刚创建的方法。 在测试阶段,要使原始事件(调用主方法的)失效。 完成测试之后,你可以删除刚刚创建的新事件(并激活原始事件),也可以简单地让它失效,这样你就可以做进一步的测试。 这种测试叫做“单元测试”,因为我们在一个测试中这测试一个单元。


编写方法

现在,我们已经准备好编写world的方法。 提醒: 为了在世界程序对象中创建一个方法,选择object tree中的“world”,然后在细节区域选择创建新的方法。 打开的对话框提供了方法的名称。

方法说明:

介绍()

  1. 淡出 - 使用摄像机的标准方法淡出到黑色 - 拖住方法到当前方法的开始处
  2. 显示开始标题 - 使用摄像机的标准方法显示标题 - 以介绍标题的一个变量提供出来,并把时长设为2秒
  3. 向上移动摄像机 - 调用摄像机的移动, 其中变量 向上 及 5.5米
  4. 淡入 - 使用摄像机的从黑色淡出,而且时长=2
  5. 向下移动摄像机- 再次使用摄像机的移动,其中变量向下而且5.5米, 时长=5.5秒
点击此处获得方法代码

特雷弗_进入()

  1. 首先,我们告诉特雷弗步行2米进入舞台,使他被看到 - 使用方法特雷弗.步行。 注意: 此方法对某些角色(位于对象图库的文件夹字符_)有效。
  2. 我们想对萨姆做同样的操作,但是没有步行方法! 根据方法代码,在萨姆对象中创建名为萨姆的方法。 然后调用变量为2米的此方法。 注意你必须为类型为数字的方法创建一个参数。
  3. 特雷弗萨姆步行时:
    • 用猴子1的方法尖叫使它尖叫。
    • 使用带有变量特雷弗的标准方法转向,让两只猴子看特雷弗
  4. 步行结束,特雷弗注意到两只猴子 - 用他的方法转向让他的头转向尖叫的猴子。而且,使用变量为猴子1的方法观看让他的头转向尖叫的猴子。
  5. sam 很兴奋 - 为了表达情绪,调用他的方法兴奋大叫和变量为2的摇_尾巴
提示: 制作两个一起执行模块,其中第一个包含指令1-4,第二个包含指令3-7。 注意,有些方法被重复了,这对创造连续动画很重要。

点击此处获得方法代码

特雷弗_见到_猴子()

创建两个一起执行模块。 第一个包括:
  1. 特雷弗前进1.5米
  2. 猴子1尖叫
  3. 两只猴子(再次)转向特雷弗
  4. 萨姆转向尖叫的猴子
  5. 和之前一样,让萨姆看起来很兴奋
第二个:
  • 再次让两只猴子转向特雷弗
点击此处获得方法代码

特雷弗.转换_视线()

这是一个简单的方法,但是特别的是,它接受两个变量: 两个要被看的对象。 相比显式的使用方法中的对象,这是一个更好的方案因为它更一般,而且将来可以被其他对象使用(重用)。
  1. 创建两个变量
  2. 特雷弗看第一个对象: 调用特雷弗.观看,并且当变量选择表达式,然后选择第一个方法变量。
  3. 拖住变量为1秒的指令等待
  4. 和以前一样,让特雷弗看第二个对象。
  5. 再次添加变量为1秒的指令等待
  6. 特雷弗看第一个对象。
点击此处获得方法代码

特雷弗.弹跳()

这个方法也定义在特雷弗对象上,并且也接受变量: 弹跳的对象 - 什么(遥控器),目标对象 - (猴子1的左手),和整个目标体 - 睡_身体。 我们按照如下方法制作动画: 特雷弗走向什么对象,然后三件事情同时发生: 特雷弗突然蹲下,什么对象移动到对象,并且睡_身体向前倾斜抓住什么对象。 然后特雷弗站起来,睡_身体向后靠。
  1. 创建上述变量
  2. 特雷弗什么
  3. 使用特雷弗的方法什么特雷弗走向步行。 作为一个临时总量参数,设为1米。 我们想要做的是让特雷弗走向什么对象,我们该如何实现呢?
    • 提示: 选择对象树中的特雷弗和细节区域中的函数_。 找到函数距离至,并拖住它放到对走向调用的数量参数中。 从弹出菜单中选择表达式然后选择什么
    • 点击更多...选择空间关系,然后选择上边。 这个参数决定了特雷弗应该从空间位置的角度看,如何得到什么对象。
  4. 现在并行执行:
    • 特雷弗跪下 - 找到合适的方法 - 并给它一个膝盖变量和时长1/4秒。
    • 移动什么 - 从定义中拖放什么,从弹出菜单中选择移向并给出变量。 使用对象中的函数距离至设置参数总量
    • 现在我们需要做一些修正: 从刚定制的总量中选择更多..., 然后选择数学。 选择减法操作。 减法操作设置为0.07米。
    • 为了让猴子1前倾,调用睡_身体转动参数向前且时长0.25秒。
    • 特雷弗再看一次,因为它已经移动了。
  5. 现在把猴子放回初始位置: 因为我们想让遥控器一直在他手里,所以我们需要把它和“粘”在一起。 标准方法设置_交通工具可以完成这些。
    • 调用什么.设置_交通工具并把作为一个变量传递给他。 现在,什么就和“粘”在了一起,而且可以随着它移动和转向。
    • 使用转动方法让睡_身体回到初始位置。
    • 现在调用什么.设置_交通工具,其中世界程序对象是一个变量 - 这个方法可以使它和分离。
  6. 调用特雷弗.站起来
点击此处获得方法代码

特雷弗_离开()

在这个简单的方法中特雷弗萨姆离开舞台。 在一起执行中执行:
  1. 调用特雷弗的方法走出画面 - 这会使它离开
  2. 萨姆转向特雷弗
  3. 萨姆走7米
点击此处获得方法代码

猴子2_跳_上_扶手椅()和跳_向

我们现在想让猴子2跳过扶手椅,但是他没有这样一个方法。 他确实有一个名为猴子_跳的方法,但是它只是做原地跳。 在下一部分中,我们将制作这个方法的副本并编辑它以便满足我们的需求。 所以首先去下一部分完成方法跳_向的创建。
  1. 添加等待指令,时长半秒。
  2. 从猴子2中调用跳_向并把armchair作为一个变量传递给它。
  3. 添加等待指令,时长1/4秒。
  4. 让猴子2转向电视机。
  5. 让猴子2看电视机:因为猴子2没有观看方法,所以调用头部的指向方法。 为了完成这些,首先选择对象树中的猴子2,然后选择它的子树。 找到猴子的,拖放到编辑区域。 从弹出菜单中选择指向,其中一个参数是电视机。
  6. 调用猴子2的猴子_面部方法以便猴子朝向电视机。
点击这里获取方法的代码

猴子2.跳_向()

如前所述,我们需要为猴子编写跳_向方法,以便可以跳向给定的目标:
  1. 当选定对象树中的猴子2,右击方法跳跃并从弹出菜单中选择复制。 右击刚创建的方法,并改名为“跳_向”。
  2. 让我们检查新的方法代码:
    • 方法包含四个一起执行模块: 第一个是猴子倾斜,第二个是猴子伸直腿站起来,第三个是猴子向上移动时回倾一些,最后一个是猴子回到初始位置。
  3. 创建名为什么类型为物件的参数。
  4. 让猴子转向目标,什么
  5. 缩减所有指令中方法的时长到0.25秒。
  6. 在第三个模块中,当回倾向上移动时,调用带有参数什么的方法移向。 和之前对特雷弗的操作一样,设置总量参数。弹跳0.07米。 设置时长为0.75秒。
点击这里获取方法的代码

猴子_扔出_电视_遥控器

这个方法实现了猴子1把遥控器扔到猴子2头上的过程。 扔的动包括猴子1的左臂向后转,然后进一步把他的前臂向后转,接着扔出遥控器的同时手快速向前带出。
  1. 使用猴子1的设置_交通工具方法把遥控器和猴子1的左手粘起来。
  2. 并行执行: 左手在0.5秒内向后转0.12圈,并使用相同的变量移动他的前臂
  3. 把遥控器从猴子1的左手分离出来。
  4. 并行执行: 使用方法移向把猴子1的左手在0.25秒内向前转动0.12圈,使用函数距离至移动遥控器距猴子2的头部0.3米的距离。
  5. 并行执行: 猴子2的头部向后移动0.12圈,让它尖叫,并移动遥控器到有电视机的树旁的花旁边(如果没有花,添加一个)。
点击这里获取方法的代码

猴子2_逃走

在这个方法中猴子2逃到舞台左侧。
  1. 转动猴子2的面部朝向舞台左侧。 你可以通过在舞台左侧放置假花,然后使猴子朝向它来完成。
  2. 调用猴子2中刚刚创建的有花作为目标变量的方法。
  3. 如果到左侧距离太大,你可以在中间放置另外一朵花,可以作为中间步骤让猴子跳过去。
点击这里获取方法的代码

克里斯滕_进入

在这个方法中克里斯滕进入舞台,而且猴子1又开始尖叫。 按照之前特雷弗_进入的方式构建这个方法的代码。 点击这里获取方法的代码

结束

  1. 向上移动摄像机(6米)到树梢
  2. 淡出
  3. 播放标题,例如“就这样持续下去:)
  4. 播放标题“剧终
点击这里获取方法的代码