8. 自动驾驶

8.1. 教程介绍

上节课我们做了太空大战这个游戏,在游戏中,我们通过按键控制战机移动来躲避敌机。回顾之前做过的游戏以及小项目,我们也都是让玩家通过按键或者别的输入来操控精灵的。

今天的课程中,我们不用玩家来控制精灵,而是让汽车精灵可以自己识别方向,来实现自动驾驶的功能。

../../../_images/course8.1.gif

同时,我们将通过这个项目,初步的认识和了解游戏中一个很重要的元素—地图。

8.2. 编程目标

1.设置游戏地图。

2.设置汽车精灵自动识别方向,自动驾驶。

首先,我们来认识一下,什么是地图?

地图在很多游戏中都是不可缺少的一部分,我们会根据地图的指引去完成一系列的任务。不管是地牢迷宫还是吃豆人还是超级玛丽,都少不了地图的设计。👇

../../../_images/course8.2.png
../../../_images/course8.3.png

那我们的Arcade游戏,在哪里可以设计地图呢?😕

📌积木块位置:场景工具箱-》设置图块地图为

../../../_images/course8.4.png

点开灰色方块,来介绍一下编辑器内的使用工具以及使用方法:👇

../../../_images/course8.5.png

地图由一个个的图块绘制而成,素材库(Gallery)里有丰富的图块,下拉框可以选择:👇

../../../_images/course8.33.png

点击左右箭头可以看到一个系列里更丰富的图块素材:👇

../../../_images/course8.7.png

当然作为一个灵感爆棚的设计师,点击My Tiles,我们也可以自己来设计图块:👇

../../../_images/course8.34.png

点击My Tiles后面的加号,你可以新建一个图块进行编辑设计(图块大小为16*16):👇

../../../_images/course8.9.png

如果两个图块相差不大,我们可以选择复制图块,然后稍作修改就是一个新的图块了。👇

../../../_images/course8.35.gif

不需要的图块,我们可以选择删除。

了解地图编辑之后,我们还需要知道地图的大小。

刚才我们介绍到图块大小是16*16,那我们的地图可以做的多大呢?😕

我们看到地图的默认值是16*16。每个单位1代表一个图块,也就是默认的地图可以放16*16个图块。👇

../../../_images/course8.11.png

修改长宽的值,我们发现,最大的值为512*512(图块)。👇

../../../_images/course8.12.png

那这么大的地图,相当于多少个模拟器屏幕大小呢?

屏幕大小是160*120, 图块大小是16*16, 相当于一个屏幕大概能显示10*7.5(约为8)个图块。👇

../../../_images/course8.13.png

综合以上,我们总结一下:

图块大小T:16*16(像素)

屏幕大小S:160*120(像素)

地图大小M:512*512(图块)-》8192*8192(像素)

介绍完地图后,我们就开始今天的项目吧。

8.3. 设计地图

下面是我设计的一个路线图,草地和道路用的是素材库中的素材,左上角的是我设计的起始的图块(大家可以自己设计不同的图块和地图)。👇

../../../_images/course8.14.png

因为我们的地图大小>屏幕大小,所以在模拟器中可以发现,屏幕显示的只是地图的一角。👇

../../../_images/course8.15.png

8.4. 创建汽车精灵

../../../_images/course8.16.png

精灵默认的位置是屏幕的正中间, 我们把汽车放在开始的位置:红色方形图块上。

📌积木块位置:场景工具箱中-》放置精灵到随机位置的某个图块上:

../../../_images/course8.17.png

这里,我们把汽车放在起始图块上:👇

../../../_images/course8.18.png

在开始自动驾驶之前,我们先手动驾驶-》用按键控制精灵移动:👇

../../../_images/course8.19.png

用按键移动汽车试试看游戏效果:

../../../_images/course8.36.gif

用按键移动汽车,我们发现有下面两个问题:

1) 汽车走出屏幕后就不见了,地图的屏幕之外的地方我们也看不到。

2)我们希望汽车只在道路上开,但是现在汽车也可以开到草地上。

我们先来看第一个问题,汽车走出屏幕之后,镜头还是在屏幕上。怎么解决呢?

我们需要让镜头跟着汽车走,这样汽车走到哪里,镜头就跟到哪里,对应位置的地图我们也可以看到了。

📌积木块位置:场景工具箱-》镜头跟随精灵移动积木块。

../../../_images/course8.37.png

将“镜头跟随精灵mySprite移动”积木块放置到“当开机时”事件内部。这样,汽车走到哪里,我们的游戏视角就跟到哪里,操作一下试试看!

接下来是汽车开到了草地上的问题,这个是很危险的事情,我们要避免这样的情况。

打开地图编辑器,有一个画墙的图标,图块加上这个图标之后,就可以有墙的属性,正常的精灵是不可以穿过墙的。👇

../../../_images/course8.21.png

我们给草地图块都加上墙的属性:编辑器上可以看到草地上有了一层红色的覆盖层,这个就代表着有了墙的属性(只是一种属性,模拟器屏幕中不会显示这个红色覆盖)。👇

../../../_images/course8.22.png

TIPS:编辑器右上角有一个show walls的开关,开关关掉之后,你在编辑器中就看不到这一层红色覆盖了(墙的属性依旧在)。但是在绘制过程中,建议大家打开开关。

当然有同学会说,要全部一个个画上墙,要是我的地图很大的话,也太花时间了吧。不用担心,在后面的数组相关课程中,我们会介绍到如何用更方便的方法来画墙,不需要手动画,用程序就能实现。✌

好了,现在在模拟器上试一下,我们的汽车是不是可以在整个地图上跑起来了,并且只在道路上跑。

8.5. 自动驾驶

接下来我们就要开始做自动驾驶的功能了。

首先,我们给汽车一个初始的速度。👇

../../../_images/course8.23.png

怎么做到自动驾驶?😕

也就是说汽车可以看着交通指示来驾驶。比如看到”左转” “右转” “前进” “倒退” “停车”这些指示,可以做出正确的对应的动作。

我们先来绘制一下我们需要用到的交通指示图块:👇

../../../_images/course8.24.png

根据现在的道路,在路口放置对应的指示牌:👇

../../../_images/course8.25.png

如何做到汽车识别到对应的指示牌呢?😕

在汽车驾驶到对应的路口的时候,其实会和方向指示牌图块重叠,我们可以使用场景工具箱-》精灵与图块重叠积木块来实现这个效果。👇

../../../_images/course8.26.png

在第一个路口,看到指示牌后,我们给汽车设置该行驶方向的一个速度,这样汽车就能改变行驶方向继续驾驶。👇

../../../_images/course8.27.png

同理,我们对其他的指示牌也做相应的处理:👇

../../../_images/course8.27.png

试一下,现在我们的汽车是否可以做到自动驾驶?😕

可能大家会发现一个问题,汽车在行驶到一些路口的时候,停了下来。这是为什么呢?👇

../../../_images/course8.38.gif

因为我们在手动驾驶的时候,给草地加上了墙的属性。但是自动驾驶的时候,汽车与交通指示图块重叠,可能会有一小部分汽车的位置是超过了当时的图块位置,所以遇到前方的有墙属性的草地之后,汽车被挡住了。

在自动驾驶的时候,我们道路周围的草地可以不加墙的属性,使用橡皮擦工具擦除草地墙的属性。

这样,我们自动驾驶的功能就实现了。

不过还有一个不太合理的地方:汽车改变驾驶方向后,汽车的方向没有变化。

8.6. 优化汽车形象

📌积木块位置:精灵工具箱->设置精灵图像 积木块可以改变精灵的图像

../../../_images/course8.29.png

我们在每个汽车与交通指示图块重叠事件中,在改变驾驶方向后,也改变一下汽车对应方向的图像。👇

Xtron/Xtron_Arcade/Xtron_Arcade_Games/images/course8.39.pngg

再次体验一下,是不是感觉更好一点了呢?

今天的课程中,我们学习了绘制并使用地图和图块,以及精灵和图块重叠事件的处理,同学们可以在基础上发散思维,做出更多有创意的游戏设计。

8.7. 问答考验

■地图最大能包含多少个图块?

解析:512*512

■地图中墙的属性有什么意义?加上墙的属性后,屏幕上能否显示出来墙的颜色?

解析:加上墙的属性后,普通精灵无法穿越。屏幕上只是会显示对应的图块图案,墙的属性在屏幕上看是透明的,不是显示出来。

精灵与图块重叠积木块 和 不同类型精灵重叠积木块有什么区别和共同之处?

解析:两个重叠事件的处理方式是一样的,都是重叠之后就会触发。

区别之处是重叠类型的不同:“精灵重叠”积木块只能处理精灵之间的重叠事件;在地图中,我们是用图块绘制的,所以要用到精灵与图块重叠积木块。 当然,在这个案例中,如果你把不同的交通指示设置为不同类型的精灵,也是可以做到的,只是这样的方式,我们会用到很多精灵类型,而且放置精灵的位置都要做单独处理,用图块的话更加简单方便。

———————————— END ————————————————————

../../../_images/course6.37.gif