## 👋 项目介绍
欢迎来到射击小游戏制作教程!在这个项目中,我们将一起创建一个充满挑战的2D射击游戏。玩家将控制一个角色在街道场景中移动,使用鼠标瞄准并射击敌人。游戏包含生命值系统、计分机制、不同类型的敌人以及武器特效。通过这个项目,你将学习如何使用变量管理游戏状态,通过克隆体创建动态敌人,以及实现角色间的碰撞检测。准备好开始这场编程冒险了吗?
## 🎯 你将学会
* **变量控制**:使用变量管理玩家生命值、分数和游戏状态
* **消息广播**:通过广播机制实现角色间的协同动作(如射击)
* **克隆体技术**:创建多个敌人副本,实现动态游戏场景
* **碰撞检测**:检测角色间的接触并触发相应事件
* **造型切换**:根据角色状态切换不同造型,增强游戏表现力
## 🛠️ 开始制作
### 第一步:初始化项目与舞台设置
**目标**:创建新项目并配置游戏背景,为后续角色和代码搭建基础舞台环境。
**操作步骤:**
1. 打开 Scratch 软件,创建一个新项目
2. 点击舞台下方的"背景"选项卡
3. 删除默认的空白背景(操作步骤索引3)
4. 点击"选择背景"按钮,从背景库中添加"streets backdrop"(操作步骤索引1)
5. 继续添加"Path-and-Road-Top-Down-Tileset-Pixel-Art"背景(操作步骤索引4)
6. 添加"Path-and-Road-Top-Down-Tileset-Pixel-Art2"背景(操作步骤索引5)
7. 最后添加"game over"背景(操作步骤索引6),用于游戏结束画面

### 第二步:创建全局变量
**目标**:为游戏创建必要的全局变量,用于存储玩家生命值、分数、游戏状态等关键信息。
**操作步骤:**
1. 点击舞台角色,切换到"代码"选项卡
2. 在"变量"类别中,依次创建以下变量:
- PLAYER_LIVES(玩家生命值)
- ded(死亡状态标志)
- Score(游戏分数)
- Health(生命值)
- shakex(屏幕震动X轴)
- shakey(屏幕震动Y轴)
- Y POSITION(Y轴位置)
- death?(死亡状态)
- PMP(玩家移动正值)
- PMN(玩家移动负值)
- EM1(敌人1移动时间)
- EM2(敌人2移动时间)

### 第三步:添加角色 player
**目标**:添加玩家控制角色并设置其基础造型,为后续移动和交互做准备。
**操作步骤:**
1. 点击角色库中的"添加角色"按钮
2. 从角色库中选择"player"角色(操作步骤索引37)
3. 切换到"造型"选项卡,点击"选择造型"
4. 添加"nx"造型,用于玩家向左移动时的显示(操作步骤索引39)
### 第四步:player 基础移动与交互逻辑
**目标**:实现玩家的移动控制、碰撞检测和生命值管理,让玩家角色能够响应键盘操作并与敌人互动。
**操作步骤:**
1. 选择player角色,切换到"代码"选项卡
2. 添加"当绿旗被点击"事件
3. 设置初始造型为"norm"
4. 创建以下代码块:
```scratch
when flag clicked
switch costume to (norm v)
forever
if <(PLAYER_LIVES) = [1]> then
if <key [w v] pressed?> then
change y by (PMP)
end
if <key [a v] pressed?> then
switch costume to (nx v)
change x by (PMN)
end
if <key [s v] pressed?> then
change y by (PMN)
end
if <key [d v] pressed?> then
switch costume to (px v)
change x by (PMP)
end
else
if <key [w v] pressed?> then
change y by (PMP)
end
if <key [a v] pressed?> then
switch costume to (nx v)
change x by (PMN)
end
if <key [s v] pressed?> then
change y by (PMN)
end
if <key [d v] pressed?> then
switch costume to (px v)
change x by (PMP)
end
end
end
```
5. 添加碰撞检测代码:
```scratch
when flag clicked
show
forever
if <touching [enemy 1 v]?> then
change [PLAYER_LIVES v] by (-1)
switch costume to (hit v)
wait (0.5) seconds
switch costume to (norm v)
wait (0.8) seconds
end
if <touching [enemy 2 v]?> then
change [PLAYER_LIVES v] by (-2)
wait (0.8) seconds
end
end
```
6. 添加生命值检测代码:
```scratch
when flag clicked
forever
if <(PLAYER_LIVES) = [0]> then
set [death? v] to [yes]
stop [all v]
end
end
```
**逻辑解析:**
这段代码实现了玩家角色的核心功能。第一部分处理键盘移动控制,使用WASD键控制角色上下左右移动,并根据移动方向切换造型(左移时显示nx造型,右移时显示px造型)。第二部分检测玩家与敌人的碰撞,与enemy 1碰撞损失1点生命值,与enemy 2碰撞损失2点生命值,并触发受伤动画。第三部分实时检测玩家生命值,当生命值为0时设置死亡状态并停止所有脚本。

### 第五步:添加其他角色与资源
**目标**:添加游戏中的其他重要角色和资源,如生命值条、武器、子弹等。
**操作步骤:**
1. 点击角色库中的"添加角色"按钮
2. 添加"health bar"角色(操作步骤索引194)
3. 添加"best weapon ever"角色(操作步骤索引226)
4. 添加"bullet"角色(操作步骤索引279)
5. 添加"crosshair"角色(操作步骤索引326)
6. 添加"bullet barrier"角色(操作步骤索引349)
7. 添加"enemy 1"角色(操作步骤索引359)
8. 添加"enemy 2"角色(操作步骤索引418)
9. 添加"variable tracker"角色(操作步骤索引515)
10. 添加"Score"角色(操作步骤索引570)
### 第六步:health bar 基础设置
**目标**:配置生命值显示条的造型和位置,使其能够直观展示玩家当前生命值。
**操作步骤:**
1. 选择health bar角色,切换到"造型"选项卡
2. 添加11个不同造型的生命值条(0-10点生命值)
3. 切换到"声音"选项卡,添加"pop"声音(操作步骤索引206)
### 第七步:health bar 交互逻辑
**目标**:实现生命值条的显示逻辑,使其能够根据玩家生命值自动切换对应造型并跟随玩家位置。
**操作步骤:**
1. 选择health bar角色,切换到"代码"选项卡
2. 添加"当绿旗被点击"事件
3. 设置初始生命值为10点
4. 创建以下代码块:
```scratch
when flag clicked
set [PLAYER_LIVES v] to [10]
forever
wait (00) seconds
switch costume to ((PLAYER_LIVES) + (1))
go to (player v)
change y by (30)
end
```
**逻辑解析:**
这段代码初始化玩家生命值为10点,然后在循环中根据PLAYER_LIVES变量的值切换对应的造型(造型编号为生命值+1),并将生命值条定位到玩家角色上方30像素处,实现生命值条跟随玩家的效果。

### 第八步:best weapon ever 添加与基础设置
**目标**:添加武器角色并配置其基础造型和声音,为射击特效做准备。
**操作步骤:**
1. 选择best weapon ever角色,切换到"造型"选项卡
2. 添加"New Piskel (11)"造型(操作步骤索引228)
3. 添加"shoot"造型(操作步骤索引229)
4. 切换到"声音"选项卡,添加"087926_ar15-40370"声音(操作步骤索引230)
### 第九步:best weapon ever 交互逻辑
**目标**:实现武器的跟随玩家、射击特效和隐藏逻辑。
**操作步骤:**
1. 选择best weapon ever角色,切换到"代码"选项卡
2. 添加"当绿旗被点击"事件
3. 创建武器跟随玩家的代码:
```scratch
when flag clicked
forever
point towards (鼠标指针 v)
go to (player v)
change y by (-10)
change x by (10)
end
```
4. 添加射击特效代码:
```scratch
when I receive [FIRE!!! v]
play sound [087926_ar15-40370 v] until done
switch costume to (shoot v)
switch costume to (stop shoot v)
```
5. 添加游戏结束时的隐藏逻辑:
```scratch
when flag clicked
show
forever
if <(death?) = [yes]> then
hide
end
end
```
### 第十步:bullet 添加与基础设置
**目标**:添加子弹角色并配置其基础造型和声音,为子弹发射做准备。
**操作步骤:**
1. 选择bullet角色,切换到"造型"选项卡
2. 切换到"声音"选项卡,添加"pop"声音(操作步骤索引281)
### 第十一步:bullet 基础移动与事件响应
**目标**:实现子弹的发射、移动和碰撞检测逻辑。
**操作步骤:**
1. 选择bullet角色,切换到"代码"选项卡
2. 添加"当绿旗被点击"事件并隐藏角色
3. 创建子弹克隆代码:
```scratch
when flag clicked
hide
forever
wait (0.3) seconds
create clone of (自己 v)
end
```
4. 添加克隆体行为代码:
```scratch
when I start as a clone
hide
go to (player v)
point towards (鼠标指针 v)
show
broadcast (FIRE!!! v)
forever
move (10) steps
if <<touching [enemy 1 v]?> or <<touching [enemy 2 v]?> or <touching [bullet barrier v]?>>> then
wait (0.2) seconds
delete this clone
end
end
```
**逻辑解析:**
这段代码实现了子弹的核心功能。主角色每0.3秒创建一个子弹克隆体。每个克隆体从玩家位置发射,指向鼠标方向,并触发"FIRE!!!"广播。克隆体向前移动,当碰到敌人或障碍物时,等待0.2秒后删除自身。广播"FIRE!!!"同时触发武器特效和准星动画。

### 第十二步:crosshair 添加与基础设置
**目标**:添加准星角色并配置其基础造型和声音,为瞄准做准备。
**操作步骤:**
1. 选择crosshair角色,切换到"造型"选项卡
2. 切换到"声音"选项卡,添加"pop"和"Bell Toll"声音(操作步骤索引328-329)
### 第十三步:crosshair 基础移动与事件响应
**目标**:实现准星的跟随鼠标和射击特效逻辑。
**操作步骤:**
1. 选择crosshair角色,切换到"代码"选项卡
2. 添加"当绿旗被点击"事件
3. 创建准星跟随鼠标的代码:
```scratch
when flag clicked
forever
go to (鼠标指针 v)
turn right (3) degrees
end
```
4. 添加射击特效代码:
```scratch
when I receive [FIRE!!! v]
change size by (10)
wait (00) seconds
change size by (-10)
```
### 第十四步:variable tracker 添加与交互逻辑
**目标**:添加变量追踪角色并设置游戏初始化逻辑。
**操作步骤:**
1. 选择variable tracker角色,切换到"代码"选项卡
2. 添加"当绿旗被点击"事件
3. 创建变量初始化代码:
```scratch
when flag clicked
set [death? v] to [no]
set [Score v] to [0]
set [PMN v] to [-2]
set [PMP v] to [2]
set [EM1 v] to [5]
set [EM2 v] to [2]
```
4. 添加分数显示控制代码:
```scratch
when flag clicked
forever
if <(death?) = [yes]> then
hide variable [Score v]
end
end
```
5. 添加分数显示恢复代码:
```scratch
when flag clicked
forever
if <(death?) = [no]> then
show variable [Score v]
end
end
```
### 第十五步:Score 添加与基础设置
**目标**:添加分数显示角色并配置其基础造型。
**操作步骤:**
1. 选择Score角色,切换到"造型"选项卡
2. 切换到"声音"选项卡,添加"pop"声音(操作步骤索引572)
### 第十六步:Score 基础移动与事件响应
**目标**:实现分数显示的定位逻辑。
**操作步骤:**
1. 选择Score角色,切换到"代码"选项卡
2. 添加"当绿旗被点击"事件
3. 创建位置设置代码:
```scratch
when flag clicked
forever
go to x: (-189) y: (162)
end
```
### 第十七步:运行演示与最终截图
**目标**:启动项目并查看最终效果,测试游戏功能。
**操作步骤:**
1. 点击舞台上的绿旗按钮运行项目(操作步骤索引580)
2. 观察游戏运行效果:
- 玩家角色可以移动
- 准星跟随鼠标
- 点击鼠标发射子弹
- 敌人会自动生成并向玩家移动
- 生命值条会随玩家生命值变化
- 击中敌人会增加分数
- 生命值为0时显示游戏结束画面

## 🚀 挑战一下
尝试扩展这个游戏吧!你可以:
1. 添加更多敌人类型,比如会发射子弹的敌人
2. 设计武器升级系统,随着分数增加武器威力提升
3. 添加道具系统,如生命值恢复道具、护盾道具等
4. 创建多个关卡,增加游戏难度和挑战性
## 🎉 结语
恭喜你完成了这个射击小游戏的制作!通过这个项目,你学会了Scratch中许多重要的编程概念,包括变量管理、消息广播、克隆技术和碰撞检测。这些技能是你未来创建更复杂游戏的基础。继续探索Scratch的无限可能,发挥你的创造力,制作属于你自己的精彩游戏吧!