A2 · 第5集 · 5:17
Scratch游戏流畅移动
本集学习用Scratch编写更流畅的角色移动脚本,支持同时按多个方向键实现对角线移动。
来源:Montagne Vincent / tube-numerique-educatif.apps.education.fr · 许可:CC BY 4.0
字幕
Coder un jeu avec Scratch, cinquième épisode dans lequel nous allons voir un nouveau
用Scratch编程制作游戏,第五集,我们将学习一种新
code pour obtenir des déplacements du lutin,
实现角色移动的代码,
comme nous avions fait dans le premier épisode,
就像第一集里做过的那样,
mais ici nous allons pouvoir avoir des mouvements qui sont plus fluides.
但这次能让动作更加流畅。
Par exemple ici, dans le jeu du chat et la souris,
例如,在这个“猫抓老鼠”游戏中,
nous avons des mouvements qui sont plus rapides, plus fluides,
我们的动作更快、更流畅,
et voyez, on a même des mouvements en diagonale,
您看,甚至还有对角线方向的动作,
ce que nous n'avions pas avec le code du premier épisode que vous avez ici sur la
而第一集的代码中并没有这种功能,
gauche de l'écran.
您现在可以在屏幕左侧看到它。
Donc nous allons apprendre à écrire ces scripts avec Scratch et nous y allons tout
因此,我们将学习如何用Scratch编写这些脚本,现在就马上开始。
de suite. Alors nous y voilà, nous retrouvons ici les scripts que nous avons écrits
看,我们已经来到这里,再次看到第一集编写的脚本:
dans le premier épisode, les déplacements du lutin en pressant sur les flèches.
按方向键控制角色移动。
Donc ici par exemple, quand je clique sur la flèche gauche,
例如,这里当我点击左箭头时,
on met le sens de rotation à gauche ou droite pour pouvoir orienter le lutin dans le
就设定旋转方向为左或右,以便让角色朝正确方向转向。
bon sens. Je l'oriente vers la gauche, à moins 90 degrés, c'est vers la gauche,
我让它向左转,即逆时针90度,就是朝左。
on le fait avancer de 10 et on
再让它前进10步,
passe au costume suivant, ce qui donne l'impression que le lutin.
并切换到下一个造型,从而产生角色在行走的视觉效果。
Et j'ai le même genre de script pour quand je clique sur la flèche droite,
当我点击右箭头时,我使用的是同一种脚本,
la flèche haut ou la flèche bas.
上箭头或下箭头时也是如此。
Et j'ai ici le script d'initialisation que nous avons écrit à l'épisode 3,
这里是我之前在第3集编写的初始化脚本,
qui permet de mettre le lutin en position initiale au début du jeu.
它能让角色在游戏开始时回到初始位置。
Alors ce script, je vais le cacher,
那么这个脚本,我将把它隐藏起来,
nous n'en avons pas besoin pour le moment et ça va nous faire de la place,
我们现在不需要它,这样还能腾出些空间,
donc je vais le cacher un petit peu ici.
所以我把它稍微藏在这里。
Et nous allons nous occuper de ce script là.
接下来,我们将处理这个脚本。
Alors on va changer la façon de faire.
那么,我们将改变操作方式。
L'inconvénient donc ici, vous avez compris,
因此,这里的缺点是——您已经明白了——
c'est que le mouvement n'est pas très fluide.
动作不够流畅。
Si j'appuie sur deux flèches en même temps, il ne se passe rien de spécial,
如果我同时按下两个方向键,
on ne va pas en diagonale par exemple.
并不会发生特别的事情,比如不会斜向移动。
Donc le script que nous allons écrire maintenant permettra de faire ça.
因此,我们接下来要编写的脚本将实现这一功能。
Alors je vais enlever ici quand la flèche gauche est pressée et nous allons mettre
现在,我将删除‘左箭头被按下时’这部分,
une condition.
并添加一个条件判断。
Nous allons effectuer ce script si
我们将执行这个脚本,当……
je vais dans les capteurs et dans les capteurs,
我进入‘传感器’类别,在其中,
j'ai un capteur qui me permet de voir si une touche est pressée.
有一个传感器可以检测某个按键是否被按下。
Donc je vais faire le script si la flèche gauche est pressée.
所以,我将设置:当左箭头键被按下时执行该脚本。
Donc on voit que ça change pas grand- chose,
可以看到,变化其实不大,
sauf qu'il va falloir avoir ici un événement quand le drapeau vert est cliqué.
只是这里需要把触发事件改为‘绿旗被点击’。
C'est plus l'événement quand une touche est cliquée.
不再是‘某个按键被按下’的事件了。
Donc ici, si je regarde mon script, quand le drapeau vert est cliqué,
现在看我的脚本:当绿旗被点击时,
si la flèche gauche est pressée,
如果左箭头键被按下,
alors on va s'orienter vers la gauche et on va avancer de 10,
角色就面向左侧,并前进10步,
on va changer de costume.
同时切换造型。
Donc le script ressemble beaucoup à celui que nous avions.
因此,这个脚本和我们之前写的非常相似。
Alors je vais faire la même chose avec les autres.
接下来,我对其他方向键做同样的处理。
Les autres mouvements, donc ici c'est pour la flèche droite,
其他移动方式——这里是右箭头键,
donc je vais reprendre ce
所以我将复用这个判断,
test, donc c'est un capteur, si la flèche droite est pressée,
也就是这个传感器:当右箭头键被按下时,
je vais reprendre celui- ci pour la flèche haut, donc
再为上箭头键复用这个判断,
ça je vais l'enlever,
这部分我将删掉,
et ici je duplique et je vais faire ceci quand la flèche haut est pressée,
然后复制一份,设置为当上箭头键被按下时执行,
et enfin la dernière partie, je vais l'exécuter si.
最后这一部分,我将设置为在……条件下执行。
la flèche basse cette fois,
这次按下了向下箭头键,
est pressée. Alors si je laisse mon script comme ceci,
那么如果我保持脚本这样不变,
qu'est- ce qui va se passer si je clique sur le drapeau vert?
点击绿色旗帜时会发生什么?
Donc mon lutin est allé se mettre en position initiale, mais il se passe rien.
我的角色回到了初始位置,但其他什么也没发生。
Là, vous voyez, je suis en train d'appuyer sur les touches,
您看,我正在按下键盘上的按键,
il ne se place rien. Parce que qu'est- ce qui se passe quand on appuie sur le
但它却没有任何反应。
drapeau vert? Le script va être lu.
因为点击绿色旗帜时会发生什么?脚本会被逐行执行。
Si la touche flèche gauche est pressée?
如果左方向键被按下了?
Non, elle n'était pas pressée, donc on passe à la suite.
没有,它当时并未被按下,因此程序继续执行下一步。
Si la touche flèche droite est pressée?
如果右方向键被按下了?
Non, elle n'était pas pressée, donc on passe à la suite, etc.
没有,它当时也未被按下,因此继续执行下一步,依此类推。
Et puis quand on arrive en bas, le script est fini.
最后,当程序运行到脚本底部时,整个脚本就执行完毕了。
Donc ce que nous allons faire, c'est que nous allons demander au
因此,我们要让程序在整局游戏中,
programme de répéter pendant tout le jeu ce script.
反复执行这个脚本。
Donc je rajoute une boucle répéter indéfiniment,
我添加一个‘无限重复’循环,
et ceci va donc se répéter pendant toute la durée du jeu.
这样一来,其中的内容就会在整个游戏过程中持续重复执行。
Donc pendant tout le jeu, on va tester si les touches sont pressées.
也就是说,在整局游戏中,我们都会持续检测按键是否被按下。
Donc maintenant si je lance le jeu, ça fonctionne et vous voyez,
现在,当我启动游戏时,它就能正常运行了——您看,
j'obtiens des mouvements en diagonale quand je touche deux touches du clavier en
当我同时按下键盘上两个方向键时,角色就能斜向移动。
même temps. Voilà, donc ce script est complet, il faut faire Ici,
好了,这个脚本就完成了——关键在于这里,
cette boucle va se répéter indéfiniment.
这个循环会无限重复执行。
On ne peut rien rajouter en dessous de la boucle.
不能再在这个循环下方添加任何其他积木块了。
Vous voyez ici, c'est le bas de la boucle, ici c'est lisse, le bas du bloc,
您看,这里是循环的底部;这里边缘光滑,
pardon, est lisse.
抱歉,我说错了,是‘平滑’的。
On ne peut pas rajouter d'autres blocs.
无法再往里面添加其他积木块。
Si je voulais rajouter par exemple un bloc attendre une seconde,
如果我想添加一个‘等待一秒’的模块,
je ne peux pas le mettre en dessous,
就不能把它放在下方,
parce que ce qui est après ne va jamais être lu s'il y avait quelque chose,
因为其后的代码永远不会被执行——只要前面有内容,
puisque ceci va se lire indéfiniment.
而这个循环会无限执行下去。
Donc il faudra faire attention, ça peut être source d'erreur dans un programme,
因此需要特别注意:这可能成为程序中的错误来源,
ça peut bloquer un jeu par exemple.
比如导致游戏卡死。
Donc il faudra faire attention d'avoir quelque part un bloc qui permette d'arrêter
因此,必须确保程序中某处有一个能终止全部运行的模块,
tout. Ici on a un bloc stop tout.
这里我们就有‘停止全部’模块。
Donc par exemple quand le jeu est terminé,
例如,当游戏结束时,
on pense à ajouter ce bloc stop tout. Nous verrons ça dans un script,
我们就记得添加这个‘停止全部’模块。我们将在一段脚本中演示,
dans un autre épisode.
在下一期视频中。
Donc voilà, ce script est opérationnel et il est terminé.
好了,这个脚本已可运行,并已完成。
Cet épisode est donc terminé aussi,
因此,本期视频也到此结束,
ne ratez pas le prochain épisode dans lequel nous verrons comment ajouter de
请不要错过下期,我们将学习如何为角色之间添加互动,
l'interaction entre des lutins.
也就是角色之间的互动。
À bientôt!
我们很快再见!