扫描线与网格背景的视觉层次:从 CRT 到赛博朋克

举报
yd_296221794 发表于 2026/09/11 09:10:40 2026/09/11
【摘要】 > 扫描线和网格不是"装饰",它们是"空间感"的来源。## 视觉层次:为什么需要"背景纹理"在 1280×720 的画布上,如果背景是纯黑(`#0A0A0F`),画面会显得"空"——玩家会觉得"这个游戏很简单"。扫描线和网格的作用是**填充空间**,让画面有"深度"。NEON RUNNER 2077 里的背景纹理有三层:1. **网格**(MenuScene + GameScene)— 紫色...

> 扫描线和网格不是"装饰",它们是"空间感"的来源。


## 视觉层次:为什么需要"背景纹理"


在 1280×720 的画布上,如果背景是纯黑(`#0A0A0F`),画面会显得"空"——玩家会觉得"这个游戏很简单"。扫描线和网格的作用是**填充空间**,让画面有"深度"。


NEON RUNNER 2077 里的背景纹理有三层:


1. **网格**(MenuScene + GameScene)— 紫色细线,60-80px 间距

2. **扫描线**(MenuScene)— 黑色横线,每 3px 一条

3. **边框**(GameScene)— 青色矩形框,距离边缘 40-130px


## 网格:空间感的来源


`MenuScene` 里的网格:


```ts

private drawBackgroundGrid(width: number, height: number): void {

  const g = this.add.graphics().setDepth(0).setAlpha(0.25);

  g.lineStyle(1, COLORS.NEON_PURPLE, 0.3);

  const step = 60;

  for (let x = 0; x <= width; x += step) {

    g.beginPath();

    g.moveTo(x, 0);

    g.lineTo(x, height);

    g.strokePath();

  }

  for (let y = 0; y <= height; y += step) {

    g.beginPath();

    g.moveTo(0, y);

    g.lineTo(width, y);

    g.strokePath();

  }

}

```


60px 间距的紫色细线,透明度 0.3。这个网格在 MenuScene 里作为"背景",在 GameScene 里也有一个类似的(80px 间距,透明度 0.18)。


### 为什么 MenuScene 的网格比 GameScene 的更明显


MenuScene 的网格透明度 0.3,GameScene 的网格透明度 0.18。这个差异是有意为之的:


- **MenuScene**:玩家在"看"菜单,网格是"氛围"的一部分

- **GameScene**:玩家在"战斗",网格会"抢戏",所以更淡


## 扫描线:CRT 的数字回声


`MenuScene` 里的扫描线:


```ts

private drawScanLines(width: number, height: number): void {

  const g = this.add.graphics().setDepth(20).setAlpha(0.08);

  g.fillStyle(0x000000, 1);

  for (let y = 0; y < height; y += 3) {

    g.fillRect(0, y, width, 1);

  }

}

```


每 3 像素画一条 1 像素高的黑线,透明度 0.08。这个效果模拟的是 CRT 显示器的扫描线——老式电视的电子束从左到右、从上到下扫过屏幕,留下一条条暗线。


### 为什么扫描线只在 MenuScene 里


GameScene 里没有扫描线。这个设计是有意为之的:


- **MenuScene**:玩家在"看"菜单,扫描线增加"复古感"

- **GameScene**:玩家在"战斗",扫描线会干扰视线


## 边框:竞技场的边界


`GameScene` 里的边框:


```ts

g.lineStyle(2, COLORS.NEON_CYAN, 0.5);

g.strokeRect(40, 90, width - 80, height - 130);

```


青色矩形框,距离边缘 40px(左右)和 90px(上)/ 130px(下)。这个边框定义了"竞技场"的边界——玩家和敌人在这个框里活动。


### 为什么上下边距比左右大


上下边距(90px / 130px)比左右边距(40px)大,是因为 HUD 占据了屏幕顶部和底部:


- 顶部:HP + EN(28px + 56px = 84px)

- 底部:HUD 没有占用,但留出空间给未来功能


所以竞技场的顶部从 90px 开始,底部到 590px(720 - 130)。


## 视觉层次:谁在谁上面


NEON RUNNER 2077 里的视觉层次(从下到上):


```

1. 背景网格(setDepth 0)

2. 扫描线(setDepth 20)

3. 全息面板(setDepth 5)

4. 菜单按钮(setDepth 6-7)

5. 故障标题(setDepth 默认)

6. HUD(setDepth 100-101)

```


`setDepth()` 是 Phaser 里控制渲染顺序的 API。数值越大,越靠上。HUD 的 `setDepth(100)` 确保它永远在最上面——玩家在任何场景里都能看到 HUD。


## 下一章预告


扫描线和网格讲完了,但 NEON RUNNER 2077 的视觉风格里还有一个关键元素——**相机特效**。那些淡入淡出、闪光、抖动的效果是怎么做出来的?下一章我会拆解这个设计。


> 背景设计的核心原则:**背景要淡,前景要亮**。玩家在战斗中不会去欣赏背景,但背景的"存在感"决定了整个场景的氛围。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。