<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[三维物理 - 迷你台球游戏（难度：4级）]]></title><description><![CDATA[<p dir="auto"> </p>
<h2><a class="anchor-offset" name="用到的相关知识"></a>用到的相关知识</h2>
<ul>
<li><a href="/topic/640/adding-physics-bodies-for-3d-objects">为三维物体添加物理实体</a></li>
<li><a href="/topic/676/set-a-physics-body-s-moving-speed">设置物理实体的移动速度</a></li>
<li><a href="/topic/681/get-properties-about-physics-body">获取物理实体的属性</a></li>
<li><a href="/topic/376/%E6%9B%B4%E6%96%B0%E7%89%A9%E4%BD%93%E9%A2%9C%E8%89%B2">更新颜色</a></li>
<li><a href="/topic/374/%E5%BA%94%E7%94%A8%E7%BD%91%E6%A0%BC%E6%9D%90%E6%96%99">网格材料</a></li>
<li><a href="/topic/617/%E6%8C%89%E9%92%AE%E6%8E%A7%E4%BB%B6">按钮控件</a></li>
<li><a href="/topic/580/%E9%80%9A%E8%BF%87%E6%A0%87%E7%AD%BE%E6%8E%A7%E4%BB%B6%E7%AE%80%E8%A6%81%E4%BB%8B%E7%BB%8D%E6%8E%A7%E4%BB%B6">标签控件</a></li>
</ul>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="介绍"></a>介绍</h2>
<p dir="auto">在这篇教程中，我们将利用物理引擎制作一个简单的迷你台球游戏。玩家用一个白色的母球把一个红色的目标球打进球袋里。</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/d1d2ec78-2f72-45fe-ba52-8b756cc312ec.gif" width="470" style="border-radius:5px;border:1px solid #29622d" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第1步-新建一个项目"></a>第1步 - 新建一个项目</h2>
<p dir="auto">在创益编程游乐场新建一个项目。删除带小狗的“角色1”，我们只需要角色“空的1”。</p>
<p dir="auto">请添加如下积木来初始化一个空场景，开启物理引擎，并设置摄像机和三维坐标轴。</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/792940b7-5cae-4047-a04b-52a7b9a4d3c9.png" alt="1.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第2步-创建3个新积木"></a>第2步 - 创建3个新积木</h2>
<p dir="auto">请创建3个新积木：</p>
<ul>
<li><strong>添加球桌</strong>：用于添加一个带球袋的台球桌；</li>
<li><strong>添加球</strong>：用于添加台球：</li>
<li><strong>检查目标</strong>：用于检查目标球是否落入球袋中。</li>
</ul>
<p dir="auto">初始化场景之后依次运行这三个积木：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/3c59fee7-6296-48ef-9e6c-8d103e74b5e8.png" alt="2.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
根据积木代码所执行的任务进行组织编排，是个好办法。</p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第3步-添加4个平面"></a>第3步 - 添加4个平面</h2>
<p dir="auto">现在我们开始制作台球桌。简单起见，我们将制作一个中间有一个方形球袋的球桌。</p>
<p dir="auto">首先添加4个平面，然后向对角方向移到4个角：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/7001f1c1-1dcd-4ad6-a7d8-2cd67819f8e8.gif" width="520" style="border-radius:5px;border:1px solid #29622d" /></p>
<p dir="auto"> <br />
添加和移动平面的积木如下所示。例如蓝色平面，其中心点的x坐标为5000，是宽度10000的一半，所以它的左边缘与y轴重叠。</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/a8394f88-70c4-449b-b298-515cc720c894.png" width="500" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第4步-移动这4个平面形成一个方形的洞"></a>第4步 - 移动这4个平面形成一个方形的洞</h2>
<p dir="auto">接下来，我们把每个平面在x和y方向上都移动100，从而在中心形成一个200×200的方形的洞。</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/010a96a0-95ae-4fe9-9502-a533e012e9c5.gif" width="520" style="border-radius:5px;border:1px solid #29622d" /></p>
<p dir="auto"> <br />
代码改动如下。例如，蓝色平面的中心向右移动， X坐标从5000改为5100，那么它的左边缘与y轴的间隙为100。</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/a8efda80-fb1a-408c-ba33-b35d5da014a5.png" width="500" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第5步-添加网格材料"></a>第5步 - 添加网格材料</h2>
<p dir="auto">现在添加一些网格线，让这4个平面看起来像是一个整体：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/7bb44126-2a83-44cc-8df8-5dbc9b77c55c.gif" width="520" style="border-radius:5px;border:1px solid #29622d" /></p>
<p dir="auto"> <br />
<a href="/topic/374/%E5%BA%94%E7%94%A8%E7%BD%91%E6%A0%BC%E6%9D%90%E6%96%99">应用网格材料</a>的积木如下所示。全部4个平面使用同样的积木。大家可以随意选择颜色：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/eefb587c-50eb-439a-998a-f385d886b005.png" alt="5.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第6步-添加物理实体"></a>第6步 - 添加物理实体</h2>
<p dir="auto">现在我们还需要为这4个平面添加物理实体，平面可以用“盒子状”的物理实体。因为台球桌不移动，所以“质量”应当为0。并且，为了模拟真正的台球桌，我们要设置较低的恢复系数和较高的摩擦系数。</p>
<p dir="auto"><span style="color:#ff0000">4个平面</span>都添加如下积木：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/ed4d881d-f40a-4569-a6d0-3df537d7e4ff.png" alt="6.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第7步-制作球袋底部"></a>第7步 - 制作球袋底部</h2>
<p dir="auto">一旦球落入方形球袋中，我们就要使球停在里面。要做到这一点，我们可以在桌面下方90的地方添加一个方形平面。因为球的直径为100，这可以保证球会停在球袋中。</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/4f8db5eb-859f-46ec-97d2-32cfbec9de92.gif" width="520" style="border-radius:5px;border:1px solid #29622d" /></p>
<p dir="auto"> <br />
球袋底部的恢复系数应当为零，从而使球不会跳出来。还应当为静止的，所以质量为0。添加球袋底部的三个积木如下：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/6c90aaab-c31e-4df5-93fd-7c67952288ff.png" alt="7.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第8步-制作目标球"></a>第8步 - 制作目标球</h2>
<p dir="auto">我们做好了球桌，现在去编辑积木“添加球”。首先，我们添加一个红色的球，命名为“目标球”。为了让球看起来像是个塑料球，我们可以修改其<a href="/topic/376/%E6%9B%B4%E6%96%B0%E7%89%A9%E4%BD%93%E9%A2%9C%E8%89%B2">光泽度和亮度</a>：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/b3f752d9-cb77-439a-b995-641e5fbcaa49.gif" width="520" style="border-radius:5px;border:1px solid #29622d" /></p>
<p dir="auto"> <br />
添加球的积木如下所示：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/bedd5305-6c59-4279-8837-7474057b2678.png" alt="8.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第9步-为目标球添加物理实体"></a>第9步 - 为目标球添加物理实体</h2>
<p dir="auto">我们把球的质量设为100，从而使它被碰撞后会移动。我们还要把恢复系数设置高一些，以便于当母球碰到它后速度会比较快。另外，我们还要让目标球静止，在我们击球前使它不移动。当我们击球后会解除静止状态。</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/ee2cde65-8057-4844-8c35-0209ee30c657.png" alt="9.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第10步-制作母球"></a>第10步 - 制作母球</h2>
<p dir="auto">接下来我们添加一个白色的“母球”：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/37c081cf-51f8-45d6-b0b1-9d5f5efc4935.gif" width="520" style="border-radius:5px;border:1px solid #29622d" /></p>
<p dir="auto"> <br />
添加母球的积木非常相似，与目标球的物理实体完全相同。</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/c5991286-feca-4949-b855-a1345be4baf0.png" alt="10.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第11步-添加一个瞄准球"></a>第11步 - 添加一个瞄准球</h2>
<p dir="auto">为了帮助玩家指定将母球瞄准哪里，我们添加一个黄色的“瞄准球”。我们将把母球射向这个瞄准球。因为瞄准球并不是真的，我们使它部分透明，还要让用户能够在桌子上拖动这个球。注意，因为瞄准球也有物理实体，所以当我们拖动时不会与目标球重叠。另外，因为目标球是静止的，所以瞄准球不会影响目标球的位置。</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/fffbefe6-1659-44eb-830b-29c3a2923bab.gif" width="520" style="border-radius:5px;border:1px solid #29622d" /></p>
<p dir="auto"> <br />
添加瞄准球的积木如下：<br />
<img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/8be83f93-179c-421c-92a4-9a31ccffb301.png" alt="11.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第12步-添加新控件"></a>第12步 - 添加新控件</h2>
<p dir="auto">现在我们要让玩家能够击球。首先，添加3个控件供玩家操作：</p>
<ul>
<li>一个滑动条，让玩家指定击母球的速度；</li>
<li>按钮“击球”，用球杆击母球；</li>
<li>按钮“重置”，重新玩。</li>
</ul>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/c07fb622-c51e-46ab-ac8a-cf2859dd9848.png" alt="12.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
添加控件的积木如下：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/52fd6d10-22be-466b-a4c9-a0632ddbb6fa.png" alt="13.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第13步-击母球"></a>第13步 - 击母球</h2>
<p dir="auto">当玩家点击按钮“击球”，我们就应当把母球射向目标球。我们可以利用滑动条的数值<a href="/topic/676/set-a-physics-body-s-moving-speed">设置母球的物理实体的速度</a>，积木如下：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/8bc92abb-763f-4fb5-a472-a214b735022a.png" alt="14.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
不过，当我们点击按钮“击球”，母球根本不动。原因就是，我们创建母球和目标球的时候把二者都设置成了静止。因此，我们要首先解除静止：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/65713ad0-e628-4f02-9edc-3585803861fc.png" alt="15.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
现在母球就能发射出去了：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/37b3a462-000a-4dc8-8d14-890192a556d1.gif" width="500" style="border-radius:5px;border:1px solid #29622d" /></p>
<p dir="auto"> <br />
还有个问题。黄色的瞄准球只是用来帮我们瞄准母球，并不让它撞到目标球。因此，当母球被击出后，我们就要删除瞄准球。完整代码如下：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/95949d2b-1ddb-48d2-9392-85e27a01ab65.png" alt="16.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
现在母球就会向瞄准球移动，然后碰撞目标球：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/ccf09ae2-8a62-4b97-91c8-87a7bcf5e3e2.gif" width="470" style="border-radius:5px;border:1px solid #29622d" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第14步-重置球"></a>第14步 - 重置球</h2>
<p dir="auto">当点击按钮“重置”时，我们应当使球归位，让玩家重新玩。这一步其实很简单：我们只需要再次运行积木“添加球”。因为这3个球都有名称，当我们重新创建这3个球时，原来的球就自动被移除。</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/bd1911dd-afc4-44ea-9d4d-cb55b425750c.png" alt="17.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
当你点击“重置”时的情景如下：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/4520898f-c037-4258-b041-ff248711d8ec.gif" width="470" style="border-radius:5px;border:1px solid #29622d" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第15步-恢复瞄准球的位置"></a>第15步 - 恢复瞄准球的位置</h2>
<p dir="auto">当玩家击球并点击“重置”后，最好是把瞄准球放在玩家之前瞄准的地方。这样的话，玩家就可以根据上一次的尝试继续调整瞄准球的位置。</p>
<p dir="auto">要实现这一点，我们要做3个改动：</p>
<ul>
<li>新建两个变量“x”和“y”，把初始值设为瞄准球的初始坐标：</li>
</ul>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/fb3e1e1f-8758-4f2d-b76a-8ef2a4f62612.png" width="350" /></p>
<p dir="auto"> </p>
<ul>
<li>在积木“添加球”中用这2个变量设置瞄准球的位置：</li>
</ul>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/2c593d01-fd45-40a5-b19a-b4206a36e29d.png" width="700" style="margin-left:40px" /></p>
<p dir="auto"> </p>
<ul>
<li>当我们击出母球之后，把瞄准球的新位置存入这2个变量：</li>
</ul>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/bf20379f-ff94-4cb5-87dc-a4a1c4dc4bbf.png" width="700" style="margin-left:40px" /></p>
<p dir="auto"> <br />
做这些改动后，每当我们移动了瞄准球，我们点击“重置”后瞄准球都会回到上一次移动的位置：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/cfa3ee9b-31ad-4cc5-a310-27645a8906d5.gif" width="470" style="border-radius:5px;border:1px solid #29622d" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="第16步-检查是否进球"></a>第16步 - 检查是否进球</h2>
<p dir="auto">当目标球落入球袋后，我们可以看到其z坐标正好为-40。这是因为球袋底部的z坐标为-90，球的半径为50。</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/0b241f64-0772-454f-bd52-925a623afdf7.gif" width="870" style="border-radius:5px;border:1px solid #29622d" /></p>
<p dir="auto"> <br />
知道了这一点后，我们可以重复不断地检查目标球的z坐标来判断是否进球：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/5aba6741-d8e3-41d1-b6cb-3de2e6293dde.png" alt="21.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
当我们知道进球以后，可以用一个标签展示成功消息。</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/abe62486-cd22-4cab-830b-0bb4e68ae5ca.png" alt="22.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
现在如果我们运行程序，连按钮都不出现了。不要惊慌失措，原因是，积木“检查目标”包含一个无限循环，所以积木“检查目标”后面的所有积木都不运行。为了解决这个问题，我们只需要把积木“检查目标”移到程序的底部：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/109007ca-1d7d-4b2e-812e-13e6718f62c6.png" alt="23.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"> <br />
游戏的最终演示效果如下：</p>
<p dir="auto"><img src="https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/d1d2ec78-2f72-45fe-ba52-8b756cc312ec.gif" width="470" style="border-radius:5px;border:1px solid #29622d" /></p>
<p dir="auto"> <br />
 </p>
<h2><a class="anchor-offset" name="创意扩展"></a>创意扩展</h2>
<p dir="auto">现在大家已经学会了如何制作基本的游戏，可以把这个项目扩展成多种形式，让游戏更好玩。一些创意思路如下：</p>
<ul>
<li>
<p dir="auto"><strong>把球放在不同位置</strong>：把母球和目标球换个位置。</p>
</li>
<li>
<p dir="auto"><strong>墙和障碍物</strong>：大家可以在球桌上放一些其他物体作为墙和障碍物，例如盒子、圆柱体，会阻挡母球和目标球，让游戏更有难度。另一方面，台球有时候需要从这些物体上反弹进入球袋。</p>
</li>
<li>
<p dir="auto"><strong>多个目标球</strong>：玩家要把多个球打入球袋。</p>
</li>
<li>
<p dir="auto"><strong>多个球袋</strong>：可以添加多个球袋，玩家要选择瞄准哪个球袋。</p>
</li>
<li>
<p dir="auto"><strong>坡道</strong>：大家可以在球桌上添加一些坡道，使母球和目标球能够飞起来越过障碍物，或者跳上更高一层的球桌。</p>
</li>
<li>
<p dir="auto"><strong>多个级别</strong>：像大多数游戏一样，大家可以设计多种难度级别。当玩家熟练以后，就会喜欢更有难度的级别。</p>
</li>
</ul>
]]></description><link>https://forum.creaticode.com/topic/936/三维物理-迷你台球游戏-难度-4级</link><generator>RSS for Node</generator><lastBuildDate>Mon, 20 Jul 2026 15:44:39 GMT</lastBuildDate><atom:link href="https://forum.creaticode.com/topic/936.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 29 Mar 2023 05:08:51 GMT</pubDate><ttl>60</ttl></channel></rss>