Navigation

    CreatiCode Scratch Forum

    • Register
    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • CreatiCode

    三维物理 - 弹珠游戏(难度:5级)

    小教程
    1
    1
    242
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • C
      creaticodeteacher2-mail last edited by admin

      用到的相关知识

      • 为物体添加高亮
      • 复制到镜像位置
      • 为三维场景启用物理引擎
      • 为三维物体添加物理实体
      • 向物理实体施加力
      • 限制物理实体运动的速度和方向

      介绍

      在这篇教程中,我们将利用物理引擎制作一个弹珠游戏:

       
       

      第1步 - 新建一个空场景

      首先,在创益编程游乐场新建一个项目,删除带小狗的“角色1”,把“空的1”角色改名为“主角”。

      在“主角”角色中添加如下积木,将创建一个空的三维场景、显示三维坐标轴并启用物理引擎,物理引擎的重力设置为-1000。

      1.png

       
      得到如下结果:

       
       

      第2步 - 新增4个角色

      在这个游戏中,有4种物体:桌子、球、扳机和目标。

      2.png

       

      如同二维的Scratch项目,每种物体用一个角色来组织代码,是个好理念。因此,我们新增4个角色,分别为“桌子”、“球”、“扳机”和“目标”。

      3.png

       
       

      第3步 - 广播4条消息

      为了告诉每个角色建造各自的部分,我们要从主角角色广播4条消息:

      4.png

       
      注意,这些消息我们用的是“广播( )并等待”,这样的话,每一步完成以后才进行下一步。

       
       

      第4步 - 每个角色接收消息

      在这4个新角色中,第1个积木就是“当收到( )”,这样的话,每当主角角色发出消息后,其他角色就知道自己该工作了。

      例如,在“桌子”角色中,我们接收消息“添加桌子”:

      5.png

       
      其他3个角色类似。

       
       

      第5步 - 添加带三个侧面的方形管子

      现在我们编辑“桌子”角色。桌子可以用一个带三个侧面的方形管子制作。我们让下端开口,从而使球有机会滚出桌子。

      大家自己决定桌子的大小和颜色。比如,宽500,长1050,高110,边缘厚度可以为50:

      d2.gif

       
      添加方形管子的积木如下:

      6.png

       
       

      第6步 - 木材材质

      大家可以根据喜好为桌子设置材质,使桌子看起来更逼真。例如,大家可以选择材质“木材07”,大小为1000:

      7.png

       
      得到如下结果:

       
       

      第7步 - 为方形管子设置物理实体

      现在我们为方形管子添加物理实体。因为它不动,所以质量设为0。因为我们要让球在边上反弹,所以恢复系数要高,比如80。最后,为了让球碰到边缘后旋转,我们要设置一定的摩擦系数,比如20。

      8.png

       
       

      第8步 - 添加一个斜面

      接下来,我们在右下角添加一个斜面,就是一个盒子,x/y/z三维度大小为200/50/100。绕z轴旋转到-45度,然后移动到 x坐标160、y坐标-410。最后添加同样的材质。

      d5.gif

       

      这一步的积木如下:

      9.png

       
       

      第9步 - 为斜面添加物理实体

      我们要为斜面添加和方形管子一样的物理实体,从而当弹珠碰到桌子的每一个边缘时都有同样的反弹效果。

      10.png

       
       

      第10步 - 将斜面复制到左边

      左边需要同样的斜面,用积木“复制到镜像位置”能轻松实现,模式为“左右”:

      11.png

       
      现在“桌子”角色就完成了:

       
       

      第11步 - 添加球

      现在我们切换至“球”角色来添加球。首先添加一个直径为30的球体,命名为“球”。移动至y坐标-400、z坐标10。自己可以随意添加喜欢的材质。程序如下所示:

      12.png

       
      得到如下结果:

       
       

      第12步 - 为球添加物理实体

      因为球要四处弹跳,所以球的质量应当大于0。那我们用默认质量100就可以了。把恢复系数设为100,会非常有弹性。摩擦系数要小一点,比如20,这样的话,当球碰到其他物体时就会旋转,但不会减速太多。

      13.png

       
       

      第13步 - 切换至顶部摄像机视角

      现在我们改成从顶部观看整个桌面。大家要切换至“主角”角色,添加积木“设置摄像头”,然后设置距离和视角:

      14.png

       
      现在看到的视角如下所示。看起来桌面像是立起来的,y轴正方向向上,y轴负方向向下。

       
       

      第14步 - 使球“落下”

      现在看起来好像球是悬浮着。为了让球自动向下滚动,我们可以对其物理实体施加y轴负方向的力。切换至“球”角色并添加如下积木:

      15.png

       
      从现在这个视角看起来球就是“向下落”:

       
       

      第15步 - 添加扳机盒子

      接下来,切换至“扳机”角色,在下部添加一个扳机盒子来托住球和击球。x/y/z三维度大小为150/40/100,然后移动至y坐标-480。大家可以随意挑选材质。

      16.png

       
      结果如下所示:

       
       

      第16步 - 为扳机添加物理实体

      现在我们为扳机开启物理引擎。我们要将扳机上下移动,但不受球和重力的影响,所以我们把质量也设为0。把恢复系数设为80,从而使球能够反弹,当球落下来后还能托住球。把摩擦系数设为100,这样的话,如果球正在旋转,球就会被弹到不同的方向。

      17.png

       
      这一步完成后,球会停在扳机上:

       
       

      第17步 - 添加圆柱体目标

      现在我们切换至“目标”角色,添加一些圆柱体作为目标。每当球碰到这些目标,玩家就得分。

      添加第1个目标的方法如下,添加一个直径为60、高为100的圆柱体。命名为“10”,即当球碰到这一目标时玩家所得的分数。将其移动到桌面上部,y坐标300,x坐标50。

      18.png

       
      得到结果如下:

       
       

      第18步 - 为目标开启物理引擎

      现在我们为这个目标添加圆柱体的物理实体。因为目标不动,所以质量应当为0。把恢复系数设为120,使目标非常有弹性。如果恢复系数大于100,意味着当球撞到目标时会获得额外的能量。此外,把摩擦系数设为100,就会使球旋转。

      19.png

       
       

      第19步 - 再添加3个目标

      将添加第一个目标的3个积木复制副本,用以添加更多目标。如下所示,这些积木再添加三个圆柱体目标,分别命名为“5”、“4”、“1”。

      20.png

       
      添加的目标如下所示:

      94ab05ac-e357-4dfc-8de1-9a5379f27448-image.png

       
       

      第20步 - 扣动扳机

      当玩家按下空格键,我们要快速将扳机下移到y坐标-540。当玩家松开空格键,我们要将其移回初始位置y坐标-480,时间比下移时稍长。

      在“扳机”角色添加如下积木:

      21.png

       
      现在我们就可以用板机打球了:

       
       

      第21步 - 碰到目标时广播消息“击中目标”

      每当球碰到目标,我们就要展示一些视觉效果/听觉效果,并且使玩家的得分增加。

      若要完成这一事件,每当球碰到目标角色中的物体时就要广播一条碰撞消息。

      首先,添加积木“当收到(消息)参数( )”,点击下拉菜单新建一条消息“击中目标”。同时,新建一个变量“击中信息”。

      22.png

       
      接下来,在“目标”角色添加如下积木(放在添加4个目标的积木下方):

      23.png

       
      这个积木将确保,每当球碰到任意一个目标时都会广播这一消息。

       
       

      第22步 - 提取目标名称

      当我们收到消息“击中目标”,变量“击中信息”将会告诉我们哪两个物体在哪个位置碰撞了。在这个游戏中,我们只需要知道碰撞的目标的名称,即“击中信息”被逗号分隔开的第2部分。请新建一个变量“目标名称”,用于存放目标的名称:

      24.png

       
      比如说,“击中信息”所包含的内容为“球,1,22.696,-78.908,9.598”,那么“目标名称”就为“1”。

       
       

      第23步 - 目标高亮显示

      每当目标被球碰到,我们就使它短时间高亮显示白光:

       
      为了做这个效果,我们要在广播碰撞消息后创建高亮层:

      25.png

       
      我们还要根据名称选择目标,并将其添加到高亮层,较短时间后再将其移出高亮层:

       
       

      第24步 - 限制球的速度

      如果大家一直玩这个游戏,应该会发现一个小问题,有时球太快了,以至于会直接穿过目标或者是桌子边缘。

      through.gif

       
      分步解析,物理引擎把球从位置1向上移到位置3。球从来没接触到粉色目标,所以物理引擎“不知道”两者碰到过。

      27.png

       
      为了解决这个问题,我们要限制球的速度,从而使球不会穿过目标。为了做到这一点,把如下积木添加到球角色中,使球的速度永远不超过1500:

      28.png

       
       

      第25步 - 整理场景

      现在游戏就可以玩了。最后再进入主角角色整理一下场景。

      首先,隐藏三维坐标轴。

      第二,大家可以选一个别的场景,或者添加别的天空作为背景。这要在设置摄像机距离之前完成。

      第三,我们可以沿y轴补充一些光,让物体的侧面更明亮。

      29.png

       
      游戏的最终演示效果如下:

       
       

      创意扩展

      大家可以把这个项目扩展成多种形式。一些创意思路如下:

      • 不同的目标:大家可以把目标设置成不同的形状/颜色/大小/位置。

      • 视觉效果/听觉效果:为了让游戏更好玩,当球碰到目标和桌子边缘时,大家可以播放声音,或者使球高亮。

      • 游戏结束:大家可以通过检查球的z坐标来判断球是否掉落到桌子外面,如果是的话,就展示一条消息“游戏结束”。

      • 得分:大家可以用一个新变量“得分”记录玩家的得分。每当碰到目标时就增加得分。

      • 奖励:大家可以在桌面上添加一些游戏道具,当球碰到道具后就获得奖励。例如,大家还可以再添加一个球,玩家用两个球能碰到更多目标。

      1 Reply Last reply Reply Quote 0
      • First post
        Last post