<script src="/files/spine-player/4.2/spine-player.js"></script>
<link rel="stylesheet" href="/files/spine-player/4.2/spine-player.css">
<div class="units-row-end">		
	<div class="unit-100">
		<div class="examples-header">
			<div class="units-row">
				<div class="unit-60">
					<div id="player"></div>
				</div>
				<div class="unit-40">
					<div class="examples-header-info">
						<div class="examples-header-info-tags">
							<span>标签:</span>
							<p>专业版, 网格, 权重, 路径约束, 变换约束, 剪裁, 填入黑色</p>
						</div>
						<div class="examples-header-download">[example-download:tank]</div>
					</div>
				</div>
			</div>
		</div>
	</div>
</div>
<script>
new spine.SpinePlayer(document.getElementById("player"), {
	jsonUrl: "/files/examples/4.2/tank/export/tank-pro.json",
	atlasUrl: "/files/examples/4.2/tank/export/tank-pma.atlas",
	animation: "shoot",
	viewport: { 
		x: -4871,
		y: -165,
		width: 5637,
		height: 2679
	},
	backgroundColor: "#555555FF",
	fullScreenBackgroundColor: "#555555FF"
});
</script>
!!
#坦克#

坦克项目演示了如何使用Spine的[路径](/spine-path-constraints)和[变换约束](/spine-transform-constraints)轻松快速地创建机械部件动画，如坦克履带和车轮。本坦克示例还使用了Spine的[填入黑色](/spine-attachments#Tint-black)功能制作了一个低成本爆炸效果。

## 坦克履带

### 设置
`tank-root`骨骼包含一个`treads-path`插槽，其中包含一个同名的路径附件。该路径附件是`treads-path`路径约束的目标。

![](/img/spine-examples/tank/treads-01.jpg)

该路径约束驱动骨骼`tread`到`tread36`。此设置可在动画过程中通过仅设置路径约束的`位置`值关键帧来沿着路径移动履带。

所有路径约束属性都使用了默认值，除了`混合`: `旋转`被设置为`链`而非`切线`，以确保履带骨骼沿着路径正确旋转。

该路径被加权到一些骨骼上，在选择了`履带`路径时可在[`权重`视图](/spine-weights)中看到。

![](/img/spine-examples/tank/treads-02.jpg)

可以变换这些骨骼以使路径变形。在下面的GIF中，`tread-gravity1`骨骼在Y轴上移动，从而导致路径变形。

![](/img/spine-examples/tank/treads-03.gif)

各履带的某些部分在车轮前面绘制，而相同履带的其他部分在车轮后面绘制。单个履带的插槽和附件设置如下所示: 

![](/img/spine-examples/tank/treads-04.jpg)

`tread`插槽在车轮前面绘制，`tread-inside1`和`tread-inside2`插槽在车轮后面绘制。这由骨架的[`绘制顺序`](/spine-images#Draw-order)中所有相关插槽的位置定义。

### 动画

在[`动画`模式](/spine-animating)下播放`drive`动画时，我们可以看到履带随着车轮的转动而移动。这是通过设置路径约束的`位置`属性关键帧实现的，可以在摄影表中看到:

![](/img/spine-examples/tank/treads-05.jpg)

当坦克驶过岩石时，履带链会变形，自然地跟随岩石的形状。这是通过设置路径加权的骨骼变换关键帧来完成的:

![](/img/spine-examples/tank/treads-06.jpg)

## 车轮

轮辋的上部在车轮上部内里投下阴影。为了在车轮旋转时实现此效果，阴影部分与实际车轮分离。这是其中一个车轮的设置:

![](/img/spine-examples/tank/wheel-01.jpg)

`wheel-mid-root1`包含插槽`wheel-mid-overlay`,其中包含一个表示车轮阴影部分的附件。插槽的`混合模式`被设置为`相乘`，以在实际车轮上绘制时达到理想的阴影效果。

真正车轮包含在`wheel-mid1`骨骼中，它是`wheel-mid-root1`骨骼的子级。`wheel-mid-root1`骨骼只移动，保持阴影不旋转。要旋转车轮，需要旋转`wheel-mid1`骨骼。

选择`wheel-mid1`骨骼并旋转它将导致其余的底部车轮旋转。这是通过变换约束实现的:

![](/img/spine-examples/tank/wheel-02.jpg)

变换约束`wheel-mid1-transform`根据`wheel-mid1`骨骼的旋转来转动骨骼`wheel-mid2`和`wheel-mid4`。这样，我们只需要设置`wheel-mid1`骨骼的旋转关键帧，而变换约束可确保其他骨骼跟随。

为了使车轮旋转看起来不那么统一，我们将变换约束的`旋转`偏移量设置为`93`。由于其他车轮的旋转速度应与`wheel-mid1`相同，因此`旋转`混合值设置为`100`。

此变换约束也可以驱动其他车轮。但这会导致一个统一的观感，所有车轮的旋转都相同。为此，我们设置了一些具有不同旋转偏移量的变换约束，如在变换约束`wheel-mid2-transform`和`wheel-mid3-transform`中可见。

考虑到小车轮需要比大车轮转得更快，另外两组车轮`wheel-small-*`和`wheel-big-*`有相似的设置。

## 爆炸效果

坦克项目中包含一个名为`shoot`的动画:

![](/img/spine-examples/tank/shoot-01.gif)

使用传统的逐帧动画创建这样的效果会占用大量的纹理内存，因此是不可取的，尤其是对移动游戏而言。我们没有使用多个大图来代表爆炸的每一个完整画面，而是使用了五个名为`smoke-puff01-bg`、`smoke-puff01-fg`、`smoke-puff02-fg`、`smoke-puff03-fg`和`smoke-puff04-fg`的小图，它们被复制到许多不同的`smoke*`骨骼上。

![](/img/spine-examples/tank/shoot-02.jpg)

请注意，这些图像是灰度的，可以使用Spine的填入黑色功能。下面可看到在拖动摄影表中的`射击`动画时，`smoke-puff1-fg`插槽的可见性和颜色变化。

![](/img/spine-examples/tank/shoot-03.gif)

烟雾的形状是通过设置不同形状附件的可见性关键帧来改变的，这基本上是传统的逐帧动画中的混合效果。填入黑色可用来改变烟雾颜色。

缓慢拖动摄影表中的时间轴可显示越来越多的烟雾。其设置类似于`smoke-puff1-fg`，在移动、旋转、缩放和时间上的变化可产生逼真的爆炸效果。

`smoke-glow`骨骼有一个网格附件和一个插槽，`混合`设置为`相加`使爆炸效果更强烈些，并帮助提高烟雾最热部分的亮度。

![](/img/spine-examples/tank/shoot-04.jpg)

<div class="toc-home"><p><a href="/spine-examples">Spine示例项目</a></p></div>