Ovobot 文档

欢迎,这里是Ovobot产品的相关文档。

Ovobot(奥瓦机器人)是一家集软硬件研发,课程体系设计,并融合人工智能和物联网技术的STEAM教育解决方案提供商。 公司秉承激发兴趣,启智未来的理念,以高创新能力,自主研发贴合教育实际需求的STEAM教育产品。

Ovobot Bit机器人简介

Ovobot Bit是一款可编程机器人小车,可以使用图形化和Python编程来学习小车驱动原理以及传感器在自动驾驶汽车上的应用。

Bit搭载了超声波、巡线、加速度、陀螺仪、电子罗盘、声音、光敏、红外和温度传感器,并配有5x5点阵屏幕、蜂鸣器、音乐、RGB灯等多个输出单元。

Bit有蓝牙、2.4G和红外三种无线通信方式,机器人可以通过无线信号进行协作,也可以配合遥控器开发出远程遥控功能。结合丰富的传感器和小车载体,通过编程可以制作出多种创意机器人应用。

_images/ovobot_bit.png

Ovobot Bit Scratch指南

以下是使用Scratch给Ovobot Bit机器人编程的快速参考,如果你是第一次给机器人编程,请先阅读接下来的部分:

基础积木块编程指南

运动

1.设置移动速度程序块

_images/move.png

设置Bit机器人的前进或后退的速度,数值范围为0~255。

例子:

当绿旗被点击时,Bit机器人以100的速度匀速前进,等待1秒后停止运动。

_images/move_example.png _images/null.png

2.设置移动速度及时间程序块

_images/move_duration.png

通过设定Bit机器人的运动方向、运动速度和持续时间来让机器人运动,速度范围为0~255。

例子:

当绿旗被点击时,Bit机器人以100的速度匀速前进,持续时间为1秒。

_images/move_duration_example.png _images/null.png

3.设置旋转速度程序块

_images/rotate_turn.png

控制Bit机器人原地旋转,设置向左或者向右的旋转速度,速度范围为0~255。

例子:

当绿旗被点击时,Bit机器人以100的速度向左旋转,等待1秒后停止运动。

_images/rotate_turn_example.png _images/null.png

4.设置旋转速度及时间程序块

_images/rotate_turn_duration.png

控制Bit机器人原地旋转,设置向左或者向右的旋转速度以及持续时间,速度范围为0~255。

例子:

当绿旗被点击时,Bit机器人以100的速度向左旋转,持续时间为1秒。

_images/rotate_turn_duration_example.png _images/null.png

5.停止运动程序块

_images/stop_move.png

设置Bit机器人左右两个电机的运动速度为0。

例子:

当绿旗被点击时,Bit机器人以100的速度向左旋转,等待1秒后停止运动。

_images/rotate_turn_example.png _images/null.png

6.驱动电机程序块

_images/rawMotor_left_right.png _images/rotate_example.png

分别驱动Bit机器人的左右两个轮子的转速,通过设置左右轮子的不同转速,使机器人以设置的角度边旋转边前进。

如通过电脑键盘的方向键控制Bit前进、后退、左转和右转,空格键控制Bit停止。

例子:

当绿旗被点击时,Bit机器人的驱动电机以左轮-255、右轮100的速度行走,等待1秒后,再以左轮100右轮-255的速度前进后停止运动。(即先左拐再右拐)

_images/rawMotor_left_right_example.png

外观

1.RGB LED灯颜色设置程序块

_images/set_led_color.png

可以分别设置左右两侧LED灯的颜色。

  • 下图主板上的标记位置为RGB LED灯,即Bit的发光模块,分别为左侧LED和右侧LED。

  • RGB LED灯是一种以三原色共同交集成像的发光装置,通过设置不同的R(红色)、G(绿色)、B(蓝色)亮度来达到显示不同颜色的效果。

  • LED灯有工作电压低、工作电流小、可靠性高和寿命长等特点,被广泛应用于汽车和城市照明等。

    _images/RGB_LED.png

例子:

当绿旗被点击时,Bit机器人的彩色灯左侧为橙色,右侧为蓝色,等待1秒后,彩色灯左侧变为绿色,右侧变为紫色,再等待1秒后变回原来的颜色,如此重复执行这一指令。

_images/set_led_color_example.png _images/null.png

2.显示字符程序块

_images/show_string1.png

可以控制Bit机器人点阵屏显示相应的字符,选择“等待”即执行完这条指令才会执行下一条指令,“继续”即执行这条指令同时执行下一条指令。

  • 下图中标记位置为Bit机器人的LED点阵屏幕,可以用来显示图案、数字、动画或者一段英文字符。

  • LED点阵屏由LED(发光二极管)组成,以灯珠亮灭来显示信息,是各部分组件都模块化的显示器件,通常由显示模块、控制系统及电源系统组成。

_images/Lattice_screen.png _images/null.png

3.显示图案程序块

_images/show_image1.png

点击显示图案程序块的下拉列表,出现图案绘制面板,绘制相应的图案。绘制图案时,可以一键熄灭或点亮所有LED,点击灰色小方格点亮相应的LED。

_images/LED.png

例子:

当绿旗被点击时,Bit机器人的LED灯显示“❤”的图案,等待0.5秒后,变为显示“2”的图案,同样显示0.5秒。

_images/show_image_example.png _images/null.png

4.熄灭屏幕程序块

_images/hide_all_matrix1.png

熄灭Bit机器人LED点阵屏。

例子:

当绿旗被点击时,Bit机器人的LED灯显示“❤”的图案,等待2秒后,熄灭屏幕。

_images/hide_all_matrix_example.png

5.点亮坐标程序块

_images/light_axis1.png

点亮Bit机器人LED点阵屏上某个坐标的LED,x、y的数值范围为0~4,零点在点阵屏的左上角,水平向右为x轴,竖直向下为y轴。

_images/light_axis_example2.png

例子:

当绿旗被点击时,点亮Bit机器人LED点阵屏上坐标为x:2、y:2的LED,等待1秒后,熄灭LED,再等待1秒后点亮此坐标,如此重复执行这一指令。

_images/light_axis_example.png

6.设置坐标程序块

_images/show_on_the_axis1.png

分别设置x或y轴的高度。

声音

1.播放音符程序块

_images/play_tone1.png
  • 下图主板上的标记位置为蜂鸣器,即Bit的发声模块。

  • 蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机和定时器等电子产品中作发声器件。

    _images/buzzer.png

简谱和音名的对应关系:我们在生活中,一般接触到的都是1234567这样的简谱,但Ovoblock的程序块是使用五线谱的音名来显示的,在C调的乐谱中,它们之间的对应关系如下。

_images/music1.png

C调中,C、D、E、F、G、A、B分别对应简谱中的1、2、3、4、5、6、7,一个唱名为四分音符持续1个节拍,下方有一个横杠的是八分音符持续1/2节拍,音符后有一个横杠的为二分音符持续2个节拍,同学们按照音符和节拍数编写整段音乐。

比如下面的上学歌,不划线是四分音符,在这首曲子中是一个节拍,一道下划线的节拍相当于八分音,在这首曲子中是1/2拍。

一些音符后面会加-,表示音符持续,例如7 - 代表 7 这个音占了两个节拍,7- - 则表示3个节拍。

_images/song.png

例子:

当绿旗被点击时,播放C音符持续一个节拍,然后播放E音符持续一个节拍。

_images/play_tone_example.png

2.暂停播放节拍程序块

_images/rest1.png

设置暂停播放的节拍数。

引脚

1.引脚被接触程序块

_images/pin.png

判断引脚是否被接触。

2.读取引脚模拟值程序块

_images/pin_analog_quantity.png

读取设置引脚的模拟值。

3.设置引脚模拟值程序块

_images/set_analog_quantity.png

设置选定引脚的模拟值。

4.读取引脚数字值程序块

_images/pin_with_numbber_input.png

读取设置引脚的数字值。

5.设置引脚数字值程序块

_images/set_digital_output.png

设置选定引脚的数字值。

无线通讯

1.控制无线通讯程序块

_images/wireless_communication1.png

控制打开、接收、复位无线通讯。

2.发送无线消息程序块

_images/send_wireless_message1.png

发送无线消息。

3.发送无线消息列表程序块

_images/send_containing_bytes1.png

发送无线消息列表。

4.接收无线消息程序块

_images/receive_wireless_message1.png

接收无线消息。

5.接收无线消息列表程序块

_images/receive_wireless_containing1.png

接收无线消息列表。

6.设置无线讯息频道程序块

_images/set_wireless_channel1.png

设置无线讯息频道。

事件

1.程序的起点

_images/click.png

当机器人处于实时模式时,点击绿旗,执行此模块下方的程序。

_images/bit.png

当机器人处于离线模式时,启动Ovobot Bit,执行此模块下方的程序。

例子:

当绿旗被点击时,播放C音符持续一个节拍。

_images/click_example.png

2.键盘按键按下事件程序块

_images/key_pressde.png

键盘按键共包含42种可编程按键,由方向键、数字键、字母键组成,当对应的按键被按下时,执行此模块下方的程序。

例子:

当按下键盘的空格键时,Bit机器人的左、右轮同时以100的速度前进。

_images/key_pressde_example.png

3.当按钮按下事件程序块

_images/button_pressed.png

按钮指的是micro:bit的两个可编程按键,分为A和B,当对应Bit的按钮被按下时,执行此模块下方的程序。

例子:

广播程序块是不同角色之间通信的桥梁,一个角色可以广播一个消息,另外一个角色可以侦听这个消息。

当按下micro:bit的A键时,一个角色广播消息“开心”,另一个角色接收到“开心”的消息时,LED点阵屏显示图案“❤”。

_images/button_pressed_example.png

4.当红外遥控器按键按下程序块

_images/IR_controller.png

Ovobot Bit有红外接收模块,可用于红外遥控器控制机器人的运动、图案、声音等。

按键共包含42种可编程按键,由方向键、数字键、字母键组成,当红外遥控器对应的按钮被按下时,执行此模块下方的程序。

红外遥控器是一种利用红外发光二极管,以红外光为载体将按键端信息传递给接收端的设备。

红外遥控器:

_images/IR.png

用离线模式,把程序下载到Bit里,通过遥控器的4个方向键,来控制Bit前进,后退,左转,右转。程序下载到Bit机器人开始执行,根据按下不同的按键执行相应的运动程序。

Bit程序:

_images/Bit_order.png

例子:

当按下红外遥控器的M键时,Bit机器人以255的速度后退2秒。

_images/IR_controller_example.png

5.当响度大于程序块

_images/loudness.png

响度返回的值是声音传感器返回的值,数值范围为0~255,当响度大于设置数值时,执行此模块下方的程序。

6.当接收到消息程序块

_images/receive.png

当接收到设定消息时,执行此模块下方的程序。

例子:

当接收到消息1时,LED点阵屏显示图案“❤”。

_images/receive_example.png

7.广播程序块

_images/broadcast.png

广播程序块是不同角色之间通信的桥梁,一个角色可以广播一个消息,另外一个角色可以侦听这个消息,当接收到消息时执行相应的程序。

例子:

_images/button_pressed_example.png

当按下micro:bit的A键时,一个角色广播消息“开心”,另一个角色接收到“开心”的消息时,LED点阵屏显示图案“❤”。

8.广播并等待程序块

_images/broadcast_wait.png

一个角色可以广播一个消息并等待。

控制

1.等待N秒程序块

_images/wait_seconds.png

等待N秒后执行其下方的程序,N为圆角矩形框内的数值。

例子:

_images/wait_seconds_example.png

当绿旗被点击时,Bit机器人以255的速度后退,等待一秒后停止运动。

2.重复执行N次程序块

_images/repeat.png

重复执行其内部程序N次,N为圆角矩形框中的数值。

例子:

_images/repeat_example.png

当绿旗被点击时,显示图案“❤”,等待1秒后再次显示,如此重复执行此指令10次。

3.重复执行程序块

_images/forever.png

重复执行程序块内部包含的程序。

例子:

_images/forever_example.png

当绿旗被点击时,显示图案“❤”,等待2秒后显示图案“◇”,等待2秒后再次显示图案“❤”,如此重复执行此指令。

4.如果……那么……程序块

_images/if_then.png

当六边形框内的条件满足时执行程序块内部的程序。

例子:

_images/if_then_example.png

当绿旗被点击时,如果引脚1被触摸,显示图案“❤”,如此重复执行此指令。

5.如果……那么……否则程序块

_images/if_then_else.png

当六边形框内的条件满足时执行那么内部的程序,不满足时执行否则内部的程序。

例子:

_images/if_then_else_example.png
  • 当绿旗被点击时,如果超声波传感器1检测到障碍物的距离小于15,

  • 那么彩色灯显示左侧为橙色,右侧为黄色,否则彩色灯显示左侧为紫色,右侧为蓝色,如此重复执行此指令。

6.等待直到程序块

_images/wait_until.png

等待直到条件为真时才继续执行接下来的程序块。

7.重复直到程序块

_images/repeat_until.png

重复执行其内部的程序,直到六边形框内的条件满足,才执行程序块下方的程序。

例子:

_images/repeat_until_example.png

当绿旗被点击时,若x轴加速度大于200,Bit机器人停止运动。

侦测

1.判断按钮按下事件程序块

_images/button.png

选择机器人按键触发事件的回调函数。

2.红外遥控器按键判断程序块

_images/IR_Remote_Controller.png

如果M按键按下的话,返回值就是True, 否则返回值是false。

例子:

_images/IR_Remote_Controller_example.png

当绿旗被点击时,如果红外遥控器的“↑”键被按下,那么Bit机器人以255的速度后退,持续时间为1秒。

3.判断Bit姿态程序块

_images/gesture1.png

判断机器人的姿态,执行程序块下方的程序。

4.加速度程序块

_images/acceleration1.png

返回Bit的x、y和z三个轴的加速度值。

例子:

_images/acceleration_example.png

当绿旗被点击时,Bit机器人以255的速度前进,若y轴的加速度小于1000,则停止运动。

5.响度程序块

_images/loudness_Modular.png

我们用响度来表示声音传感器的反馈值,响度的范围大小是0-255。

例子:

_images/loudness_Modular_example.png

当绿旗被点击时,如果声音传感器检测到响度大于100,那么Bit机器人以100的速度持续前进1秒,然后停止运动。

6.电池电量程序块

_images/battery_level.png

电池电量模块可以实时显示Bit的百分比电量。

7.陀螺仪程序块

_images/gyro.png

陀螺仪程序块用来反馈Bit的俯仰、横滚和侧偏的角速度。 下图主板上的标记位置为Bit机器人的陀螺仪传感器,陀螺仪传感器可用于检测Bit的旋转角速度,并可以计算旋转的角度。

_images/gyro1.png

下图所示分别为Bit的俯仰、横滚和偏航对应的轴和方向。

_images/gyro2.png

例子:

_images/gyro_example.png

当绿旗被点击时,点阵屏的LED灯左右侧均为红色,如果陀螺仪的俯仰角度大于200,那么点阵屏的LED灯左右侧均变为橙色。

8.姿态角程序块

_images/attitude.png

反馈Bit侧偏的角度。

例子:

_images/attitude_example.png

当绿旗被点击时,如果姿态角的侧偏小于90度,那么Bit机器人以255的速度前进,否则机器人停止运动。

9.指南针角度程序块

_images/compass_angle1.png

返回Bit机器人头部朝向与地球北极方向的夹角,数值范围为顺时针0~359度。

  • 下图标记位置为Bit机器人的电子罗盘传感器,与加速度传感器为一颗芯片,即一颗芯片上集成了加速度和电子罗盘两种传感器。

  • 电子罗盘可以检测空间中的磁场强度,尤其可以指示地球北极的朝向。

  • 现在大部分的智能手机里都集成了电子罗盘传感器,手机里的指南针应用就是利用这个传感器的数值来指示地球南极或北极的朝向的。

    _images/compass.png

下图所示箭头方向为Bit机器人的加速度传感器的三个轴的方向,正号代表往这个方向的加速度为正值,反之为负值。

_images/acceleration11.png

例子:

_images/compass_angle_example.png

当绿旗被点击时,判断指南针的角度,如果指南针的角度等于50,那么点阵屏显示“North”然后等待。

10.指南针磁场强度程序块

_images/compass_magnetic_density1.png

反馈当前环境中总磁场强度,单位是纳特斯拉。用磁铁靠近电子罗盘,看看磁场强度有什么变化。

例子:

_images/compass_magnetic_density_example.png

当绿旗被点击时,判断指南针磁场强度,如果磁场强度大于30000,那么点阵屏显示沮丧脸。

11.温度程序块

_images/temperature1.png

反馈温度传感器检测到的温度值。

12.亮度级别程序块

_images/light_level1.png

反馈光敏传感器感应环境光线的强度。可以尝试修改亮度级别,看看不同级别对应什么样的亮度。

下图标记位置为Bit机器人的光敏传感器。可以感受环境光的强弱,并反馈相对应的电信号。 但我们这里的光敏传感器跟市面上的其他光敏传感器有所不同,如图中标记的位置是Bit机器人的点阵屏幕,怎么又会是光敏传感器呢? 点阵屏幕是由LED组成的,当LED电流反向流动时它就会对光线敏感,尤其会对它发出光的颜色的光线敏感。 所以这里我们可以使用点阵屏幕来感应光线的强弱。

_images/CIS.png

例子:

_images/light_level_example.png

当绿旗被点击时,光敏传感器感应环境光线的强度,如果亮度级别小于10,那么点阵屏的LED灯左右侧均为绿色,否则均为橙色。

13.运行时间程序块

_images/running_time1.png

反馈Bit机器人的运行时间。

14.超声波传感器距离程序块

_images/sonar_sensor_distance.png

反馈Bit机器人超声波传感器检测到的距离。

15.超声波传感器检测到障碍物程序块

_images/sonar_close.png

反馈Bit机器人超声波传感器有没有检测到障碍物。

16.巡线传感器数值程序块

_images/read_line_from.png

可以分别反馈巡线传感器左右两个光电对管检测的灰度值,黑色物体的返回值接近0,白色物体返回值接近255。

例子:

_images/read_line_from_example.png

当绿旗被点击时,如果左侧巡线传感器的模块1检测到灰度值大于50,那么Bit机器人以100的速度前进,否则停止运动。

17.巡线传感器检测到颜色程序块

_images/line_follower_detects.png

分别用于判断巡线传感器左侧或者右侧是否检测到黑色或白色,条件成立时返回为真。

例子:

_images/line_follower_detects_example.png

当绿旗被点击时,Bit机器人以100的速度前进,如果巡线传感器的模块2检测到右侧为白色,那么停止运动。

运算

1.算术运算程序块

_images/plus_subtract_multiply_divide.png

对输入1和输入2的数字分别进行加减乘除的运算。

2.取随机数程序块

_images/pick_random.png

在输入1和输入2之间取一个随机的数值。

例子:

_images/pick_random_example.png

当绿旗被点击时,点阵屏显示所输入的数字1和10之间的随机数,然后执行下一条指令。

3.条件判断程序块

_images/compare.png

分别为判断左面圆角矩形框内的数值是否大于、小于或等于右面的数值。

例子:

_images/compare_example.png

当绿旗被点击时,如果超声波传感器检测到距离小于50,那么显示图案“❤”。

4.逻辑与程序块

_images/and.png

当两个六边形框内的条件都满足时,都返回真。

5.逻辑或程序块

_images/or.png

当两个六边形框内的任一条件满足时,都返回真。

例子:

_images/or_example.png

当绿旗被点击时,Bit机器人以100的速度前进,如果超声波传感器检测到距离小于10或按键A被按下,那么点阵屏显示图案沮丧脸。

6.条件不成立程序块

_images/not.png

当六边形框内的条件不满足时反馈为真。

例子:

_images/not_example.png

当绿旗被点击时,如果超声波传感器检测到障碍物的距离等于15这个事件不成立的话,点阵屏显示沮丧脸,否则显示笑脸。

7.数组程序块

_images/create_empty_list.png

8.数组数字程序块

_images/create_list_with.png

9.连接程序块

_images/join.png

10.设置连接物的字符程序块

_images/letter_of.png

11.设置链接物字符

_images/length_of.png

12.判断包含程序块

_images/contains.png

13.取余程序块

_images/mod.png

第一个圆角矩形框内的数值除以第二个圆角矩形框内的数值的余数。

例子:

_images/mod_example.png

当绿旗被点击时,点阵屏显示所输入的数字10除以9的余数,然后执行下一条指令。

14.四舍五入程序块

_images/round.png

取圆角矩形框内数据的整数,小数满0.5,整数位加1。

例子:

_images/round_example.png

当绿旗被点击时,点阵屏显示所输入的数字4.5四舍五入后的数字,然后执行下一条指令。

15.绝对值程序块

_images/abs_of.png

把一个数变成非负数,正数的绝对值是它本身,负数的绝对值是它的相反数,0的绝对值是0。

变量

1.设置变量程序块

_images/set_variable.png

在这里你可以自己创建一个变量,变量是一个可变的量,与常数相对,可以用来传递变化的数值。 如设置变量为一个数值或者将变量增加一个数值等。

例子:

_images/variable_example.png

当绿旗被点击时,将cnt变量设为3,点阵屏显示变量cnt然后执行下一条指令。

2.显示/隐藏变量程序块

_images/show_variable.png

视觉识别摄像头积木块编程指南

视觉识别摄像头简介

(1)视觉识别摄像头可以作为Ovobot bit的扩展来使用,它是一款用于图像识别的传感器,在离线模式下才可以使用。

(2)其内置的深度学习引擎可以识别多种目标物体,例如颜色检测、球体检测、人体检测、卡片识别等。

(3)检测结果可以通过 I2C 进行输出,体积小巧,功耗低,所有算法本地处理,无须联网,可广泛应用于人工智能教具、创客等产品或领域。

(4)提供了简单而实用的参数设置功能:摄像头帧率,LED 颜色,数码变焦,白平衡,算法性能设置。合理设置这些参数,将会有利于摄像头性能的提升。

下面我们将介绍视觉识别摄像头的使用方法。

视觉识别摄像头硬件连接

视觉识别摄像头的外设和接口如图所示:

_images/MU_hard.png

(1)将传感器左侧输出模式拨码开关1拨至下方,2拨至上方;

(2)将传感器连接到Ovobot bit的I2C扩展接口;

(3)将传感器的地址选择拨码开关拨至对应位(默认地址0x60,对应MU00,1、2都在下方,只有在与其他传感器地址冲突时才需要进行更改,平时不推荐修改此设置),

视觉识别摄像头积木块介绍

  1. 初始化模块

    将视觉传感器的连接初始化为I2C模式。

    _images/initialization_port1.png
  2. 开启算法

    当前版本共有如下7种算法:

    • 色块检测:指定颜色,输出视野内该颜色色块的长度与中心点坐标

    • 颜色识别:视野内指定坐标点的颜色信息

    • 球体检测:球体识别算法并不能识别任何球体,仅支持橙色乒乓球(Label:1)和绿色网球(Label:2)的识别。

    • 人体检测:依据上半身轮廓

    • 形状卡片:识别5张形状卡片

    • 交通卡片:识别5张交通卡片

    • 数字卡片:识别10张数字卡片

    _images/MU2.png
  3. 设置算法性能

    • 不同算法性能下识别的速度与准确率会有所差异,可根据实际的应用需要选择合适的性能参数。

    • 速度优先:需要高速处理的场合,,如实时跟踪某个物体;对某个物体需要做出快速的响应;场地或背景可以控制的环境。识别速度快,误报率稍高;

    • 性能均衡:默认模式,适合一般场景的应用需求;

    • 准确率优先:复杂场景情况下使用,识别速度稍慢,误报率低;当多类识别算法同时开启时,譬如形状卡片与交通卡片混合摆放识别时,请采用该模式,以消除不同组卡片间的误报。

    _images/MU3.png
  4. 关闭/开启摄像头高帧率模式

    • 摄像头帧率指摄像头采集图片的速度,分为高速模式和标准模式,高速模式为 50fps,标准模式为 25fps。

    • 提高摄像头帧率可以提高图像处理的速度,缓解图像拖影问题,但功耗会有一定增加。环境较暗时,标准模式比高速模式成像要亮一些。

    • 默认使用高帧率模式,相对普通模式有更快的识别速度,但功耗和发热量随之增加,可用于快速检测的场景,如需要低功耗使用则可关闭。

      _images/high_frame_rate1.png
  5. 设置摄像头白平衡

    (1)当摄像头视野中出现大面积有颜色的物体时,摄像头会发生白平衡失真,产生偏色现象,通过事先锁定白平衡能够防止此问题的发生。在调用此编程模块时,需要将摄像头朝向白纸距离约20厘米进行测光,数秒后摄像头的白平衡会自动被锁定。

    (2)但白平衡功能并不总是有利于色彩还原的,合理使用白平衡对于颜色相关的算法是十分关键。

    (3)白平衡的调节分为自动调节方式和固定参数方式,对于一张构图颜色均衡的图像,其 R,G,B 三个通道的值应是分布均匀的,如果 R、G、B 通道分布出现了失衡,自动白平衡功能会适时的修改各通道的色彩增益值使其重新分布均衡,而固定白平衡是不会改变其色彩增益的。

    (4)模式介绍:

    • 自动模式:适用于光照良好且对颜色要求不高的环境中使用;

    • 锁定模式:适用于颜色还原要求较高的环境,让摄像头面对白纸进行白平衡校准,然后锁定白平衡参数,锁定后颜色不会随环境的改变而变化;

    • 白光模式:适合于白色灯光或者阴天环境中使用,该模式也属于自动白平衡模式;

    • 黄光模式:适合于黄色灯光或者阳光环境中使用,该模式也属于自动白平衡模式。

    (5)锁定白平衡的校准方法

    • 将摄像头面向一张白纸 10~20cm 处,确保摄像头中心区域完全面向白纸,灯光照向白纸,但尽量不要有阴影遮挡;

    • 调用锁定白平衡指令,或短按功能按键(摄像头左侧 mode 键);

    • 摄像头的 LED 会闪烁一下白色灯光,开始白平衡校准;

    • 几秒钟后,当 LED 闪烁一下青色灯光后,表明白平衡校准完成;

    • 如果 LED 闪烁为紫色灯光,则表明校准失败,可以再次重新校准。

    备注 1:由于校准白平衡需要几秒钟的时间,所以使用软件锁定白平衡时应该位于小 MU 设置最后使用,并设定 2 秒左右的暂停时间等待校准完成。

    备注 2:按键方式可以在小 MU 运行的任何时刻去校准白平衡,而指令模式只适合于开机后的配置阶段使用。

    备注 3:如果校准时使用的不是白纸,即便校准后显示为青色灯光,那么图像也可能是处于偏色状态的,因为该功能会将其他颜色尽量调节为白色。

    (6) 锁定白平衡模式的使用场景

    1. 摄像头视野中存在大面积单色物体:

      当图像中出现大面积红色时,红色 R 通道值明显高于 G、B两个通道,摄像头了为调节白平衡而将 G、B 增益提高,所以其周围的白色区域呈现出了淡青色。类似的,大面积绿色周围会呈现淡紫色,而大面积蓝色周围会呈现淡黄色。经过校准并锁定白平衡后,三种颜色周围的白色被正确的还原,不存在偏色现象。

    2. 摄像头近距离检测颜色:

      摄像头十分靠近单色物体时,自动白平衡为了还原白色,将原本的红绿蓝卡片调节到完全失衡的状态,此时已经失去了原本的颜色信息,校准并锁定白平衡后,其原本颜色可以得到正确的还原。

    _images/camera_white_balance1.png
  6. 设置摄像头数码变焦

    • 具有数码变焦功能,共有 5 个档位可以使用,利用镜头缩放功能可以看到远处的目标物体。

    • 数码变焦等级越大可检测的距离越远,但视野范围会变窄。

    • 数码变焦等级1(距离近,视野广)~数码变焦等级5(距离远,视野窄)。

    • 针对不同距离的物体通过试验测试合理设置数码变焦等级值可以取得较好的识别效果。

    • 使用等级3-5时,图像帧率会比等级1-2低。

    _images/MU4.png
  7. 板载LED灯光设置

    • 视觉传感器正面板载有两颗LED灯,左侧是LED1, 右侧是LED2. 每闪烁一次表示执行一帧图像识别。

    • 可通过设置识别到目标与未识别到目标时灯光的颜色来获得反馈。

    • 默认设置:未检测到闪红灯,检测到则闪蓝灯。当进行颜色识别时,默认LED关闭。

    _images/MU5.png
  8. 恢复模块默认设置

    • 该程序块用来关闭所有算法,重置所有硬件设置。

    • 在调试模式下,建议在程序开始的时候执行该程序块,或者是手动点一下reset按键。因为算法不会在程序结束后自动关闭,长期调试不同算法会导致占用过多的内存。

    _images/restore_the_default1.png
  9. 判断摄像头是否检测到目标

    检测到所选的目标后,返回True, 否则返回False。

    _images/MU6.png
  10. 判断摄像头是否检测到颜色

    (1)检测到目标位置的颜色后,返回true, 否则返回False。

    (2)色块检测与颜色识别的区别:

    色块检测:指定一种颜色和该颜色块尺寸的最小值,然后摄像头会在图像中寻找符合该要求的一个色块区域,返回其坐标和大小,解决“是不是”的问题。下图左侧设定为检测蓝色,摄像头会在图像中寻找蓝色色块方位。

    颜色识别:指定一个检测区域,然后摄像头统计该区域中像素的颜色,并返回该颜色的Label值标签以及具体的红 R,绿 G,蓝 B 通道的值,解决“是哪一个”的问题。下图右侧设定识别区域位于图像中心,图中识别结果为绿色,Label5

    _images/MU7_1.png _images/MU7_3.png

    (3)颜色Label分类标签的定义:

    _images/MU7_2.png
    _images/MU7.png
  11. 判断摄像头是否检测到色块

    检测的目标色块可以在下拉框里选择,摄像头检测到所选目标色块后,返回true, 否则返回False。

    _images/MU9.png
  12. 获取检测目标的坐标以及大小

    返回值是检测到的目标的坐标。检测目标可以在下拉框选择,获取的值有横向,纵向坐标,以及目标的宽度和高度。

    (1)X-Y 坐标:摄像头输出图像的宽高比例为 4:3。在图像坐标系中,水平与垂直坐标均被量化到了 0~100 的范围内,其含义是该坐标相对于完整图像的百分比位置。例如 X 为30时,即该物体的 X 坐标位于水平方向距离原点 30%的位置上。

    (2)W-H 宽高:当检测到物体后,返回物体的 Width 宽度值和 Height 高度值,其量程同样被量化到了 0~100 的范围内,其 W 宽度的含义是其在整个水平方向所占据的百分比值,H 高度的含义是其在整个垂直方向所占据的百分比值。需要注意的是,由于水平垂直的比例是 4:3,所以对于宽高相同的正方形物体而言,其输出的宽高值是存在一个 3:4 的比例关系的,而并不是相等的关系。

    (3)Label 分类标签:对于具有分类识别功能的算法而言,还会根据所检测到的不同物体输出其对应的分类标签值,该值是内部设定好的一系列数字,每一个数字对应一个特定的物体,以球体算法为例,当 Label 标签为 1 时,代表检测到了一个乒乓球,而如果 Label 标签输出为 2,则说明此刻检测到的是一个网球。Label 分类标签在颜色和卡片的算法中是一个十分关键的信息。

    _images/MU8.png _images/MU8_1.png
  13. 获取目标颜色里对应的RGB值

    颜色识别输出结果并不是坐标和宽高,而是颜色的 label 标签以及 R 红,G 绿,B 蓝三个通道的值(范围 0~255)。在使用颜色识别时可以指定识别区域的坐标,其余参数为默认值。

    _images/MU10.png
  14. 判断是否检测到形状卡片里所选形状

    检测到形状卡片里所选形状卡片后,返回true, 否则返回False。形状有钩,叉,圆形,方形,三角形可以选。

    _images/MU11.png
  15. 判断是否检测到交通卡片里所选图标

    检测到交通卡片里所选图标后,返回true, 否则返回False。图标有向前,向左,向右,掉头,停车可以选。

    _images/MU12.png
  16. 判断是否检测到数据卡片里对应数字

    检测到数字卡片里所选数字后,返回true, 否则返回False。数字有0-9可以选择。

    _images/MU13.png
  17. 判断是否检测到所选颜色

    检测到所选的颜色后,返回true, 否则返回False。颜色有9种可以选择。

    _images/MU14.png

完整示例

  1. 球体与人体检测:

    球体算法的特殊性:球体算法分为搜索阶段和跟踪阶段,在球体未检测到时处于搜索阶段,此时处理速度相对比较慢,检测距离也会比较近。一旦检测到球体后,会进入跟踪阶段,处理速度会有所提升,检测距离也会变远。当球体丢失后,会再次进入搜索阶段。

    人体算法的有效特征:人体检测实际是检测人体的上半身特征,上半身特征是指由头部(必须包含人脸)和胸部以上(肩膀)构成的特征组合,如果图像中具有符合人体上半身特征,那么会被认为是有人体被检测到。

    初始程序:采用I2C连接,启用人体检测算法,其余设置为默认。

    循环程序:如果视觉传感器检测到人体,会通过I2C向Ovobot bit发送检测到的数据,Ovobot bit会通过点阵屏幕显示位置和类型信息,否则循环显示未检测到人体,球体检测同理。

    实验现象:未检测到人体则视觉传感器闪红灯,屏幕显示”X”。检测到人体则视觉传感器闪蓝灯,屏幕显示”笑脸”。

    _images/MUlizi1.png
  2. 卡片识别

    我们具有 3 类卡片算法:形状卡片,交通卡片,数字卡片。摄像头只能识别下述特定图案的卡片。在一幅图像中,同一个算法只能返回一个卡片的检测结果,但可以同时运行不同类型的卡片算法。

    初始程序:采用I2C连接,启用交通卡片识别算法,其余设置为默认。

    循环程序:如果视觉传感器检测到交通卡片,会通过I2C向Ovobot bit发送检测到的数据,Ovobot bit会通过点阵显示类型信息,否则循环显示未识别,其他类型的卡片识别同理。

    实验现象:未检测到卡片则视觉传感器LED闪红灯,屏幕显示”X”。识别到则视觉传感器LED闪蓝灯,屏幕显示交通卡片的具体图案信息。

    _images/MUlizi2.png

    我们可以在识别不同卡片之后让Bit机器人做出相应的前进,后退,左转,右转,停下这些操作,就可以实现智能驾驶了。

  3. 颜色识别

    在使用颜色识别算法时,需要指定一个颜色识别区域,算法运行后只返回该区域内的颜色信息。颜色识别区域小,像素少,速度快,但容易因各别像素的偏色而造成可信度的降低;颜色识别区域大,像素多,速度慢,但容易受背景的干扰。颜色识别区域应根据实际需求而合理设置。

    颜色识别输出结果并不是坐标和宽高,而是颜色的 label 标签以及 R 红,G 绿,B 蓝三个通道的值(范围 0~255)。

    初始程序:采用I2C连接,启用颜色识别算法,锁定摄像头白平衡防止偏色,其余设置为默认。

    循环程序:视觉传感器识别坐标(50,50)处的颜色,通过I2C向Ovobot bit发送检测到的数据,Ovobot bit会通过屏幕显示颜色类别。

    实验现象:视觉传感器始终不闪灯,点阵显示返回的颜色类别。

    _images/MUlizi3.png
  4. 色块检测

    色块检测在不更改设置的情况下只能检测一种选定的颜色,摄像头会寻找视野中符合该色块的地方,返回结果最好的那一个,

    初始程序:采用I2C连接,启用色块检测算法,锁定摄像头白平衡防止偏色,其余设置为默认。

    循环程序:如果视觉传感器检测到红色块,会通过I2C向Ovobot bit发送检测到的数据,Ovobot bit会通过点阵点亮LED的位置来显示色块的位置,否则循环显示未检测到。

    实验现象:未识别到时视觉传感器闪红灯,点阵不显示。识别到红色块则视觉传感器闪蓝灯,点阵显示色块相对摄像头的位置(摄像头范围是横,纵坐标0-100,分别对应点阵的X Y 坐标0-4)。

    _images/MUlizi4.png

后续将更新更多案例,敬请期待。。。

基础扩展包积木块编程指南

Ovobot Bit MicroPython指南

开始编程前,首先需要导入必要的库:

from microbit import *
from ovobot import *

以下是使用Scratch给Ovobot Bit机器人编程的快速参考,如果你是第一次给机器人编程请先阅读接下来的部分:

运动

move(dir, speed)

通过设定机器人运动方向、运动速度和持续时间来让机器人运动,速度范围为0~255。

参数
  • dir (int) – 可以为0或者1,0:机器人向前运动,1:机器人向后运动。

  • speed (int) – 设置机器人运动的速度,数值范围为0~255。

例子:

from ovobot import *
from microbit import *


moveAtSpeed(0,100)
sleep(1* 1000)
stopMove()

解析:当绿旗被点击时,Bit机器人以100的速度匀速前进(0代表前进,1代表后退),等待1秒后停止运动。

move(dir, speed, s)

通过设定机器人运动方向、运动速度和持续时间来让机器人运动,速度范围为0~255。

参数
  • dir (int) – 可以为0或者1,0:机器人向前运动,1:机器人向后运动。

  • speed (int) – 设置机器人运动的速度,数值范围为0~255。

  • s (int) – 控制机器人持续运行指定的时间(秒)。

例子:

from ovobot import *


move(0,100,1)

解析:当绿旗被点击时,Bit机器人以100的速度匀速前进(0代表前进,1代表后退),持续时间为1秒。

rotateAtSpeed(dir, speed)

设置机器人向左或者向右的旋转速度,速度范围为0~255。

参数
  • dir (int) – 可以为0或者1,0:机器人向左旋转,1:机器人向右旋转。

  • speed (int) – 设置机器人旋转的速度,数值范围为0~255。

例子:

from ovobot import *
from microbit import *


rotateAtSpeed(0,100)
sleep(1* 1000)
stopMove()

解析:当绿旗被点击时,Bit机器人以100的速度向左旋转(0代表向左,1代表向右),等待1秒后停止运动。

rotate(dir, speed, s)

设置机器人向左或者向右的旋转速度以及持续时间,速度范围为0~255。

参数
  • dir (int) – 可以为0或者1,0:机器人向左旋转,1:机器人向右旋转。

  • speed (int) – 设置机器人旋转的速度,数值范围为0~255。

  • s (int) – 控制机器人持续运行指定的时间(秒)。

例子:

from ovobot import *


rotate(0,100,1)

解析:当绿旗被点击时,Bit机器人以100的速度向左旋转(0代表向左,1代表向右),持续时间为1秒。

stopMove()

设置左右两个电机的运动速度为0。

例子:

from ovobot import *
from microbit import *


rotateAtSpeed(0,100)
sleep(1* 1000)
stopMove()

解析:当绿旗被点击时,Bit机器人以100的速度向左旋转,等待1秒后停止运动。

rawMotorWithPwm(speed, speed)

分别驱动Bit的左右两个轮子的转速。

参数
  • speed (int) – 设置驱动Bit的左轮的转速,数值范围为-255~255。

  • speed – 设置驱动Bit的右轮的转速,数值范围为-255~255。

例子:

from ovobot import *
from microbit import *


rawMotorWithPwm(-255,100)
sleep(1* 1000)
rawMotorWithPwm(100,-255)
stopMove()

解析:当绿旗被点击时,Bit机器人的驱动电机以左轮-255、右轮100的速度行走, 等待1秒后,再以左轮100右轮-255的速度前进后停止运动。 (即先左拐再右拐)

外观

setledGroupColor(color, color)

可以分别设置左右两侧LED灯的颜色。

参数
  • color (int) – 设置左侧LED灯的颜色,可以为0-8,0:红色,1:橙色,2:黄色,3:绿色,4:蓝色,5:靛蓝色,6:紫色,7:白色,8:黑色。

  • color – 设置右侧LED灯的颜色,可以为0-8,0:红色,1:橙色,2:黄色,3:绿色,4:蓝色,5:靛蓝色,6:紫色,7:白色,8:黑色。

例子:

from ovobot import *
from microbit import *


while True:
  setledGroupColor(1,4)
  sleep(1* 1000)
  setledGroupColor(3,6)
  sleep(1* 1000)

解析:当绿旗被点击时,Bit机器人的彩色灯左侧为橙色,右侧为蓝色,等待1秒后,彩色灯左侧变为绿色,右侧变为紫色, 再等待1秒后变回原来的颜色, 如此重复执行这一指令。

display.scroll(value,delay = 150,*,wait = True,loop = False,monospace = False)

value在显示屏上水平滚动,如果value为整数或浮点数,则首先使用将其转换为字符串str()。 该delay参数控制文本滚动的速度。 如果wait为True,则此功能将阻塞直到动画结束,否则动画将在后台发生。 如果loop为True,则动画将永远重复。 如果monospace为True,则字符将全部占用5个像素列的宽度,否则在滚动时每个字符之间将恰好有1个空白像素列。 请注意wait,loop和monospace参数必须使用其关键字指定。

display.show(value,delay = 400,*,wait = True,loop = False,clear = False)

如果value为字符串,浮点数或整数,则按顺序显示字母/数字。 否则,如果value是可重复的图像序列,请依次显示这些图像。每个字母,数字或图像delay之间以毫秒为单位显示。 如果wait为True,则此功能将阻塞直到动画结束,否则动画将在后台发生。 如果loop为True,则动画将永远重复。 如果clear为True,则在迭代完成后将清除显示。 请注意wait,loop和clear参数必须使用其关键字指定。 详情请参考:https://microbit-micropython.readthedocs.io/en/latest/tutorials/images.html

例子:

from microbit import *


display.show(Image("09090:90909:90009:09090:00900"))
sleep(0.5* 1000)
display.show(Image("99999:00009:99999:90000:99999"))
sleep(0.5* 1000)

解析:当绿旗被点击时,Bit机器人的LED灯显示“❤”的图案,等待0.5秒后,变为显示“2”的图案,同样显示0.5秒。

display.clear()

将所有LED的亮度设置为0(熄灭)。

例子:

from microbit import *


display.show(Image("09090:90909:90009:09090:00900"))
sleep(2* 1000)
display.clear()

解析:当绿旗被点击时,Bit机器人的LED灯显示“❤”的图案,等待2秒后,熄灭屏幕。

display.set_pixel(x, y, action)

点亮Bit机器人LED点阵屏上某个坐标的LED,x、y的数值范围为0~4,零点在点阵屏的左上角,水平向右为x轴,竖直向下为y轴。

参数
  • x (int) – 对应x轴的坐标,数值范围为0~4。

  • y (int) – 对应y轴的坐标,数值范围为0~4。

  • action (int) – 0:熄灭,9:点亮。

display.set_pixel(x, y, value)

将列x和行的LED亮度设置为value,必须是0到9之间的整数。

参数
  • x (int) – 设置对应x轴的坐标,数值范围为0~4。

  • y (int) – 设置对应y轴的坐标,数值范围为0~4。

  • value (int) – 0:熄灭,9:点亮。

display.get_pixel(x, y)

以0(熄灭)和9(点亮)之间的整数返回列x和行的LED亮度y。

参数
  • x (int) – 设置对应x轴的坐标,数值范围为0~4。

  • y (int) – 设置对应y轴的坐标,数值范围为0~4。

声音

music.pitch(频率,持续时间= -1,pin = microbit.pin0,wait = True)

以指定的毫秒数以给定的整数频率播放音高。 例如,如果频率设置为440,长度设置为1000,则我们将听到标准音乐会A的声音达一秒钟​​。 请注意,您一次只能在一根针上弹一个音高。 如果wait设置为True,则此功能正在阻止。 如果duration为负,则连续播放音调,直到阻塞呼叫被中断,或者在后台呼叫的情况下,设置或调用了新的频率stop。 详情请参考:https://microbit-micropython.readthedocs.io/en/latest/music.html

例子:

from microbit import *
import music


music.pitch(262 , 500 , pin=pin0 , wait=True)
music.pitch(330 , 1000 , pin=pin0 , wait=True)

解析:当绿旗被点击时,播放C音符持续一个节拍,然后播放E音符持续一个节拍。

music.stop(pin = microbit.pin0)

在给定的引脚上停止所有音乐播放,例如:music.stop(pin1)。 如果没有给出引脚,例如:music.stop()假设为pin0。

参数
  • note (int) – 默认选择播放的音符为0,即代表暂停播放。

  • beat (int) – 音符播放的节拍数,节拍数为500的倍数,倍数范围为1/16~4。

引脚

pin1.is_touched()

如果引脚被用手指触摸,返回True,否则返回False。 该测试是通过测量引脚与地面之间有多少电阻来完成的。低电阻可提供的读数True。 为了使用手指获得可靠的读数,您可能需要用身体的另一部分(例如另一只手)触摸接地插针。

pin1.read_analog()

读取施加到该引脚的电压,并将其返回为0(表示0V)和1023(表示3.3V)之间的整数。

pin1.write_analog(n)

在引脚上输出PWM信号,占空比与所提供的成正比。 value可以是整数或0(0%占空比)之间的浮点数和1023(100%占空比)。

pin1.read_digital()

如果引脚为高电平,则返回1;如果引脚为低电平,则返回0。

pin1.write_digital(n)

如果value为1,则将引脚设置为高电平;如果为0,则将其设置为低电平。

无线通讯

radio.on()

打开无线通讯,由于无线电会消耗功率并占用您可能需要的内存,因此需要显式调用此方法。

radio.off()

关闭无线通讯,从而节省电量和内存。

radio.reset()

复位无线通讯,将设置重置为其默认值

radio.send('str')

发送无线消息。

参数

str (int) – 字符串,可以是文字、字母、数字。

radio.send_bytes(list_tobytes([1, 2]))

发送无线消息列表。

list_tobytes([radio.receive()

接收无线消息。

list_tobytes(bytes_tolist(radio.receive_bytes()))

接收无线消息列表。

radio.config(channel=1)

设置无线通讯频道。

事件

from microbit import *

当机器人处于离线模式时,启动Ovobot Bit,执行此模块下方的程序。

例子:

from microbit import *
import music

music.pitch(262 , 500 , pin=pin0 , wait=True)

解析:当机器人处于离线模式时,启动Ovobot Bit,播放C音符持续一个节拍。

on_button_action_pressed():

按钮指的是micro:bit的两个可编程按键,分为A和B,当对应Bit的按钮被按下时,执行此模块下方的程序。

参数

action (int) – 设置对应按钮,a代表A键,b代表B键。

例子:

from microbit import *
from ovobot import *

def on_button_a_pressed():
  move(0,100,1)

while True:
  if button_a.is_pressed():
    on_button_a_pressed()

解析:当按下micro:bit的可编程按键A键时,Bit机器人以100的速度前进,持续时间为1秒。

on_irbutton_button_pressed():

当红外遥控器对应的按钮被按下时,则会执行程序块下方的程序。

参数

button (int) – 设置对应按钮,1-21代表不同的按钮。

例子:

from ovobot import *

def on_irbutton_m_pressed():
  move(1,255,2)

while True:
  if irkeyIsPressed(1):
    on_irbutton_m_pressed()

解析:当按下红外遥控器的M键时,Bit机器人以255的速度后退,持续时间为2秒。

fon_loudness_greater_than_vol():

当响度大于设置数值时,则会执行程序块下方的程序。

参数

vol (int) – 可设置响度大小。

控制

sleep(n)

将暂停执行指令等待n毫秒,一秒是1000毫秒。n可以是整数或浮点数。

参数

s (int) – 控制机器人停止运动指定的时间(秒)。

侦测

button_action.is_pressed():

选择机器人按键触发事件的回调函数。

参数

action (int) – 设置对应按钮,a代表A键,b代表B键。

irkeyIsPressed(button):

如果M按键按下的话,返回值就是True, 否则返回值是false。

参数

button (int) – 设置对应按钮,1-21代表不同的按钮。

accelerometer.is_gesture(name):

判断机器人的姿态,执行程序块下方的程序。

参数

action (int) – 设置机器人姿态的对应按钮,包括被摇晃、向上倾斜、正面朝上、自由下落等。

accelerometer.get_values()

根据x、y、z方向,以正整数或负整数获取轴上的加速度测量值,测量单位为毫克。 默认情况下,加速度计的配置范围为+/- 2g,因此此方法将在+/- 2000mg范围内返回。

参数

axis (int) – 可选择返回x轴、y轴或z轴的加速度值。

loudness()

我们用响度来表示声音传感器的反馈值,响度的范围大小是0-255。

readBatteryLevel()

电池电量模块可以实时显示Bit的百分比电量。

caliGyro()

校正Bit的俯仰、横滚和侧偏的角速度。

(getGyrox()

反馈Bit的俯仰、横滚和侧偏的角速度。

getYaw()

反馈Bit侧偏的角度。

compass.heading()

根据上述读数计算得出的罗盘方向为从0到360范围内的整数,代表以度为单位的角度,顺时针方向,北为0。

compass.get_field_strength()

反馈当前环境中总磁场强度,单位是纳特斯拉。用磁铁靠近电子罗盘,看看磁场强度有什么变化。

compass.calibrate()

开始校准过程:一条指示性消息将滚动给用户,此后他们将需要旋转设备以便在LED显示屏上画一个圆圈。

temperature()

反馈温度传感器检测到的温度值。

display.read_light_level()

反馈光敏传感器感应环境光线的强度。可以尝试修改亮度级别,看看不同级别对应什么样的亮度。

running_time()

反馈Bit机器人的运行时间。

readDistance(No)

反馈Bit机器人超声波传感器检测到的距离。

参数

No (int) – 可选择超声波传感器模块,0代表模块1、1代表模块2、2代表模块3、3代表模块4。

anyWasNearBySonic(No):

反馈Bit机器人超声波传感器有没有检测到障碍物。

参数

No (int) – 可选择超声波传感器模块,0代表模块1、1代表模块2、2代表模块3、3代表模块4。

readLineSensorData(No, dir)

可以分别反馈巡线传感器左右两个光电对管检测的灰度值,黑色物体的返回值接近0,白色物体返回值接近255。

参数
  • No (int) – 可选择巡线传感器模块,0代表模块1、1代表模块2、2代表模块3、3代表模块4。

  • dir (int) – 0代表左侧,1代表右侧。

readLineState(No,dir,color):

分别用于判断巡线传感器左侧或者右侧是否检测到黑色或白色,条件成立时返回为真。

参数
  • No (int) – 可选择巡线传感器模块,0代表模块1、1代表模块2、2代表模块3、3代表模块4。

  • dir (int) – 0代表左侧,1代表右侧,2代表全部。

  • color (int) – 0代表黑色,1代表白色。

运算

变量

Ovobot Bit MakeCode指南

Ovobot Bit机器人基于micro:bit,所以你也可以选择MakeCode micro:bit来给Bit机器人编程。

首先打开 MakeCode编辑器,然后点击高级中的扩展按键。

_images/makecode_editor_1.png

在弹出的扩展界面的搜索框中输入https://github.com/Ovobot/pxt-ovobot,并点击搜索。

_images/makecode_extansion.png

选择搜索到的ovobot扩展包添加的编辑器中。

_images/makecode_editor_2.png

Xtron简介

Xtron是一款多功能的单板计算机,有如下三大功能:

_images/intr1.png
  • Xtron是一款可图形化编程的游戏掌机。你可以用微软的Makecode Arcade来设计游戏中的场景,角色以及各个情景环节,研发一款属于自己的游戏。

  • Xtron还可以作为可编程游戏手柄。下载指定的固件就可以将Xtron模拟为电脑的键盘外设,对应键盘的方向键和A、B按键,从而可以在你的Scratch游戏中加入Xtron手柄的控制。

  • Xtron还是一个可编程的创客主板。它可以控制多种类的传感器,并且支持Scratch和Python编程,你可以用它来完成很多创客项目。

硬件介绍

硬件参数:

_images/intr2.png

硬件模块接口:

_images/hardware.png

编程平台

  1. makecode图形化编程模式: Makecode平台

    Makecode是由微软推出的一款支持图形化编程平台以及JS编程的平台(包括Microbit、Adafruit、Arcade等等),Xtron支持Arcade系列

    微软官方arcade编程平台:https://arcade.makecode.com

  2. Scratch & Python编程模式: Ovoblock软件

    Ovoblock是一款基于Scratch 3.0开发的电脑端编程软件,支持Mac、PC和浏览器平台,兼容Scratch 3.0的所有功能,同时也支持python语言开发。

    Ovoblock下载链接:https://www.ovobot.cn/zh-hans/app/#Ovoblock

相关课程

首先,你可以尝试组装你的Xtron, 点击 组装参考步骤 .

我们为你准备了Xtron对应的Acade, Scratch, Python相关课程指南,接下来,你可以根据自己的需求来学习:

Xtron Arcade 指南

入门Arcade
Arcade介绍
  1. Makecode Arcade平台主打游戏编程,你可以用简单的积木块来搭建自己的游戏,积木块的功能可以参考 Arcade积木栏详解.

  2. 平台左侧是一个模拟器,你编写的游戏实时效果会在模拟器上展示,你可以实时的调试和优化自己的游戏。

_images/null1.png
  1. 平台支持积木块转JS代码,在Arcade平台上,你可以通过积木块编程入门,再进阶到JS编程,逐渐锻炼你的逻辑思维以及增进你的编程技巧。

Makecode平台编程地址: https://arcade.makecode.com

快速入门

在开始编程之前,我们先了解一下Xtron的使用方法。

  1. 我们首先体验一个经典游戏Falling Duck。

    打开编程网址首页,如果你是第一次使用Arcade,显示的是默认的英文,你可以点击右上角的设置,选择语言,切换成你想要的语言。

    _images/language.gif _images/null1.png

    滚动鼠标,找到【积木块类游戏】, 点击【Falling Duck】打开示例。

    _images/11.gif _images/null1.png

    平台中间的代码区,你可以看到这个游戏对应的积木块的代码,点击切换成【{}JavaScript】,你可以看到对应的JS代码。

    _images/21.gif _images/null1.png

    在左边的模拟器上,你可以体验一下游戏的效果。点击任意按键开始游戏,每次按键按下之后,duck会往上跳动一次,顺利穿过一个树桩得分+1。

    _images/3.gif
  2. 接下来我们把项目下载到Xtron来体验一下。

    Xtron处于关机状态,把Xtron用USB连接到电脑上,屏幕显示如下的F4图案,如果屏幕显示的不是这个图案,那么按下Xtron的【RST】按键。

    Xtron/Xtron_Arcade/images/fastuse5.jpg _images/null1.png

    点击左下角的【下载】按键,选择【F4】。

    _images/41.gif _images/null1.png

    找到刚才下载的.uf2 文件,右击鼠标,选择发送到Xtron.

    _images/51.gif _images/null1.png

    现在我们可以在Xtron上体验这个游戏了。

  3. 现在我们尝试新建一个项目。

    回到主页,点击【新建项目】,为项目起一个名字。

    _images/6.gif _images/null1.png

    创建一个精灵后,模拟器的界面上也会出现一个精灵。再创建第二个精灵,精灵的形象可以选择资料库中的形象,也可以自己绘制。

    创建两个精灵之后,他们默认是出现在屏幕中央,你可以改变一下第一个精灵的位置。我们屏幕的大小是120*160.

    _images/71.gif _images/null1.png

    用同样的方法,我们可以把自己的项目下载到Xtron中。

  4. 除了下载,你还可以用分享的方式向朋友展示你的作品。点击【发布项目】,会生成一个项目链接,通过这个链接,你的朋友可以访问到你的作品,并且可以在他的电脑上编辑你的程序。

    _images/81.gif
  5. Arcade提供了丰富的积木块,如果你想要了解每一个积木块的功能,可以参考后面的 Arcade积木栏详解.

Arcade 积木栏详解
精灵
创建精灵

用于创建游戏中的角色,其中精灵的造型可以选择角色库中的形象,也可以自己绘制。类型可以根据需要来设置,也可以添加新的类型。

_images/sprite_create.png

例子:

创建一个柠檬作为游戏中的角色,可以看到模拟器中也出现了创建的角色。

_images/create_example.png
物理
  1. 设置精灵的基本物理属性:位置,速度

    _images/physic.png

    例子:

    创建一个角色,让它初始坐标是(30,10),并且按照X轴速度50,Y轴速度50运动。

    _images/physic_example.png
  2. 精灵属性的取值,改变精灵属性的值,设置精灵属性的值。

    _images/physic_2.png

    属性值选择框下拉,除了基本的x,y坐标,有下面这些可选属性:

    _images/physic_3.png
    • vx、vy:表示x轴,y轴的速度

    • ax、ay:表示x轴,y轴的加速度

    • 生命值:表示精灵存在的时间,生命值的单位是s

    • z(深度):表示精灵的前后位置关系,数值越大表示精灵越靠前

    • 宽度高度:表示精灵像素的大小

    • 左、右、top、底部:分别表示精灵距离这四个方向的像素值(其中左上角的像素值是(0,0))

    例子:

    创建一个角色,让它以速度15往下运动, 当按下按键A后,把加速度改变成向上的10,角色开始向上运动。

    _images/physic_example2.png
  3. 让一个角色跟随另一个角色变化位置

    _images/physic_4.png

    例子:

    创建一个柠檬角色,一个草莓角色,让草莓跟随柠檬移动。我们给柠檬设置一个移动速度,虽然我们没有给草莓设置速度,但是它会跟着柠檬一起运动。

    _images/physic_example3.png
特效
  1. 给精灵开启特效和消除特效

    _images/effect_1.png

    例子:

    创建一个精灵,开启喷涂特效,按下按键A之后,消除特效。

    _images/effect_example1.png
  2. 把创建的精灵从游戏中销毁

    _images/effect_2.png

    例子:

    创建一个精灵,开启喷涂特效,按下按键A之后,销毁精灵。

    _images/effect_example2.png
  3. 让精灵说话,在精灵上方会出现一个对话框,精灵想说的话会显示出来。

    _images/effect_3.png

    例子:

    创建一个精灵,按下按键A之后,精灵说”hello”并且延时1S,1S之后对话框消失。

    _images/effect_example3.png

4.设置精灵的一些功能,下拉框是可选的参数。

_images/effect_4.png

可选的参数分别表示:

  • 停留于屏幕:让精灵只能处于160*128的屏幕内(可以配合跟随积木块一起使用)

  • 幽灵:幽灵模式的精灵无法接触到游戏中的其他场景和角色

  • 自动销毁:变成幽灵的精灵走出屏幕范围后自动销毁

  • 碰到屏幕边缘销毁:精灵碰到屏幕边缘会销毁

  • 碰到屏幕边缘反弹:精灵碰到屏幕边缘反弹

  • 显示坐标与速度:在精灵底部显示他的坐标和速度

例子:

创建一个精灵,给它一个速度移动,碰到屏幕边缘后精灵反弹。

_images/effect_example4.png
弹射物

给弹射物一个速度,让它从边上弹射出来,或者从精灵周围弹射出来。

_images/jump.png

例子:

创建一个树, 雪花从边上慢慢下落,有个苹果从树上掉下来。

_images/jump_example.png
重叠
  1. 当两个精灵相互重叠时,执行内部的程序。注意这里的精灵类型也是判断条件之一。

    _images/overlap1.png

    例子:

    当两个精灵重叠的时候,得分增加1.

    _images/overlap_example1.png
  2. 当两个精灵重叠时,返回值是True。作为一个判断条件,常常跟逻辑语句结合使用。

    _images/overlap2.png

    例子:

    同上,当两个精灵重叠的时候,得分增加1. 只是用了两种不同的判断方式。

    _images/overlap_example2.png
  3. 设置精灵的类型, 返回精灵的类型

    _images/overlap3.png

    例子:

    1. 游戏开始时,当两个精灵重叠的时候,得分不变,但是按下按键A后,两个精灵重叠的时候,得分增加1.

    2. 因为在按键A按下的时候,我们把mysprite2的类型改成了Food, 我们的判断条件里,要求Player类型和Food类型精灵重叠时,得分才增加1.

    _images/overlap_example3.png
生命周期

当一个精灵被创建或者被销毁的时候,执行内部程序。

_images/life.png

例子:

  • 游戏开始时创建一个玩家,按下按键A时,创建一个柠檬角色,类型是食物,并且玩家说“food created”. 按下按键B时,销毁柠檬角色,并且玩家说“food destoryed”.

  • 这里我们还创建了一个flag变量,因为如果食物没有被销毁,我们是不能重复创建同一个食物精灵的。所以只有在食物被销毁后,flag=0, 按下按键A, 才会创建食物。

_images/life_example1.png
图像

为精灵设置新的形象,也可以将一个精灵的形象设置成另一个精灵的形象。

_images/image.png

例子:

创建一个玩家精灵, 创建一个食物精灵。当按键A按下,玩家精灵变成食物形象,当按键B按下,回复到玩家形象。

_images/image_example.png
控制器
单人模式
  1. 使用键盘方向键来控制精灵的移动。后面的加号点开可以设置精灵x,y轴的移动速度(默认为100)

    _images/control1.png

    例子:

    创建一个玩家精灵,并且用键盘方向键控制精灵向不同方向移动。

    _images/control_example1.png
  2. 当按键按下,松开或者重复时,执行内部的程序。其中按钮框可以下拉选择。

    _images/control2.png

    例子:

    创建一个玩家精灵,按键A按下时,玩家精灵按照设置的速度移动。

    _images/control_example2.png
  3. 当按键按下时,返回True. 作为一个判断条件,常常跟逻辑语句结合使用。

    _images/control3.png

    例子:

    同上,创建一个玩家精灵,按键A按下时,玩家精灵按照设置的速度移动。只是用了两种不同的判断方式。

    _images/control_example3.png
  4. 用于单独控制精灵x和y轴的移动,点击加号可以设置x,y轴速度(默认为100)。这个可控制器的第一个积木块的区别是X Y可以分开设置,更加灵活。

    _images/control4.png

    例子:

    创建一个玩家精灵,并且用键盘左右方向键控制精灵X轴移动,用上下方向键控制精灵Y轴移动。(案例重写)

    _images/control_example3.png
多人模式

积木块使用方法和单人模式一样,只不过多了一个参数来设置是哪一个玩家控制的。

_images/control5.png
游戏
游戏内容
  1. 游戏更新积木块,这两个积木块的区别是一个几乎是一直在更新,更新频率由游戏引擎决定。 * 第二个的更新频率取决于后面设置的时间,可以当一个定时器来使用。 * 在Arcade游戏编程中,我们用这两个积木块来代替Makecode的【无限循环】。

    _images/game1.png
  2. 游戏结束,点击后面的加号可以选择是Win还是Lose.

    _images/game2.png
  3. 从游戏开始的时候计时,返回一个游戏运行的时间值,单位是ms.

    _images/game3.png
  4. 游戏复位积木块, 让游戏重新开始。

    _images/game4.png

    例子:

    创建一个玩家,一个食物,使用按键移动玩家。

    游戏规则:

    1. 游戏开始后,玩家实时播报游戏开始时间

    2. 玩家吃到食物后,生命值+1

    3. 时间每过2s, 玩家生命值-1

    4. 玩家生命值为0,游戏结束

    5. 按下按键A后, 游戏复位

    _images/game_example1.png
提示(询问)
_images/game5.png
  • 显示积木块:内容显示在屏幕中间。点击” + “号,可以扩展一个文本框,第一个显示在第一行,第二个显示在第二行。

  • 判断提问积木块:文本框中是提问的内容,显示在屏幕中间。点击A是ok, 返回True,点击B是cancel,返回false.

  • 提问字符:返回回答的字符串,用来回来一些文本问题。文本框内是提问的内容,显示在屏幕的上方,问题下方是26个字母以及数字0-9。方向键可以移动选择,A键确定,B键删除,屏幕左下角可以切换大小写。回答完毕之后,用方向键把光标移动到”OK”按钮,点击A键之后,会返回你所回答的字符串。

  • 提问数字:返回回答的数字值,这个用来回答一些数字。文本框内是提问的内容,显示在屏幕的上方,问题下方是0-9的数字以及”-“和”.”两个符号。方向键可以选择数字,A键确定,B键删除。回答完毕之后,用方向键把光标移动到”OK”按钮,点击A键之后,会返回你所回答的数字值。

例子1:

这是Mike的Xtron, 现在要求玩家输入姓名,如果姓名是Mike, 显示welcome;如果不是mike,显示Input wrong.

_images/game_example2.png

例子2:

提问是100以内的随机整数加法,要求玩家回答。把玩家的回答和正确答案相比较,相同显示回答正确,否则显示回答错误,并且下面一行显示正确答案。

_images/game_example5.png
对话框
_images/game6.png
  • 显示长文本:显示对话框的内容,显示在屏幕中的位置可以选择。支持显示汉字,底部可现实46个字符即23个汉字。

  • 设置文本颜色:设置对话框文本的颜色,16个颜色可选。

  • 设置对话框样式:可以自己设计对话框的款式,也可以用资料库中的款式。

  • 设置对话框光标:光标的图案可以自己设计或者使用资料库的图案。

Tips: 一般来说,我们先把对话框的样式以及颜色选定好之后,再显示对话框内容。如果先显示内容,后面修改颜色等不会应用到之前的文本框。

例子:

设计一个文本框。

_images/game_example6.png
音乐
声音

播放声音以及停止播放。下拉框里面的音乐可选。

_images/music11.png
  • 播放声音:播放所选声音,如果后面播放了新的声音,会一起播放。

  • 播放声音直到结束:播放所选声音,直到播放完毕才会开始播放下一个声音。

  • 循环播放:所选声音会循环播放,直到停止播放。

  • 停止播放:停止播放所选声音。

  • 停止所有声音:所有的之前播放的声音都被停止。

例子:

播放声音wawawawaa, 结束后循环播放 ba ding, 直到按键A按下,停止播放。

_images/music_example1.png
Melody

播放一段旋律,其中旋律可以自己编辑或者选用已有的。tempo是播放旋律的节奏,范围是0-500,值越大,节奏越快。

_images/music2.png

例子:

播放一段哆来咪发唆拉西哆的声音。

_images/music_example1.png
音调
_images/music3.png
  • 播放音符积木块,可以选择音符和拍数播放,提供的八度音符支持3个八度,分别为低中高。中C对应的简谱是i(哆)。

  • 响铃积木块,会不停的播放所选音符。

  • 休止积木块,可以当作休止符来用,节拍长度可选。

  • 另外可通过第4个积木块来播放跨度更高的音调,这里有将近8个八度的完整蜂鸣器频率,只要输入对应音符的频率。

例子:

可以按照下面的谱子来编写一首生日快乐歌。

_images/music_happy.png

下面是第一个小段的音乐:

_images/music_example3.png
音量

设置音量大小,一般在播放音乐前后使用。

_images/music4.png
节拍

BPM是Beat Per Minute的简称,表示每分钟的拍数。

_images/music5.png
  • 改变节奏:改变播放声音的节奏。>0是加快节奏, <0是减慢节奏。

  • 设置节拍:设置声音的节拍的快慢。数值越大,节奏越快。

  • 节奏: 返回当前的节奏值。

  • 节拍: 节拍值,下拉框可选,可以在设置节拍的时候使用。

例子:

播放一段节拍越来越快的旋律, 如果想要节拍越来越慢,改变节奏的值设为<0即可。

_images/music_example5.png
场景
屏幕
  1. 返回屏幕的宽度和高度值。

    _images/env1.png

    例子:

    在屏幕中间显示出“宽度 X 高度”的的字符串。

    _images/env_example1.png
  2. 设置背景的颜色和图片。

    _images/env2.png
    • 设置背景颜色:下拉框有16种颜色可供选择。

    • 设置背景图片:背景图片可以手绘,也可以用资料库中的图片。

    • 背景颜色:获取当前的背景颜色信息。

    • 背景图片:获取当前的背景图片信息

    例子:

    可以绘制一个自己的姓名牌。(待补图片)

    _images/env_example1.png
特效

开始游戏特效以及结束游戏特效。使用方法和之前精灵特效的方法一致,区别是精灵特效针对精灵,场景特效是针对整个游戏场景。

特效下拉框可选,开始游戏特效后面的 + 号点开可以设置特效的时间。

_images/env3.png

例子:

游戏开始时,开启特效,按键A按下后,停止特效。

_images/env_example3.png
砖块
  1. 设置砖块地图,可以自己绘制,也可以用资料库中的图案。

    _images/env4.png
  2. 对于现有的砖块,可以根据颜色来替换成别的图案。替换的图案可以自己绘制,也可以用资料库中的图案。

    _images/env5.png

    例子:

    绘制台阶砖块,然后把其中粉色的砖块图案替换成橙色的方框图案。

    _images/env_example5.png
  3. 定位一个砖块的位置,左上角的坐标是(0.0)。通常和下面的积木块一起使用。

    _images/env6.png
  4. 设置一个已知位置的砖块颜色,可以直接根据坐标定位来设置颜色。也可以和上面的定位砖块积木块一起使用,先定位一个砖块,再设置或者改变砖块颜色。

    _images/env7.png

    例子:

    绘制台阶砖块,找到坐标(5,6)的台阶,把颜色替换成紫色。

    _images/env_example7.png
  5. 定位相同颜色的砖块,放到一个数组里。通常和替换积木块一起使用,用于批量替换一些砖块。

    _images/env8.png

    例子:

    绘制台阶砖块,找到所有粉色的台阶,依次替换成紫色。

    _images/env_example8.png
  6. 可以将精灵准确的放置在砖块地图上的随机一个砖块位置上,通过颜色索引值去限制精灵所能匹配的砖块颜色类型。

    _images/env9.png

    例子:

    绘制砖块地图,把精灵随机放在红色砖块上面。

    _images/env_example9.png
  7. 把精灵放在指定的一个砖块上。比如精灵的运动,可以用这个来实现。

    _images/env10.png

    例子:

    绘制砖块地图,让精灵从左边的砖块依次往右边移动。

    _images/env_example10.png
碰撞
  1. 当精灵撞到砖块的之后,执行内部程序。

    _images/hit1.png

    例子:

    游戏开始,精灵有10点生命值。用按键开移动精灵,每次撞到墙精灵生命值都回-1,直到生命值为0,游戏结束。

    _images/hit_example1.png
  2. 碰到砖块指定方位的时候,返回值是True, 通常和判断条件一起使用,满足条件,执行内部程序。

    _images/hit2.png

    例子:

    绘制砖块地图,用按键移动精灵,撞到墙之后,说出撞的方向。

    _images/hit_example2.png
  3. 碰到砖块指定方位的时候,返回该砖块的索引值。不同的砖块的索引值是不同的。

    _images/hit3.png

    例子:

    修改一下上面的程序,在精灵碰到砖块后,说出返回的索引值。

    _images/hit_example3.png
相机
  1. 镜头抖动积木块,该积木块属于特效积木块,在遇到危险或发生碰撞事件时以震动来增强游戏效果。

    _images/cam1.png

    例子:

    创建精灵和砖块地图,使用按键来移动精灵,如果精灵撞到砖块顶部,镜头抖动。

    _images/cam_example1.png
  2. 镜头跟随精灵移动。我们的游戏场景通常是比较大的,在精灵移动的过程中,我们希望镜头是跟着精灵走的,这个积木块就能实现这样的效果。

    _images/cam2.png

    例子:

    创建精灵和砖块地图,这里我们使用16*16或者更大的画布,这样我们对应的场景大小就是256*256了,我们的屏幕显示的是场景的1/4, 如果想看到其余的场景,我们可以使用按键来移动精灵,这样镜头就跟着精灵移动,其余的场景在移动的过程中就能展现出来了。

    _images/cam_example2.png
  3. 设置镜头的位置, 可以给定一个坐标,然后把镜头转向那个位置。

    _images/cam3.png

    例子:

    在上一个例子的基础上,我们把镜头跟随精灵移动变成镜头转向一个随机的坐标。这里,每隔500ms,镜头会转向一同的坐标位置。

    _images/cam_example3.png
游戏信息
得分
  1. 返回游戏的分数和最高分。

    _images/gameinfo1.png
  2. 设置和改变游戏的的得分,得分会显示在屏幕的右上角。

    _images/gameinfo2.png
生命值
_images/gameinfo3.png
  • 生命值积木块:返回当前的生命值

  • 设置生命值积木块:给玩家赋予一个初始生命值,显示在屏幕的左上角,用爱心数量表示。

  • 改变生命值积木块:当玩家完成某一个指令时,给它增加或者减少生命值。数值>0是增加,<0是减少。

  • 当生命值为0积木块:当玩家生命值为0, 执行内部指令。

例子:

创建一个玩家,一个食物,一个弹射物。初始生命值是5,当玩家吃到食物的时候,生命值+1, 当玩家碰到弹射物的时候,生命值-1, 当生命值是0的时候,游戏结束。

_images/gameinfo_example3.png
倒数
_images/gameinfo4.png
  • 开始倒计时积木块:游戏开始倒计时,倒计时显示在屏幕的上方。只有倒计时作为判断游戏是否结束的时候,倒计时结束,默认是游戏结束。

  • 停止倒计时积木块:让当前的倒计时暂停。

  • 当倒计时结束积木块:当有生命值等多个条件判断的时候,倒计时结束了游戏依然继续,这个时候如果想要倒计时为0的时候结束游戏,就可以在这个积木块内部执行游戏结束程序块。

例子:

创建一个玩家,一个食物,一个弹射物。玩家初始生命值是5, 倒计时是20s.

游戏规则:

  1. 玩家吃到食物,得分+1;

  2. 玩家撞到弹射物:生命值-1;

  3. 当生命值为0或者倒计时结束的时候,游戏结束。

_images/gameinfo_example4.png
多人游戏

积木块和上面的使用方法是一样的,区别是要对应不同的玩家。

_images/gameinfo4.png
循环
  1. 无限执行,不断的重复执行内部程序。

    _images/loop1.png
  2. 暂停ms为单位的指定时间.

    _images/loop2.png
  3. 重复执行N次,N是>0的整数

    _images/loop3.png
  4. 如果判断条件成立,执行内部程序。判断条件可以自己设定。

    _images/loop4.png
  5. 让变量“索引”采用0到结束数字范围内的值,以1为增量,并执行内部程序。

    _images/loop5.png
  6. 让变量“值”依次取数组List中的每一项值,并执行内部程序。

    _images/loop6.png
  7. 当开机时执行内部程序。

    _images/loop7.png
逻辑
条件

如果条件为真,执行某些指令,否则执行另外一些指令。

_images/logic1.png
比较

如果前后两个值满足中间的条件(相等,不等,大于,小于等),则返回True.

_images/logic2.png
布尔值
_images/logic3.png
  • 与:如果两个输入都为true, 则返回true

  • 或:如果至少一个输入为true, 则返回true

  • 非:如果输入为false, 则返回true, 如果输入是true, 则返回false.

变量
  1. 创建变量,点击设置变量,输入变量名称之后会创建变量以及赋值积木块。变量可以是角色 场景 砖块或者是其他参数。

    _images/var1.png
  2. 使用变量

    _images/var2.png
    • 变量:返回变量值

    • 给变量赋值:将变量设为输入值,可以是数字,也可以是其他变量。

    • 修改变量:修改变量值,变化大小可以是数字,也可以是其他变量

数学
  1. 加 减 乘 除,返回两个数加减乘除之后的结果

    _images/math1.png
  2. 取余,返回两个数相除的余数

    _images/math2.png
  3. 比较两个值的大小,返回两个值中的较大值或者较小值

    _images/math3.png
  4. 取绝对值,返回数字的绝对值

    _images/math4.png
  5. 平方根,三角函数

    _images/math5.png
  6. 数值修约

    _images/math6.png
  7. 选取随机数,返回一个介于最小值(包含最小值)和最大值(包含最大值)之间的伪随机数。如果两个数字都是整型,则结果也是整型。

    _images/math7.png
  8. 约束一个数字在一个范围内。

    _images/math8.png
  9. 将数字从一个范围映射到另一个范围,即“自低”值会映射到“至低”值,“自高”值会映射到“至高”值,以前范围内的值会映射到新的范围。

    _images/math9.png
Arcade 游戏课程
零基础入门
教程介绍

这是我们新的教程专题栏目——Makecode Arcade初级编程教程,旨在由浅入深深度讲解图形化积木块的含义,类型, 以及积木块在游戏中的使用方法,来理解图块化积木块的运用,尝试独立制作游戏,培养同学们的编程思维能力。

适合年纪:8岁+

课前准备
  1. 上网电脑

  2. Xtron掌机

课程目标
  1. 了解Makecode Arcade

  2. 在模拟器以及Xtron中体验社区游戏

  3. 创建游戏项目,了解项目结构

  4. 分享游戏

什么是Makecode Arcade ?

MakeCode Arcade,是微软发布的一个基于网页且对初学者友好的程序代码编辑器,开发者可以使用图形化模块或 JavaScript编程游戏,在玩游戏中学会编程。

网址: https://arcade.makecode.com

TIPS:无需安装软件,无需注册,只需要一台电脑登录MakeCode arcade编程网页即可编程。

进入编程环境,体验游戏

我们通过Arcade网站首页的积木块游戏来了解一下编程环境的各个部分。

1.打开编程网址首页,如果你是第一次使用Arcade,显示的是默认的英文, 你可以点击右上角的设置,选择语言,切换成你想要的语言。

_images/1.gif

2.滚动鼠标,找到【积木块类游戏】, 点击【Falling Duck】打开示例。

_images/2.gif

编程环境

_images/3.webp

3.在左边的模拟器上,你可以体验一下游戏的效果。点击任意按键开始游戏,每次按键按下之后,duck会往上跳动一次, 顺利穿过一个树桩得分+1。

_images/4.gif

TIPS:你编写的游戏实时效果会在模拟器上展示,你可以实时的调试和优化自己的游戏。

4.平台中间的工具箱中,有编程所需要的积木块,拖动积木块到代码区来实现游戏中的功能,工具栏中包含精灵,控制器, 游戏,音乐,场景,游戏信息,循环,逻辑,变量,数学等等类别的积木块,在后期的教程中,会通过游戏带同学们熟悉各个 积木块的使用方法。

5.平台右边的代码区,你可以看到方块中对应的积木块的图形化代码,点击切换成【{}JavaScript】,你可以看到对应的JS 代码。

_images/5.gif

TIPS:在Arcade平台上,你可以通过积木块编程入门,将积木块放到工作区来构建程序,当学生具备一定基础时,再进阶到JS 编程,逐渐锻炼你的逻辑思维以及增进你的编程技巧。

项目下载到Xtron

1.Xtron处于关机状态,把Xtron用USB连接到电脑上,屏幕显示如下的F4图案,如果屏幕显示的不是这个图案,那么按下Xtron 的【RST】按键。

_images/6.png

2.点击左下角的【下载】按键,选择Ovobot Xtron。

_images/7.gif

3.找到刚才下载的.uf2 文件,右击鼠标,选择发送到Xtron。

_images/8.gif

4.现在我们可以在Xtron上体验这个游戏了。

_images/9.png
新建项目,制作游戏

体验完社区游戏之后,我们要开始自己的游戏编程。首先,我们需要新建一个项目。

1.回到主页,点击【新建项目】,为项目起一个名字。

点击创建进入编程环境,代码区默认有一个当开机时积木块。

_images/10.gif
2.现在,我们来创建一个游戏角色,这里我们称为精灵。

精灵工具箱中选择将mySprite设为精灵类型Player积木块放到当开机时内部。

_images/11.png
3.给精灵设置精灵名字,形象和类型。

▲ mySprite为精灵的名字,你可以为精灵自定义一个想要的名字。下拉mySprite选择重命名变量设置一个精灵名字,比如“玩家”,“炸弹”,“敌人”,“披萨”等等。

_images/12.png

▲ 精灵后面灰色框点击进入绘制精灵页面,精灵的形象可以点击最上方的编辑器自己绘制精灵形象,也可以点击图库选择资料库中的精灵形象。

编辑器自己绘制精灵形象:

_images/13.png

图库中选择资料库中的精灵形象:

_images/14.png

▲ 选择任意一个喜欢的精灵形象,点击完成,就可以在模拟器上看到精灵啦!

_images/15.png _images/16.png

▲ 精灵的类型有Player(玩家),Projectile(弹射物),Food(食物),Enemy(敌人),还可以自定义添加精灵类型。

_images/17.png
4.添加使用按键控制精灵移动

▲ 控制器工具箱中选择使用按键移动mySprite积木块到创建精灵积木块下方。

_images/18.png

▲ mySprite下拉选择玩家。

_images/19.png
5.现在在模拟器上的精灵可以通过键盘或鼠标来控制其移动。

同样,我们也可以把自己的项目下载到Xtron中。

_images/20.png
保存项目
1.下载项目文件

点击编程网页中的下载,弹出硬件选择窗口,我们选择Ovobot Xtron,下载的游戏文件保存到下载文件夹中。

_images/21.png

如果想继续编程该游戏,打开makecode Arcade网站,首页选择导入-导入已下载的游戏文件继续编程。

_images/22.png _images/23.png

TIPS:这种保存文件方式即可以用于导入到硬件体验游戏又可以保存到电脑中以便下次继续编程。

2.发布游戏链接

除了下载,你还可以用分享的方式向朋友展示你的作品。点击【发布项目】,会生成一个项目链接,通过这个链接, 你的朋友可以访问到你的作品,并且可以在他的电脑上编辑你的程序。

_images/24.gif

TIPS:这种保存文件方式可以通过分享链接的形式分享给你的朋友或者发布在社交平台让他人可以访问到你的游戏作品, 但不能用于硬件。

3.保存项目文件png格式

编程区选择最下方保存按钮,保存PNG格式,下次继续编程时将其导入或拖动到编辑器中以重新加载游戏。

_images/25.png _images/26.png

TIPS:这种保存文件方式适合保存游戏在电脑中以方便继续编程。

制作姓名牌
教程介绍

上节课我们用素材库的形象创建了精灵,同时也讲解了编辑器可以绘制想要的精灵形象。在这一节课,让我们化身为小小 设计师,利用图形编辑器来绘制图形,制作自己的姓名牌。这是我们新的教程专题栏目——Makecode Arcade初级编程教 程,旨在由浅入深深度讲解图形化积木块的含义,类型,以及积木块在游戏中的使用方法,来理解图块化积木块的运用, 尝试独立制作游戏,培养同学们的编程思维能力。

游戏名称:小小设计师

目标:绘制自己的姓名牌

重点知识:图像编辑器的使用

课前准备

图形编辑器等于我们绘画所准备的画板,画笔,橡皮擦等工具,在图形编辑器里,可以充分发挥想象力和创造力去绘 制喜欢的形象,那么图形编辑器中每个工具具体怎么使用呢?

_images/name1.webp

这节课我们会讲解图形编辑器中的工具使用方法以及利用图形编辑器来为自己的姓名牌设计背景和形象。

在进入到新的班级认识新同学时,老师会让同学们做个自我介绍或者贴个姓名牌在座位上,可以帮助大家尽快熟悉起来, 很多小朋友也手工制作过这样的姓名牌吧👇👇👇。

_images/name2.webp _images/name3.webp

在Arcade中,我们可以用编程的方式将姓名牌编写到游戏掌机中,做一个独一无二的酷炫姓名牌。

步骤分解
  1. 加载背景颜色到场景并设置一个基础背景色。

  2. 加载游戏背景图片到场景,编辑器工具介绍。

  3. 绘制游戏背景图片,在背景中添加姓名,卡通元素。

动手实践

1.加载背景颜色到场景并设置一个基础背景色

👉浏览器输入网址:

https://arcade.makecode.com/

新建项目取名“小小设计师”。

_images/name4.png

👉场景工具箱中托取设置背景颜色为积木块到当开机时内部。

_images/name5.png _images/name6.png

👉点击灰色框选择一个喜欢的背景颜色。

_images/name7.png

2.加载游戏背景图片到场景,编辑器工具介绍

👉场景工具箱中选择设置背景图片为积木块到当开机时内部,设置背景颜色积木块下方。

_images/name8.png

👉点击灰色框进入图形编辑器界面,绘制像素化图形。

像素画是一种以像素为基本单位来制作的电脑绘图表现形式,是在视觉上由很明显的一格格的像素拼凑而成的栅格化艺术形式,和马赛克以及十字绣有相似之处。

Arcade中图形编辑器采用的是16色的像素图块来绘制图形,像素化图形操作简单,不需要太多的美术基础也可上手绘制。

背景图形编辑器使用介绍

_images/name9.png _images/name10.webp

TIPS:按住Alt键调用吸取颜色工具,可吸取画布中的颜色。点击完成保存图形,不想保存点击图形编辑器外任意位置即可返回。

👉绘制姓名牌

编辑器的各个工具介绍好了,下面就是同学们动手实践操作的环节了,同学们可以先在本子上手绘一个姓名牌草稿。

以老师制作一个姓名牌为例

构思姓名牌的构成:

边框,姓名,卡通形象

实施步骤:

1.设置背景颜色

2.设置背景图形(边框+姓名)

3.创建精灵

4.设置精灵位置

老师在背景图形编辑器中制作的姓名牌:

_images/name11.webp

创建精灵积木块中的图库中选择一个精灵形象:

_images/name12.png

设置精灵位置:

_images/name13.png

屏幕显示效果:

_images/name14.png

TIPS:创建精灵的图形编辑器和创建背景图形编辑器一样,同学们可以自己绘制,也可以在图库中选择,当然你还可以先选择图库中的精灵形象,在此基础上修改精灵形象变成自己喜欢的精灵。

下面就请同学们动手尝试制作一个自己的姓名牌吧!绘制好满意的姓名牌后,将程序下载到Xtron体验。

_images/name15.png
猫吃鱼
教程介绍

上节课我们设计了姓名牌,知道怎么使用图片编辑器,可以自己设计精灵和背景。这节课我们要学习的是设置精灵的位置 和速度,以及逻辑条件语句在图形化编程中的使用方法。通过制作猫吃鱼的游戏来介绍新积木块的含义,在游戏编程场景 中的运用。

课程目标

▪设置精灵的位置

▪设置使用按键控制精灵的速度

▪使用逻辑判断条件

游戏步骤

▪创建精灵

▪设置精灵位置

▪显示精灵位置和速度

▪控制猫咪移动,设置移动速度

▪猫咪显示在屏幕中

▪设置猫吃到鱼的判断条件

▪添加“游戏胜利”积木块

▪添加当游戏更新事件

STEP 1 创建精灵

【编程操作①】:打开网页,创建项目,项目名字“猫吃鱼”。

_images/cat1.png

【编程操作②】:创建小猫咪的精灵积木块命名为“猫咪”,类型选择Player(玩家),创建鱼的精灵积木块命名为“鱼”,类型选择Food(食物)。

_images/cat2.png

我们可以看到在模拟器上,两个精灵是重叠在一起的,这是为什么呢?

_images/cat3.png

这是因为精灵在一开始创建的时候,默认的出现的位置都是在屏幕的中央,那怎么让精灵出现在不同的位置呢?

我们可以使用精灵工具箱中的“设置精灵位置”积木块。

STEP 2 设置精灵位置

📌积木块位置:精灵-物理-设置mySprite的位置为xy

_images/cat4.png

💡积木块含义:

X表示水平方向的数值,屏幕最左侧为0。

Y表示竖直方向的数值,屏幕最上方为0。

使用X轴坐标数值和Y轴坐标数值来确定精灵位置,这里就涉及到了在游戏中设置精灵位置用到的坐标。

生活中二维平面来确定位置,基本都是根据横向位置和竖向位置来确定的,比如电影院的座位,第几排第几座。

_images/cat5.png

将屏幕放在二维坐标系中,坐标显示如下👇。

_images/cat6.png

“设置mySprite位置为xy”积木块中的X就是我们的屏幕宽度,Y就是我们的屏幕高度,我们点击“设置精灵位置”积木块后面的参数,下方会出现一个滑杆。拖动滑杆,X(宽度)的范围是0-160。Y(高度)的范围是0-120。在拖动滑杆的过程中,下面对应的高度和宽度的直线也在变化,两条直线的交点位置就是精灵在屏幕中的位置。

_images/cat7.gif

通过拖动滑杆,我们知道了屏幕的坐标是什么范围以及对应的位置在哪里。

知道了屏幕的坐标值,我们给鱼设置一个位置值。

【编程操作③】:拖动“设置mySprite的位置为XY”积木块到当开机时内部,设置精灵积木块下方。mySprite下拉选择鱼,位置值X=20 Y=30。

_images/cat8.png

现在鱼和猫咪在不同的位置了。

_images/cat9.png

STEP 3 显示精灵位置和速度

我们有一个积木块可以显示精灵位置坐标和速度。

📌积木块位置:精灵-特效-设置mySprite保持在屏幕中标志为关

_images/cat10.png

💡积木块含义:

用于更改精灵在屏幕上的反应方式的设置。

保持在屏幕中:精灵不能超过屏幕,到达边缘将被迫停留在屏幕

变为幽灵:精灵永远不会与其他精灵重叠,也不会与障碍物碰撞

自动销毁:精灵离开屏幕时会自动销毁

碰到墙壁时销毁:精灵与墙砖碰撞时会自动销毁

碰到墙壁时反弹:精灵与墙砖碰撞时会反弹回来

显示坐标与速度:精灵将在其下方显示其位置,速度和加速度

不可见:精灵不会被显示到屏幕上

相对于镜头:精灵是相对于镜头的,并且该精灵永远不会与其他精灵重叠或与障碍物碰撞

_images/cat11.png

【编程操作④】:精灵工具箱中选择“设置mySprite保持在屏幕中标志为关”积木块到当开机时内部。

【编程操作⑤】:我们分别为猫咪和鱼设置一下显示坐标与速度,标志为开,看看屏幕上的显示坐标和我们设置的是不是一样。

_images/cat12.png _images/cat13.png

STEP 4 控制猫咪移动,设置移动速度

我们需要让小猫移动,这样才能吃到鱼。移动精灵我们使用“用按键移动精灵”积木块。

【编程操作⑥】: 拖取“使用按键移动mySprite积木块”到当开机时内部,“显示坐标和速度”积木块下方。

_images/cat14.png

移动猫咪的过程中,我们发现:

向上移动的时候,速度显示的是V 0,-100

向下移动的时候,速度显示的是V 0, 100

向左移动的时候,速度显示的是V -100,0

向右移动的时候,速度显示的是V 100,0

V(速度)后面第一个值是X轴的速度值,大于0是X轴正方向的速度,也就是向右移动的速度,小于0是X轴反方向的速度,也就是向左移动的速度。

同样的,V(速度)后面第二个值是Y轴的速度值,大于0是Y轴正方向的速度,也就是向下移动的速度,小于0是Y轴反方向的速度,也就是向上移动的速度。

_images/cat15.gif

为什么这个值是100呢,积木块后面加号可以设置移动的速度,我们点击“使用按键移动”积木块后面的+号,可以看到vx vy默认是100。

【编程操作⑦】:点击加号,修改速度数值,我们修改vx和vy为150。

_images/cat16.png

修改之后,按下按键的时候,屏幕上显示的速度就变成了我们设置的值。感受一下,不同的速度值,精灵移动的时候有什么不同。

STEP 5 设置猫咪显示在屏幕中

我们发现,在控制猫咪移动的时候,猫咪可以移动到屏幕外,我们给猫咪做一个限制,限制在屏幕内移动。

【编程操作⑧】:拖取“设置mySprite保持在屏幕中标志为关”积木块到当开机时内部的最下方,mySprite选择猫咪,标志打开。

_images/cat17.png

STEP 6 设置猫吃到鱼的判断条件

接下来我们就要让小猫咪去抓鱼啦!

怎么确定猫咪抓到鱼了呢?

我们可以在屏幕上看到猫咪和鱼的坐标,当猫咪和鱼的坐标一样的话,我们就认为猫咪抓到鱼了,游戏胜利。

解读一下这个规则,我们需要判断喵咪的X坐标=鱼的X坐标,并且猫咪的Y坐标=鱼的Y坐标。当满足这个条件时,游戏胜利。

这里就涉及到了逻辑工具箱中的“判断条件”积木块,“比较”积木块,“布尔值”积木块以及积木块的叠加。

逻辑工具箱中的积木块是我们在编程游戏时经常会遇到的,我们通过猫吃鱼的游戏来讲解其中的积木块的使用方法。

_images/cat18.png

带有卡槽的积木块可以与带有卡槽的积木块上下搭建。

但是必须要在嵌入到开口类型的积木块内部才能够运行。

_images/cat19.png

不带卡槽的菱形/圆形的积木块可以替换其他积木块中的一些特定的菱形框/圆形框。

_images/cat20.png

Tips:有些积木块虽然可以替换但是不能运行,当程序提示错误时,就需要检查积木块的叠加是否正确。

拆解好规则,我们从外往里搭建积木块。

判断条件:

在游戏中,经常需要使用到“判断条件”积木块,比如玩家到达某一处,就能开启一项技能,满足什么条件,就可以获得一个装备等等。在猫吃鱼的游戏中,需要判断当猫的坐标和鱼的坐标一样,就代表猫吃到了鱼。

使用判断条件,判断为true(真),运行内部程序,在游戏中需要判断猫咪和鱼的坐标位置一致。

📌积木块位置:逻辑-条件-如果为true则

_images/cat21.png

💡积木块含义:

“如果为true则”积木块作为“判断条件”积木块,程序会做一个判断,只有当判断为true时,才运行积木块内部的程序。这里的true可以替换为其他条件,如变量与变量之间的比较,以及变量与值之前的比较等等。

打开逻辑工具箱中的“如果为true则”积木块到代码区任意位置,我们来看看这个积木块的使用方式。

_images/cat22.png

点击加号出现否则,否则内部可以嵌入积木块。

_images/cat23.png

这样就出现了两个判断条件,一个是true(真),一个是否则,即是false(假)。当判断到true,运行true内部程序,判断不是true,则运行否则内部的程序。

继续添加加号,可以不断为程序增加判断条件。

_images/cat24.png

true作为条件可以替换成工具箱中的其他条件。

比如控制器中的“当按键被按下”积木块。

_images/cat25.png

游戏中的“询问”积木块。

_images/cat26.png

逻辑中的“比较”和“布尔值”积木块(最常见)。

_images/cat27.png

【编程操作⑨】:拖取“如果true则”积木块到代码区任意位置。

判断条件积木块设置好了,游戏中两个条件为并列关系,猫咪的X轴=鱼的X轴和猫咪的Y轴=鱼的Y轴,将并列关系积木块替换判断条件中的true。

“与”积木块

这时候需要使用到逻辑工具箱中的布尔值“与”积木块。

📌积木块位置:逻辑-布尔值-与

💡积木块含义:

对其他类型(数字,字符串)进行选择出的值。

布尔值栏目中有三个菱形积木块“与”,“或”和“非”。

“A”与“B”:A和B两个条件为并列关系,必须同时满足才能运行。

“A”或“B”:A和B两个条件为或者关系,只需要满足一个就能运行。

非“A”:排除A这个条件,执行除此之外的其他条件。

_images/cat28.png

【编程操作⑩】:逻辑工具箱中选择“与”积木块替换条件工具箱中的“true”。

_images/cat29.png

“比较”积木块

猫咪的X轴=鱼的X轴,猫咪的Y轴=鱼的Y轴,需要用到“比较”积木块。

📌积木块位置:逻辑-比较-“=”

_images/cat30.png

💡“比较”积木块含义:

下拉“比较”积木块中的比较选项,有多种比较的选择。比较前后的两个圆形框可以使用其他积木块替代,在游戏中,我们替换成猫的X轴坐标和鱼的X轴坐标。

_images/cat31.png

【编程操作⑪】:拖取“=”积木块到“与”积木块的两个菱形框中。

_images/cat32.png

精灵坐标

📌积木块位置:精灵-物理-mySprite X

_images/cat33.png

💡积木块含义:

初始积木块的设置为:mySprite x,即精灵的X轴位置,“x”下拉出现有关精灵的不同选项。

_images/cat34.png

【编程操作⑫】:拖取“mySprite X”积木块到“等于”积木块的两个圆形框中,第一个精灵选择“猫咪”,第二个精灵选择“鱼”。

_images/cat35.png

【编程操作⑬】:同样的,判断Y坐标也是一样,点击右键选择重复复制此积木块,修改猫咪和鱼后面的选项为“Y”(Y轴坐标)。

_images/cat36.png

完整的的猫吃到鱼的判断条件图形化编程如下。

_images/cat37.png

STEP 7 游戏胜利

当程序判断到猫与鱼的坐标位置一致时,游戏胜利,将“游戏胜利”积木块拖取到“如果true则”积木块内部。

📌积木块位置:游戏-游戏内容-游戏结束

_images/cat38.png

💡积木块含义:

“游戏结束”积木块后面加号可以选择游戏获胜和游戏失败。再点击加号,可以为游戏结束时添加特效,下拉有丰富的特效可供选择。

_images/cat39.png

当运行“游戏结束”积木块时,游戏停止,屏幕会出现游戏胜利/游戏输了,继续按控制键,将重新进入游戏。

【编程操作⑭】:拖取“游戏结束”积木块到“如果为true则”积木块内部,点击加号,选择获胜,并为游戏获胜添加特效

_images/cat40.png

STEP 8 添加当游戏更新事件

把“如果true则”积木块拖到当开机时内部,会发现,当猫咪吃到鱼时,游戏并没有提示胜利,这是为什么呢?

因为我们把判断条件放在开机时内部,这样的话只会判断一次。

我们一开始的时候没有达到这个条件。

怎么才能不停的判断呢?

这里需要将“如果true则”积木块放置到“当游戏更新时”积木块的事件当中运行

当游戏更新时

📌积木块位置:游戏-游戏内容-当游戏更新时

_images/cat41.png

💡积木块含义:

每次游戏更新,都会去执行里面的程序,我们游戏是不断更新的,中间的间隔时间非常短可以忽略不计,所以你可以理解为这个积木块是无限循环积木块。内部的积木块是伴随着整个游戏运行的。

【编程操作⑮】:拖取“当游戏更新时”积木块到代码区任意位置,将”如果则”积木块拖取到”当游戏更新时”积木块内部。

_images/cat42.png

现在来试一下吧!

_images/cat43.webp
扩展游戏

加上倒计时

猫吃到鱼并不难,但是如何让猫在规定的时间内吃到鱼呢?找一找工具栏中什么积木块是可以运行倒计时的?

优化猫吃鱼

在移动猫咪时,要让猫咪和鱼坐标完全相同有点困难,有时候喵咪已经碰到鱼了,但是坐标不同所以游戏没有胜利,怎么改进?

优化游戏
教程介绍

上节课我们制作了小猫抓鱼的游戏,在玩游戏中,可以发现游戏中有很多可以优化的地方。在这节教程中,让我们带着问 题,从提高游戏有趣性出发,去体验游戏,发现问题,解决问题,通过不断的调试猫吃鱼游戏的代码,来制作一个高品质 的小游戏。在这个过程中,我们也会同时介绍新的积木块的使用方法。

当然,对游戏本身的追求没有终点,我们一直在路上。

发现问题

在上一节的课程中,我们是通过小猫和鱼的坐标是否一样,来判断小猫有没有抓到鱼。但是在玩游戏的时候,我们会发 现,因为每次按键移动的坐标幅度不是1,所以想要坐标完全一样确实有点困难。有没有一个方法,可以让小猫碰到鱼就 算获胜呢?

解决问题

这节课给大家介绍一个新的方法—精灵重叠事件。

📌积木块位置:精灵-重叠-当sprite类型与otherSprite类型Player重叠时

_images/optimize1.webp

💡积木块含义:当一个精灵与另一个精灵重叠时,运行事件内部的积木块,只要两个不同类型的精灵有重叠的部分,那么就会 触发这个事件。

如何来确定想要的两个精灵重叠呢?

在上节教程《猫吃鱼》游戏中,创建了两个精灵,我们已经为猫选择Player(玩家)类型,为鱼选择Food(食物)类型。

在设置类型的时候同学们可能会有疑惑:

为什么要选择精灵类型?这是因为在一些事件中,是通过选择精灵的类型来指代精灵的。比如精灵重叠事件,通过选择精灵类 型来指代精灵。

TIPS:完整的游戏经常会有不同类型的精灵重叠事件,因此在创建精灵的时候,就应该将精灵类型设置好以防止后期精灵太多 造成程序混乱。

在《猫吃鱼》游戏中,猫类型选择为Player(玩家),鱼类型为Food(食物),那么在重叠事件中的类型,猫吃到鱼重叠事 件,应该是Player(玩家)与Food(食物)重叠。

🎮编程操作①:将“当sprite类型Player与otherSprite类型Player重叠时”积木块拖取到代码区任意位置。修改默认的精灵 类型,将otherSprite类型的“Player”下拉选择“Food”。

_images/optimize2.webp

🎮编程操作②:我们把“游戏获胜”积木块放在重叠事件内部。

_images/optimize3.webp

来试一下我们改进之后的游戏吧。

_images/optimize4.gif

这个游戏虽然简单,但是它已经是一个完整的游戏了。有角色,有游戏规则。

发现问题

当然一个游戏的趣味性以及挑战性也很重要,这个小猫抓鱼的游戏,我们很容易就可以获得胜利,玩几次可能就没有兴趣 了,怎么来增加游戏的挑战性呢?

解决问题

创建敌人精灵-幽灵

作为刚接触游戏编程的同学们,在设计游戏的时候,可以从玩过的游戏中寻找灵感。

游戏产业初创时期的街机游戏往往蕴含着游戏规则的经典模式,说到对街机游戏的初印象,那“吃豆人”游戏一定占有举足轻重的位置,我们可以从吃豆人游戏中寻找灵感。

_images/optimize5.gif

吃豆人游戏

日本时间1980年5月22日,游戏公司南梦宫(Namco)推出了一款有史以来最为成功的街机游戏——吃豆人。它在同年10月经由Midway 公司引入美国后,迅速成为一款能够被各种人群喜爱的全民游戏。

在今天看来,吃豆人除了吃,就是被追着满屏幕乱跑,似乎算不上什么魅力主角。但在上世纪八十年代,他绝对是个开创性的存在。

吃豆人游戏中,玩家每关都会被四个颜色不一的幽灵追赶,而这红粉青橘四种颜色的四个幽灵其实都有不同的“个性”。在游戏开发者岩谷徹的设计中,红色幽灵性格火爆,总是会紧紧栓着玩家跑;粉色幽灵老谋深算,会埋伏在玩家可能经过的路线上;青色幽灵自由散漫,时而追着玩家跑,时而视而不见;橘色幽灵傻乎乎,总是瞎晃荡。

_images/optimize6.gif

拆解下吃豆人游戏模式:

吃豆人在吃豆子的时候,有一个幽灵会去追踪它,吃豆人要在吃豆子的同时躲避幽灵,如果被幽灵追上的话,游戏就失败了。

以吃豆人中的幽灵为灵感,这里我们也在游戏中增加一个幽灵的角色,并且这个幽灵会追踪小猫。

🎮编程操作①:将“创建精灵”积木块拖取到“当开机时”事件内部,为幽灵选择一个精灵形象,设置精灵类型为“Enemy”。

_images/optimize7.png

🎮编程操作②:设置精灵的初始位置X:141,Y:104 。

_images/optimize8.webp _images/optimize9.webp

怎么样可以让幽灵追踪小猫呢?

精灵工具箱中有一个精灵跟随积木块。

📌积木块位置:精灵-物理-设置myEnemy跟随mySprite

_images/optimize10.webp

🎮编程操作③:拖取精灵工具箱中“设置myEnemy跟随mySprite”积木块到“创建幽灵”积木块下方。myEnemy下拉选择“幽灵”,mySprite下拉选择“猫咪”。

_images/optimize11.webp

我们看看模拟器上的显示效果。

_images/optimize12.gif

我们会发现幽灵咻的一下就跑到了猫咪的身边,这么快的速度,这游戏没玩就挂了。。。

这显然在游戏中是不合理的,怎么去改变幽灵跟随的速度呢?

我们点击看看幽灵的初始默认值是多少?

🎮编程操作④:点开后面的+号,默认的速度是100,我们可以修改这个速度值,一边修改一边在模拟器上看效果,直到达到你想要的跟随速度。速度越大,游戏获胜越难。

这种一边实践一边发现问题的过程,我们称为调试。每一个优秀的作品,都是经过了很多次的调试和完善的哦!

加上幽灵之后,我们来完善一下游戏规则:

当猫咪抓到鱼,游戏胜利;当幽灵追上猫咪,游戏失败。

🎮编程操作⑤:幽灵追上猫咪,同样的也是使用重叠事件,同学们可以自己编写一下这个程序。

发现问题

到这里,我们为猫吃鱼游戏增加了一个敌人幽灵,使得游戏更加有挑战性,但是当猫吃到鱼或者幽灵追上猫,这个游戏就结束了,我们还可以继续增加游戏规则。

解决问题

增加游戏规则

在吃豆人的游戏中,在吃到豆子的时候,游戏得分会+1;吃豆人被幽灵追上,生命值会-1,吃豆人回到初始位置;当生命值等于0,游戏结束。

参考这个规则,我们把猫吃鱼游戏进阶版的规则修改如下:

1) 游戏对象(三个类型精灵):小猫(玩家类型) 小鱼(食物类型) 幽灵(敌人类型);

2)初始生命值和分数:小猫初始生命值为3, 游戏初始得分为0;

3)游戏规则: 小猫吃到鱼,得分+1,小鱼从其他位置再次出现;幽灵追到猫,生命值-1,小猫回到初始位置,生命值为0,游戏结束;

4)游戏目标: 小猫需要在游戏结束前尽可能抓到更多的小鱼。

游戏的基本框架已经完成了,接下来我们根据增加的游戏规则来继续完善游戏。

为玩家设置生命值。

📌积木块位置:游戏信息-生命值-设置生命值为3

_images/optimize13.webp

💡积木块含义:

为玩家设定一个初始的生命值,积木块默认生命值为3。

🎮编程操作①:将“设置生命值为3”积木块拖取到“当开机时”事件内部的最下方。

_images/optimize14.webp _images/optimize15.webp

设置初始分值为0。

📌积木块位置:游戏信息-得分-设置得分为0

_images/optimize16.webp

🎮编程操作②:拖取“设置得分为0”积木块到当开机时内部最下方。

_images/optimize17.webp

当猫吃到鱼时,得分加1。

🎮编程操作③:拖取“得分增加1”积木块到玩家和食物重叠事件中。

_images/optimize18.webp

TIPS:幽灵追到猫的时候,生命值-1。当生命值=0的时候,游戏会自动结束,所以我们不需要对生命值=0再做判断。

🎮编程操作④:拖取“生命值增加-1”积木块到幽灵和猫咪重叠事件内部。

_images/optimize19.webp

在模拟器试玩一下:

_images/optimize20.gif

通过模拟游戏可以发现:

小猫吃到鱼的时候,鱼没有消失,得分一下子增加很多,并不是+1;幽灵追上猫的时候,游戏一下子结束了,并不是生命值-1。

程序出现了Bug,我们来找一下,看看到底是哪里出现问题了呢?

出现这个Bug的原因是我们的精灵重叠积木块,只要精灵重叠在一起,就会不停的触发,然后执行内部的程序。

在游戏中,猫咪吃到鱼的时候,一直和鱼重叠在一起,并没有分开,所以我们的得分增加1这个积木块也一直被调用。幽灵追上猫也是同样的问题。

怎么解决这个问题呢?

我们可以在两个精灵重叠事件里,在运行增加得分或减少生命值之后,把两个精灵分开。

在猫和鱼重叠时,将鱼精灵的位置重新放置到屏幕的其他位置。

🎮编程操作⑤:拖取“设置猫咪位置”积木块到猫和鱼重叠事件内部,为鱼重新设置一个位置:X:80,Y:80,这样在屏幕上的效果就是鱼被猫吃了,在屏幕上又出现了另外一条鱼。

_images/optimize21.webp

我们在模拟器上试玩一下看看游戏效果怎么样:

_images/optimize22.gif

游戏又出现了一些问题:小猫第一次吃到鱼的时候,鱼到了80,80的位置,第二次小猫吃到鱼的时候,鱼还是在80,80这个位置。这样在屏幕上的效果就是第二次吃到鱼之后,鱼并没有消失,分数还是在一直增加。

想要的游戏效果是猫咪每次吃到鱼之后,屏幕中随机位置再次出现鱼,那有没有积木块可以设置让鱼从屏幕中随机出现呢?

工具箱中有可以为鱼的位置设置一个随机数的积木块。

屏幕的范围是X:0-160, Y:0-120,我们在选取坐标的时候也发现了,我们的X Y的值都是整数,也就是说我们的范围是X为0-160里面的任意一个整数,Y是0-120里面的任意一个整数。

📌积木块位置:数学-选取随机数,范围0至10

_images/optimize23.webp

🎮编程操作⑥:拖取“选取随机数,范围为0至10”积木块到XY数值框中,X轴范围选择0-160,Y轴范围选择0-120。

_images/optimize24.webp

我们来体验一下游戏效果看看:

_images/optimize25.gif

可以看到,每次猫咪吃到鱼,得分加1,鱼从屏幕随机出现。

同样的,我们来处理一下幽灵追上猫的重叠事件。

这里小猫被追上之后,位置变为初始值(80,60):

_images/optimize26.webp

在我们的不断调试,以及修改之后,小猫吃鱼这个游戏和之前的比起来,内容更加的丰富了,游戏规则也更完善。

_images/optimize27.png

不过,在小猫吃到鱼之后,设置精灵位置积木块这里还有一个小小的bug。当然,这个bug并不影响我们目前的游戏,但是如果我们的游戏更加复杂,可能就会有所影响。这个bug你能找到吗?

下次讲到变量的时候,我们一起来找bug吧!

课后作业

发挥想象力,改变里面的规则,做一个自己的小猫吃鱼,期待你们的表现!

“随机”应变
教程介绍

上节课我们在完善小猫吃鱼游戏的时候,在小猫吃到鱼之后,让鱼出现在屏幕的随机位置,增加了游戏的有趣性。

这里我们用到的是随机数,“随机数”积木块可以让我们得到一定数值范围内的一个随机的整数。

在游戏中,随机的设定随处可见。

比如精灵移动到任意位置。

_images/random1.gif

比如飞机大战中随机的出现的敌机等等。

_images/random2.gif

随机的存在,让游戏充满了不确定性,也让游戏更加的吸引人。

今天,我们就通过生成随机数,来做几个小项目。

首先我们一起来确认一下随机数积木块生成的数字到底是不是随机的。

项目一 验证随机数
项目目标

每次按下按键A,屏幕显示生成的随机数。多试几次,看看这个随机数是不是真的没有规律。

项目操作

1.首先我们需要创建一个变量,变量就是一个变化的量,在这个项目中就是随机数。

我们之前的游戏中,用到的得分和生命值在我们游戏过程中会发生变化,它们也是变量。我们当时没有创建“得分”和“生命值”变量,是因为在调用“得分”和“生命值”积木块的时候,内部已经帮我们创建好了。

而这次,我们需要自己创建一个变量。

📍点击变量工具箱中的设置变量,为我们的变量取名为:随机数。

变量创建完成后,我们可以得到3个积木块,从上往下依次是“变量值”积木块,“给变量赋值”积木块,“修改变量值”积木块。

_images/random3.png
  1. 我们需要在按键按下时,显示随机数。

    📍找到“当按键A按下”积木块拖取到代码区任意位置。

    _images/random4.png
  2. 为随机数这个变量设置数值。

    📍拖取将“随机数设为”积木块到“当按键A按下”积木块内部,设置的值为“生成随机数”积木块得到的数值。

    _images/random5.png

4.把随机数在屏幕上显示出来。

📍游戏工具箱中的“显现”积木块可以把里面的内容显示在屏幕的中间。拖取“显现”积木块到“将随机数设为”积木块下方。

_images/random6.png

📍我们把“随机数”变量积木块拖动到“显现”积木块后面的内容里。

_images/random7.png

但是我们发现这时候显现积木块前面有个黑色的感叹号,为什么会出现这种情况呢🤔?

因为显现后面的内容要求是字符串,而我们的随机数是一个数字,数字不能直接作为显示的内容。

怎么解决这个问题呢🤔?

5.将数字转化为文本。

📍点开工具箱中的高级,点击下方的文本工具箱,找到“将数字转为文字”积木块。这个积木块可以把数字转为文字,比如0->“0”, 1->“1”。

_images/random8.png _images/random9.png

现在,按下按键A看一下每次屏幕上显示的值,是不是一个随机的数呢🎮?

_images/random10.gif

有的同学说,这个就显示一个数字,我不解释的话别人不知道我做的是什么。既然今天介绍了“显示内容”积木块,那我们就把项目完善一下,让它显示的内容更加丰富,更有提示性。

📍首先,我们在一开始的时候,提示一下玩法,告诉别人:按下按键A生成随机数。

_images/random11.png

📍然后,在显示随机数的时候,显示:随机数为:**(随机数值)。

📍这个时候,我们显示的内容有两个,一个是“随机数为:“, 另一个是随机数的值。我们可以用文本中的“组合字符串”积木块,把这两个文本结合起来一起显示。

_images/random12.png

这样,第一个文本框中输入“随机数为”,第二个文本框中放入随机数变量。

📍在显示的时候,可以“将数字随机数转为文字”积木块拖取到第二个文本框,如下图显示。

_images/random13.png

📍你也可以直接用随机数的变量,如下图所示。

_images/random15.png

为什么可以直接用变量呢🤔?

因为组合字符串这个积木块可以自动的把数字转换为文字。

这下,我们显示的内容就比较完善了,让你的小伙伴也一起试试吧🎮!

_images/random16.gif
项目二 屏幕颜色变变变
项目目标

每次按下按键A,让我们的屏幕显示随机的颜色。

项目操作

1.首先,按下按键A,我们用“设置屏幕颜色”积木块来给屏幕设置一个颜色,颜色可以自己选一个,我选择了粉色。

_images/random17.png

这里我们看到,屏幕的背景颜色选择一共有16,怎么能从16个颜色中选择任意的一个颜色呢🤔?

2.我们一直都用的图形化编程,今天我们一起来看一下这个图形化程序对应的JavaScript语言是什么样子的。我们点击方块后边的{ }JavaScript来切换到JS语言。

_images/random18.png

对应的程序如下:

_images/random19.png

第一行:对应图像化程序中的当按键A按下积木块。

_images/random20.webp

第二行:对应设置屏幕背景颜色积木块,我们可以看到设置背景颜色积木块后面参数是3,也就是说3代表的是粉色。

_images/random21.webp

现在我们回到图形化程序中,把粉色改为橙色。

_images/random22.png

我们可以看到对应的JS程序中,设置背景颜色中的参数变为4。

_images/random23.webp

大家可以多改几个颜色,看一下对应JS程序中的参数是多少。

那么,如果我们想得到一个随机的屏幕颜色,是不是可以把背景颜色设为0-15的随机数呢🤔?

一起试一下!

3.我们把范围为0-15的”随机数“积木块放到设置背景颜色积木块中:

_images/random24.png

为了验证一下这个颜色是不是和数值相对应,我们可以同时把随机数值也显示出来。

_images/random25.png

4.当然,我们的程序要尽可能的做到完整,同样的,在一开始我们还是加上文字提示

_images/random26.png

好了,接下来下载到掌机中看一下效果吧🎮!

_images/random27.gif

下载到游戏掌机

_images/random28.png
总结

今天我们通过随机数的两个项目:

1 验证了随机数是不是真的随机的;

2 学习了怎么在屏幕上显示字符;

3 学习了数字转化成文字,以及组合字符串的使用;

4 了解了颜色的秘密,知道图形化程序和JS代码的对应关系。

精灵爱运动
教程介绍

之前的课程中,我们学会了创建精灵,用按键控制精灵移动,知道了判断,随机数这些概念,以及如何去设计完整的游戏规则。

_images/course6.1.png

在小猫抓鱼的游戏中,小猫是我们的玩家,是可以用按键来控制移动的。

而作为食物类型的小鱼精灵,在我们的游戏中没有自己做运动。但是在大多数的游戏中,除了玩家,别的角色也是有运动的。

怎么判断一个物体是在运动呢😕?

我们一般会用速度大小以及运动方向来描述一个物体的运动状态。

速度的大小也就是运动的快慢

如果速度V=0,那么我们认为这个物体是静止的。

_images/course6.2.gif

同样的如果速度不等于0, 我们认为这个物体是运动的,并且速度值越大,运动越快。

_images/course6.3.gif

运动是有方向的

我们会用前后左右或者别的表示方位的词来形容方向。

_images/course6.4.gif

在Arcade中,我们的方向有上(VY)下(VY)左(VX)右(VX),其中上下是Y轴方向的速度, 左右是X轴方向的速度。👇

_images/course6.5.png

接下来我们通过几个小项目来感受一下精灵的运动感吧!

项目一:运动会

🚩学校举办了一场运动会,在百米短跑的比赛中,每一组有3名运动员,我们一起看看3名运动员的表现吧。

_images/course6.6.png
  1. 创建3名运动员,并且让运动员们各自就位。👇

    _images/course6.7.png

2.运动员跑到终点就可以停下来了,我们设置运动员停留在屏幕中,这样在跑道终点(屏幕最右侧)的时候,运动员就能停下来。👇

_images/course6.8.png
_images/course6.9.png

一号运动员就位

运动员1号的特点呢,就是跑起来速度变化不大,基本就是匀速前进的。

我们用精灵工具箱-》物理模块-〉设置精灵速度积木块来设置1号运动员的速度。

因为运动员需要在自己的跑道上跑,我们比赛是从左边跑到右边,是横向运动,所以Y的速度Vy设为0, X的速度Vx我们设为20看一下效果。👇

_images/course6.11.png

我们看到运动员1号匀速的从起点跑到终点。👇

_images/course6.12.gif
_images/course6.13.png

2号运动员就位

运动员2号的特点呢,就是一开始速度比较慢,但是他加速特别快,就像一个小火箭一样,越跑越快。

这里呢,要给大家介绍一下加速度的概念,加速度描述的是速度改变的快慢。

生活中我们最常见的加速度就是重力加速度,我们知道在高处是不能往下扔东西的,因为一旦有东西从高处掉落,它的速度会越来越快,如果砸到人的话,后果非常严重。

这里呢,我们给运动员2号设置一个加速度。

我们用精灵工具箱-》物理模块-〉设置精灵的值(位置 速度 加速度)积木块。👇

_images/course6.14.png

同样的这个积木块还可以设置精灵的速度值。👇

_images/course6.15.png

之前我们用“设置精灵速度”积木块来设置速度,两者的区别就是“设置精灵值”积木块一次只能设置一个值,而“设置精灵速度”积木块可以同时设置X Y的速度。👇

_images/course6.16.png

现在我们看到1号运动员一开始速度快,2号相对落后,但是2号慢慢加速之后超过了1号,最终先到达终点。👇

_images/course6.17.gif

但是如果修改1号速度值或者2号的加速度值,我们发现2号并不是一定就会胜利。

比赛路程,两个选手的速度,2号选手的加速度都会影响比赛的结果。

那加速度和速度的区别是什么呢?

1)加速度描述的是速度改变的快慢,速度描述的是位置改变的快慢。

2)加速度是速度对时间的变化率,速度是位置对时间的变化率。

_images/course6.18.png _images/course6.19.png

也就是说,速度越快,一定时间内变化的位置更长;加速度越快,一定时间内速度变化的越快。

_images/course6.20.png

三号运动员就位 刚才我们的1号运动员和2号运动员的特点其实都是稳定,1号呢速度很稳定, 2号呢是加速度很稳定。但是我们的3号选手就有点特别了,他跑的时候会加速,但他的加速是一开始慢慢加,到了后面会冲刺,速度变化比之前更快。

怎么让速度变化更快呢?

我们可以改变加速度的大小,加速度越大,速度变化越快。

我们用精灵工具箱-》物理模块-〉改变精灵的值(位置 速度 加速度)积木块。👇

_images/course6.21.png

因为这个加速度的变化是不断增加的,所以我们可以加上一个循环,每隔1S的时间,加速度增加5。

使用游戏工具箱中的“当游戏每隔多长时间更新”积木块:👇

_images/course6.22.png

现在我们可以看一下3个运动员的比赛发挥:

1号一开始领先,2号随后,3号是最慢的,但是经过一段时间,2 3 号慢慢赶上并且超越了1号,最终是3号赢得了比赛。👇

_images/course6.23.gif

这个游戏呢也告诉了我们一个道理,一开始的落后并不要紧,抓紧赶上,还是有机会胜利哦!

运动会结束了,不同运动类型的几个积木块我们也介绍了,运动中还有一个跟随的技能,这个我们在小猫捉鱼这节课里也介绍过了。

接下来我们要介绍一个新的技能,就是弹射物。

我们在游戏中经常会看到一些场景,比如发射子弹进行攻击,打怪时掉落一些技能或者装备,这些呢都可以用弹射物来实现。弹射物字面上的意思就是一样东西被弹射了出去。

下面我们通过下雨天这个项目来了解一下弹射物。

项目二:下雨天

🚩模拟下雨天的场景,云朵从屏幕左边慢慢移动到屏幕右侧,移动过程中不停的有雨滴从云朵上滴落下来。

我们把项目分解成下面的一些步骤:

  1. 首先我们要创建一个云朵,并且放在屏幕的左侧。👇

    _images/course6.25.png
  1. 让云朵从左往右慢慢移动。👇

    _images/course6.26.png
  2. 先让一滴雨滴从云朵上滴落。

雨滴可以当作是从云朵上弹射出去的弹射物,我们的弹射物也是精灵,是弹射物类型的精灵。

选择 精灵工具箱-》弹射物模块-〉将精灵设为弹射物从另一个精灵上以一定速度弹射出去积木块。

_images/course6.27.png

1) 这里弹射物精灵我们重命名为雨滴,设置雨滴的形象。

2) 雨滴是从云朵上弹射出去的,所以另一个精灵选择云朵。

3) 雨滴是垂直向下滴落,vx=0, vy我们设为10。

完整设置如下。👇

_images/course6.28.png

现在我们可以看到雨滴从云朵上弹射出去了。👇

_images/course6.29.gif

接下来让很多雨滴从云朵上滴落。

游戏每隔一段时间更新积木块,可以实现我们的想法,这样雨滴就是不断的从云朵上滴落了。👇

_images/course6.30.png

模拟器效果👇

_images/course6.31.gif

但是现在的效果看起来并不逼真。有两个地方效果不好:

1) 雨滴一直都从云朵的一个位置滴落下来,云朵比较大,实际的雨滴应该是从云朵的任意一个位置滴落的。

2) 现在看到的雨滴是穿过了白云滴落下来,实际上我们看到的雨滴应该是从白云的最下方滴落的,白云内部我们看不到。

一起来完善一下吧。

首先是滴落的左右位置,默认是从云朵中间滴落的,我们想要的效果是从云朵内部随机位置滴落,那么就需要设置雨滴的滴落位置,即X的数值。

选择精灵-》 物理-〉改变mySprite的X以积木块。

_images/course6.32.png

一开始的雨滴只能从云朵中心滴落,雨滴X的位置就是云朵的X位置,即云朵的中心位置。现在雨滴可以在云朵的边际内自由滴落。我们来看看雨滴可以向左和向右各走多少步吧。云朵宽度是16,雨滴在云朵中间,那么就可以向左走八步,向右走八步。

把云朵的中心设为0的话,云朵的边缘X坐标是-8~8。👇

_images/course6.33.png

为了效果好一点,除去最边缘的情况,我们把雨滴滴落的X范围设为:弹射时的雨滴X-7至X+7。用这个范围的值来改变雨滴的X值,并且用随机数来达到雨滴随机滴落的效果。👇

_images/course6.34.png

接下来是雨滴滴落的初始高度,和刚才一样,雨滴的Y=云朵的Y值,也就是云朵中心的Y坐标,想要雨滴从底部滴落的话,我们需要把雨滴的Y坐标加上云朵中心离底部的距离(不同大小的云朵不一样,需要根据自己的云朵大小修改)。👇

_images/course6.35.png

现在看一下,这个小雨天的效果是不是更逼真了?

_images/course6.36.gif
总结

这节课我们介绍了精灵的运动,学会去设置以及改变精灵的位置,速度和加速度,并且了解了弹射物精灵的创建和用法。

希望接下来的游戏设计中,大家可以更好的去运用精灵的运动,让游戏更加出彩!

问答考验

速度和加速度的区别是什么?

解析: 1)加速度描述的是速度改变的快慢,速度描述的是位置改变的快慢。 2)加速度是速度对时间的变化率,速度是位置对时间的 变化率。

加速度大,速度值一定就大吗?

解析:不一定,加速度大只能表示速度变化的快,不能说明速度的值就更大。

改变速度大小10,和设置加速度值为10,是不是一样的?

解析:不一样,速度和加速度都是和时间相关的,加速度是速度对时间的变化率,在不同的时间内改变同样的速度值,加速度大小也是不同的。

弹射物精灵的类型是什么?

解析:第二个,弹射物类型。

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

THANKS!

_images/course6.37.gif
太空大战
教程介绍

之前的课程中我们介绍了显示文本积木块,弹射物的使用和设置精灵的运动,这节课,我们来举一反三,利用学过的积木块来制作一个经典游戏-飞机大战。

_images/course7.1.gif
游戏机制
  1. 屏幕上方不断射出随机位置的飞机,我们称之为敌机,生命初始值3,初始得分0,如果被敌机攻击中了,则生命值减1,如果击中敌机,则得分加1。

  2. 我们玩游戏时,则需要在躲避敌机的同时去击落敌机,来获取更多的分数。

看到这个游戏机制,脑子里是不是立刻有了一些积木块的作用机制的回忆?

我们一起来编程一下!

创建太空战机

首先,创建一架太空战机,并将太空战机的初始位置放置到屏幕中间的最下方。

_images/course7.2.png

这个时候看到模拟器上只有太空战机的头出现在了屏幕的最下方中心上,这是为什么呢😕?

_images/course7.3.png

因为我们设置的精灵位置,默认设置的是精灵中心的位置。如何将整个精灵都位于屏幕中呢?可以调用“精灵保持在屏幕中”积木块。

_images/course7.4.png

刷新模拟器看看!

用按键来移动战机,并为战机设置一个合适的移动速度。

_images/course7.5.png
设置初始值

设置初始生命值为3和得分为0。

_images/course7.6.png
创建子弹

按下按键A发射子弹。这里的子弹是从太空战机里发出的,子弹也就是弹射物,子弹的发射是一个向上的运动。我们可以回忆下之前“下雨天”和“运动会”游戏项目中弹射物和精灵的运动的设置来设置子弹。

_images/course7.7.png
创建敌机

游戏中敌机的设定是按照一定的频率自上而下随机出现的,因此需要在“当游戏每隔()毫秒更新时”事件积木块中放置敌机精灵,并绘制敌机形象和设置敌机类型。

_images/course7.8.png

模拟器中可以看到屏幕中间出现了敌机,下面我们来设置敌机的运动。

敌机自上而下随机出现,首先设置敌机的初始位置为屏幕最上方的随机位置。

_images/course7.9.png

设置敌机的速度,VX为0,VY设置一个合适的向下速度。

_images/course7.10.png

模拟器中可以看到敌机自上而下袭来,有太空大战内味了。

_images/course7.11.gif
自动销毁

敌机离开屏幕后并没有消失,而是堆积在了屏幕外,我们需要设置自动销毁,防止堆积过多造成占据内存,游戏卡顿的现象。

_images/course7.12.png

TIPS:之后设置相似的精灵不断出现时,也要记得设置精灵摧毁哦!

游戏中的重叠事件有两个,一个是子弹射中敌机,得分加一;一个是敌机碰到战机,生命值减一。我们分别来设置一下!

子弹与敌机重叠

设置子弹与敌机重叠事件,得分加一,销毁被击中的敌机。

Xtron/Xtron_Arcade/Xtron_Arcade_Games/images/course7.13.gif

拖取销毁精灵积木块到重叠事件中。

_images/course7.14.png

我们发现被子弹击中的敌机并没有被销毁,销毁的敌机是最新一个在屏幕中出现的敌机,并不是被击中的敌机被销毁了。

这是因为我们游戏中有很多的子弹精灵和敌机精灵。在程序中创建的敌机精灵以及子弹精灵指的是当时创建的精灵,并不是我们重叠事件中要处理的精灵。

_images/course7.15.gif

如何设置销毁被击中的敌机呢?

被击中的敌机,就是重叠事件中的敌机,在子弹与敌机重叠事件中子弹类型是Projectile(弹射物),敌机的类型是Enemy(敌人),那么重叠事件中代表击中敌机的子弹精灵是sprite,代表被子弹击中的敌机精灵是otherSprite。拖动事件中的otherSprite模块替换销毁“敌机”积木块中的“敌机”,并设置一个击毁的特效。

_images/course7.16.png
战机与敌机重叠

太空战机被敌机击中,生命值减1,并摧毁此敌机。

_images/course7.17.png
width

300

当生命值为0时,游戏自动结束。

当然,为了提高游戏的完整度,我们可以在开始游戏时为游戏添加一个介绍玩法。为了提高游戏的有趣性,我们还可以增加一个倒计时积木块,和朋友们一起比赛,看谁的得分多!

_images/course7.18.png

当然,同学们可以发挥自己的想象力,为太空大战增加更多好玩有趣的设置。

问答考验

当精灵并不能全部在屏幕中显示,我们可以调用什么积木块来实现精灵在屏幕中?

解析:精灵-》特效->设置精灵保持在屏幕中

屏幕中不断出现精灵,为防止精灵过多造成游戏卡顿的现象,应该调用什么积木块?

解析:精灵-》特效->销毁精灵积木块

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

THANKS

自动驾驶
教程介绍

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

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

_images/course8.1.gif

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

编程目标

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(像素)

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

设计地图

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

_images/course8.14.png

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

_images/course8.15.png
创建汽车精灵
_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的开关,开关关掉之后,你在编辑器中就看不到这一层红色覆盖了(墙的属性依旧在)。但是在绘制过程中,建议大家打开开关。

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

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

自动驾驶

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

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

_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

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

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

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

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

优化汽车形象

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

_images/course8.29.png

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

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

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

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

问答考验

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

解析:512*512

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

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

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

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

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

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

_images/course6.37.gif
神奇的循环
教程介绍

在上节课程中我们讲解了自动驾驶,同学们了解了地图的绘制,以及精灵和图块的重叠事件积木块的使用,相信同学们的图形化编程知识又增加了不少。💡

在编程游戏中一个效果的实现会有有好多种编程思路:

比如判断猫吃鱼的条件由设置判断坐标轴一样→ 两个精灵重叠;设置随意颜色由设置不同颜色→ 调用选取随机数积木块;设置地图指示牌由设置指示牌精灵位置→ 在地图中放置指示牌图块。

可见,同样的游戏效果可以有不同的编程方式,我们在编程中可以多利用发散思维,寻找编程的最优解。

这节课,我们通过编程游戏项目《种草莓》来了解循环积木块的使用,以及不断优化编程出一个简洁逻辑清晰的程序。

种草莓

想到种草莓是不是脑海里想到了“开心农场”游戏里面蔬菜整齐分布的场景:

🍇🍈🍉🍊🍋🍌🍍🍎🍏🍑

这节课,我们来利用编程创建一个“开心农场”,需要设置草莓的草地背景,草莓的形象,草莓的位置,一起来编程一下!

设置草莓位置

每个精灵大小是16*16像素,所以第一个的草莓的坐标为(8,8),第一排Y坐标不变, 草莓的X坐标为前一个草莓位置数值+16。比如第一个草莓位置(8,8),第二个草莓位置(8+16=24,8),以此类推。👇

_images/course9.1.png
_images/course9.2.png

设置到后面同学们可能会有所疑惑了:这样一个个设置草莓样式和位置是不是太麻烦了点,不想做一个没有感情的种草莓机器,那有没有简单的编程办法呢?😕

🍓 🍓 🍓

循环积木块的使用

这里可以用到“重复N次”循环积木块。

积木块含义:

设置指定的次数来重复运用内部的程序。

积木块位置:

循环工具箱-》重复N次,执行()

种满第一排的草莓需要十个草莓,因此设置重复10次,将“草莓样式”积木块和“设置草莓位置”积木块拖取到循环积木块里面。👇

_images/course9.3.png

现在的草莓重复种在了(8,8)的位置,如何设置种满一排呢?

循环积木块的作用是重复运行内部的积木块,那么我们只要设置草莓的位置基于上一个草莓位置的变化,就可以不断重复设置草莓位置了。

在前面的种草莓我们已经找到了位置规律,即:

草莓位置X(新)=草莓位置X(旧)+16

这里的X每次都会以16个数值幅度增加,我们可以使用变量积木块。

变量

在之前在”随机应变“游戏中讲过,变量几乎在编程游戏中都会使用到,一个游戏中可以包含多个不断变化的变量。变量可以放置在需要的事件中,也可以设置数值和数值变化幅度。

我们在变量工具箱中设置一个变量“X”。将变量X积木块替换设置草莓位置的X值。👇

_images/course9.4.gif

变量工具箱中的另外两个积木块从上往下分别用来设置特定的数值和设置变量的变化幅度。👇

_images/course9.5.png

我们把第一个草莓的X坐标设为8(精灵大小16*16,坐标为精灵中心点位置,即(8,8))。将变量工具箱中“将X设为8”积木块拖取到“当开始时”积木块内部。👇

_images/course9.61.png

后面的草莓的X坐标值都是在前一个坐标值+16,以16为幅度更改X坐标。👇

_images/course9.7.png

想要看到草莓一个个种下的效果,我们可以加一个延时。👇

_images/course9.81.png

现在,第一排的草莓就种好了,模拟器看看效果吧!👇

_images/course9.91.gif

接下来,我们来种第二排草莓,第二排与第一排相比,Y坐标+16,我们需要增加一个Y坐标变化16幅度的循环,种两排就是循环两次。并且在第一排草莓种好之后,我们要将草莓的初始X坐标设置为8。👇

_images/course9.11.png

那么草莓的进入循环的顺序应该是这样的:👇

1.种植第一排草莓( X8(+16 /9次),Y8 )

2.从第一行换到第二行:( X8,Y8(+16/1次))

3.种植第二行的草莓( X8(+16 /9次),Y16)

TIPS:进入循环事件中就进入了循环的第一次,因此后面的以16为幅度的变化次数为循环的总次数减1次。

整个屏幕可以种8排草莓,我们想要种满屏幕的话,只要将原来的Y坐标重复2次改为重复8次就可以了。👇

_images/course9.12.png
_images/course9.13.png

保存图片,导入到Arcade编辑器查看编程。▴

现在我们是先种第一排,然后第二 第三排,如果想要换个方式,先种第一列,然后第二 第三列,这样的话要怎么办呢?😕

按照同样的办法,我们先让内部Y坐标循环8次,再让外部X坐标循环10次。👇

_images/course9.14.png
_images/course9.15.png
width

300

上面的程序已经可以让我们轻松的种草莓了,还有更加简洁的程序设计嘛?😕

作为一个合格的设计师,我们对程序的设计有着更高的要求,比如更加简洁明了。

是的,我们还有更加简洁的编程方式。

🍓 🍓 🍓

优化编程方式

我们看到循环里还有这个积木块,和之前的不同的是,这里面还有一个index的值。👇

_images/course9.16.png

积木块含义:设置指定的次数循环运行内部的程序,index作为索引变量指代循环运行的第N次,可以放置到循环积木块内部的积木块中依次运行每一次的程序。

之前的种草莓程序中,设置第一排草莓X坐标循环了十次,但是我们并不知道当前的循环是第几次,而这个积木块,第几次循环可以用“index”变量积木块表示。

知道是第几次循环可以给我们带来什么样的便利呢?😕

我们不需要给X设置变化幅度来设置X坐标值了,可以直接通过简单的数学计算,得出每次的坐标。

对于第一排的草莓,每个草莓的X坐标可以这样表示:👇

第一个草莓, index=0, 坐标X= 8

第二个草莓, index=1, 坐标X=16*1+8

第三个草莓, index=2, 坐标X=16*2+8

第四个草莓, index=3, 坐标X=16*3+8

。。。

我们可以用数学工具箱中的“数学公式”积木块表示X坐标值:👇

_images/course9.17.png

将“X坐标公式”积木块替换之前的“X变量”积木块,修改后的程序如下:👇

_images/course9.18.png

同样的,我们也用这个方法修改Y坐标和循环次数:👇

_images/course9.19.png

添加了循环Y坐标后我们发现,种草莓程序上出现了一些问题,游戏并没有按照一排一排的种,而是对角线自动种草莓了,这是为什么呢?😕

因为每一个“对于0至N的index”积木块中的index只能指代一个循环的序数数值。现在的程序中出现了两个index变量,因此设置Y坐标的循环积木块中的index我们要重新创建一个新的变量inedxy来替换,不然会和内部的index混淆。👇

_images/course9.20.gif

现在,用这么简单的一段程序就可以实现种草莓了,不用给X Y设置初始值,也不用修改X Y的值了,这样的程序是不是看起来更加的简洁?👇

_images/course9.21.png

学会了使用循环积木块之后,我们还可以很方便的自己设计一块地形,然后来种草莓,只需要找到规律,然后修改循环内部位置的算法就可以了。

🍓🍓🍓

可见,对于编程语言就和解答题目一样,我们在做题时寻找着题目的最优解,在编程中不断推导出简洁优美,逻辑性强的程序语言。在一次次遇到问题,思考问题,解答问题的过程闭环中,完成思维能力和编程能力的螺旋式提高。

问答考验

常量和变量的关系

解析:变量是在游戏中可以变化的量,如之前随机应变游戏中创建随机数变量,种草莓中X坐标变量,index变量,这里变量的数值可以按照变化幅度变化;常量是不可以变化的量,如游戏中的精灵,大小不能变化。

循环是否可以嵌套,是先执行里面的循环,还是外面的循环?

解析:先执行内部的循环,在执行外部的循环

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

_images/course6.37.gif

Xtron Scratch 指南

Xtron Scratch 积木块指南

1.Xtron有两个可编程的LED灯,4个RGB灯,7个按键(4个方向按键,2个功能按键,1个菜单按键),1个蜂鸣器,光敏传感器,运动传感器,还有2个扩展接口。运用这些模块以及扩展,可以学习Scratch以及Python编程,还可以做很多有趣的创客制作。

2.用Scratch进行编程,你有两种方式可以选择:

(1)下载并安装Ovoblock软件。

  • Ovoblock是一款基于Scratch 3.0开发的电脑端编程软件,支持Mac、PC和浏览器平台,兼容Scratch 3.0的所有功能,同时也支持python语言开发。

  • Ovoblock下载链接:https://www.ovobot.cn/zh-hans/app/#Ovoblock

(2)使用Ovoblock网页版本。

3.在Xtron开始编程之前,你需要加载对应的固件。

  • Xtron开关键处于OFF位置,把Xtron用USB连接到电脑,这时候屏幕显示F4图案.

_images/F4.png _images/null2.png
  • 点击ovoblock网页或者软件上的【帮助】->【下载固件】获取flasher.uf2文件,把flasher.uf2文件复制到Xtron中。

    _images/gujian.png
    _images/null2.png

    【Xtron python固件】可以让Xtron成为一个创客主板,自带的传感器和屏幕可以做很多内容,并且还可以扩展机器人,AI摄像头以及丰富的扩展模块。

    _images/null2.png
  • 按下RST按键,这时候屏幕是黑色的。现在,固件已经加载完成。

4.打开Ovobot软件,移除默认的OvoBot Bit设备,在添加设备里加上Xtron。

_images/index.gif

5.现在你可以开始Scratch编程了,我们的Xtron有实时和离线两种模式,可以根据你的需求来选择。

  • 调试模式: Xtron要连接在电脑上,用于程序的调试,点击【调试程序】,可以实时看到程序效果。

  • 离线模式: Xtron在程序下载的过程中(LED1和LED2交替闪烁),需连接在电脑上。点击【下载程序】下载完成后,无需连线,可以开机直接运行程序。

_images/index2.gif

6.你可以从基础的积木块开始学习,积木块的介绍参考:

基础积木块编程指南
灯光
  1. 设置板载LED

    _images/set_the_onboard.png
    • Xtron上有2个LED灯,可以分别设置熄灭和点亮。

    • 这两个LED灯还用来作为状态的指示灯,比如充电时led1亮红灯,下载代码时led1闪红灯,开机时led2亮蓝灯后熄灭。

    _images/null2.png
  2. 板载LED电平反转

    _images/onboard_level_inversion.png

    每次执行该程序块会把对应LED电平反转,即Xtron的led灯从点亮变为熄灭,或者从熄灭变为点亮。

    _images/null2.png
  3. 设置板载LED亮度

    _images/the_onboard_brightness.png
    • 该程序块可以设置Xtron板载的led灯的亮度,数值范围为0~255。

    • 在点亮LED之后再设置亮度才生效,而且只调节前面程序里已经点亮的LED灯的亮度值。

    _images/null2.png

例子:

  • 先点亮LED1,等待1S后熄灭LED1. 1s之后,再次点亮LED1,并且设置亮度为40,最后1s后熄灭LED1.

  • 我们看到的现象是:LED1以1S的时间间隔闪烁一次后,亮度变小,又闪烁一次。

    _images/lizi1.png
  1. 设置板载RGB灯颜色

    _images/onboard_RGB_lights.png
    • Xtron上有4个RGB灯,可以分别设置不同的颜色,通过颜色、饱和度、亮度来调节颜色,数值范围均为0~100。

    • 点击颜色下方的【滴管图标】还可以从已有的角色中一键获取角色上的任意颜色。

    _images/null2.png
  2. 设置板载RGB所有灯颜色

    _images/onboard_RGB_all_lights.png
    • 可以将板载上的4个RGB灯,同时设置为相同的颜色,通过颜色、饱和度、亮度来调节颜色,数值范围均为0~100。

    • 同样的,还可以从选择的角色中一键吸取已有的颜色。

    • 和上面的程序块的区别是,上面的是单独设置某一个RGB灯,这个程序块则是同时设置所有的RGB灯。

    _images/null2.png
  3. 设置板载RGB灯亮度

    _images/brightness_of_onboard_RGB_lamp.png
    • 该程序块用来设置Xtron板载的RGB灯的亮度。

    • 设置亮度值之后,再设置RGB灯的颜色,亮度值才生效。如果你想改变亮度值的话,你需要设置亮度值之后,再次设置一下对应的RGB灯颜色。

    _images/null2.png

例子:

  • 设置RGB1亮度值为0.5,并且显示紫色,1S之后,RGB1变亮并且换成红色。

  • 看到的现象是, RGB1在紫色和红色之间不停的变化显示,并且两个颜色高度不同。

    _images/lizi2.png
显示
  1. 显示清空

    _images/according_to_empty.png

    用来清空LCD屏幕上之前显示的所有内容。在同一个位置显示不同的内容,如果不清空,会和之后显示的内容重叠。

    _images/null2.png
  2. 设置屏幕背景色

    _images/display.png
    • 该积木块可以设置屏幕的背景色,一共有16个颜色可以选择,其中第一个颜色是透明色。

    _images/null2.png
  1. 设置文本内容程序块

    _images/draw_text_content.png
    • 把文本内容显示在某个坐标(x,y)。

    • 文本内容可以是字母、数字,暂时不支持中文显示。

    • 坐标的范围是X:0~160, Y: 0~120

    • 文本内容有16个颜色可选,其中第一个颜色是透明色。

    _images/null2.png
  1. 显示生效

    _images/according_to_take_effect.png

    在设置好屏幕背景以及屏幕显示内容后,加上显示生效积木块,屏幕上才会显示我们设置好的背景及内容。

    _images/null2.png

例子:

  • 设置屏幕背景颜色为蓝色;

  • 在屏幕的中间循环显示“ Hello! Welcome to Xtron!”, 每次显示一个单词。

    _images/lizi3.png
  1. 绘制线一条水平或者垂直的线段

    _images/draw_line_length.png
    • 在某个坐标(x,y)绘制一条水平或垂直的线段,线的长度≤显示屏的长度。

    • 坐标的范围是X:0~160, Y: 0~120

    • 如果是水平线,线段长度+ X的坐标<160; 如果是垂直线,线段长度+ Y的坐标<120. 否则线段显示不完整。

    • 所有绘制的图案,都要加上显示生效积木块,才会在屏幕上显示出来。

    • 文本内容有16个颜色可选,其中第一个颜色是透明色。

    _images/null2.png
  2. 绘制一条线段

    _images/draw_the_line.png
    • 绘制一条从一个坐标(x1,y1)到另一个坐标(x2,y2)的线段

    • 坐标的范围是X:0~160, Y: 0~120

    • 和上一个积木块的区别是,这个积木块绘制的线段是任意的方向,上一个只能是水平或者垂直方向。

    • 文本内容有16个颜色可选,其中第一个颜色是透明色。

    _images/null2.png
  3. 绘制一个矩形

    _images/draw_a_rectangle.png
    • 在某个坐标(x,y)处绘制一个矩形,通过设置矩形的宽和高来设置矩形的大小。

    • 可以选择实心矩形或者是空心矩形。

    • 坐标的范围是X:0~160, Y: 0~120。

    • 如果坐标值加上矩形大小,超过了显示范围,会显示不完整。

    • 文本内容有16个颜色可选,其中第一个颜色是透明色。

    _images/null2.png
  4. 绘制一个圆形

    _images/draw_a_hollow_circle.png
    • 在某个坐标(x,y)绘制一个圆形,通过设置圆的半径来改变圆的大小。

    • 可以选择实心圆形或者是空心圆形。

    • 坐标的范围是X:0~160, Y: 0~120

    • 如果坐标值加上矩形大小,超过了显示范围,会显示不完整。

    • 文本内容有16个颜色可选,其中第一个颜色是透明色。

    _images/null2.png
  5. 绘制一个三角形

    _images/draw_a_hollow_triangle.png
    • 通过设置三角形三个点的坐标(x1,y1)、(x2,y2)、(x3,y3)来绘制一个三角形。

    • 可以选择实心三角形或者是空心三角形。

    • 坐标的范围是X:0~160, Y: 0~120

    • 文本内容有16个颜色可选,其中第一个颜色是透明色。

    _images/null2.png
  6. 设置RGB颜色

    _images/red_green_blue.png
  • 该程序块用来设置RGB的颜色,在设置屏幕颜色或者画笔颜色的时候,可以用指定的RGB的值来设置颜色。

  • 红绿蓝三种颜色的数值范围分别为0~255。

  • 比如红色有很多种:粉红(255,192,203,深红(220,20,60),淡紫红(255,240,245),弱紫罗兰红(219,112,147),深粉红(255,20,147)等,我们通过设置不同的RGB值就可以精确的显示不同的颜色。

_images/null2.png

例子:

  • xtron启动,显示Hello;

  • 按向上按钮,画一个水平线;

  • 按向下按钮,画一个实心矩形;

  • 按向左按钮,画一个空心圆;

  • 按向右按钮,画一个空心三角形;

    _images/lizi4.png
声音
  1. 播放音符

    _images/play_tone2.png
    • 该积木块可以播放音符,音符以及节拍长度可以在下拉框里选择。

    • 点击音符,显示的是中央C的音调,可以用左右两边的箭头来切换高低音,左边是低音,右边是高音。

    • 简谱和音名的对应关系:我们在生活中,一般接触到的都是1234567这样的简谱,但我们积木块是用五线谱的音名来显示的,在C调的乐谱中,它们之间的对应关系如下。

      _images/music6.png

    C调中,C、D、E、F、G、A、B分别对应简谱中的1、2、3、4、5、6、7,一个唱名为四分音符持续1个节拍,下方有一个横杠的是八分音符持续1/2节拍,音符后有一个横杠的为二分音符持续2个节拍,同学们按照音符和节拍数编写整段音乐。

    比如下面的上学歌,不划线是四分音符,在这首曲子中是一个节拍,一道下划线的节拍相当于八分音,在这首曲子中是1/2拍。

    一些音符后面会加-,表示音符持续,例如7 - 代表 7 这个音占了两个节拍,7- - 则表示3个节拍。

    _images/song1.png
    _images/null2.png
  2. 暂停播放

    _images/rest2.png

    使用该积木块可以停止声音,停止的节拍数可以在下拉框中选择。

    _images/null2.png
xtron机器人积木块编程指南

如果你想做一个机器人,你可以把Xtron当作机器人的大脑。当然,机器人不能只有大脑,我们需要给它配上一些传感器以及一些硬件模块。

Ovobot Xtron是Xtron的机器人扩展,它有一个4PIN接口,通过I2C总线连接Ovobot所有的传感器和硬件模块,还有一个包含了IO口、SPI、PWM和I2C功能的20PIN接口。

_images/extend1.png

下面是Xtron的机器人扩展积木块,你可以用这些积木块来让机器人运动,声音传感器让机器人有了听力,超声波和巡线传感器则可以帮助机器人更好的完成一些任务。

1.设置机器人移动速度

_images/x_movement_speed.png

该积木块用来设置机器人的前进或后退的速度,数值范围为0~255。

2.设置机器人移动速度及时间

_images/x_movement_speed_time.png

和上面的积木块的区别是,上一个积木块需要加停止程序才可以让机器人停止运动。而这个积木块有持续时间,持续时间结束后,机器人就停止运动了。

3.设置旋转速度

_images/x_rotation_speed.png

设置机器人向左或者向右的旋转速度,速度范围为0~255。

4.设置旋转速度及时间

_images/x_rotation_speed_time.png

设置机器人向左或者向右的旋转速度以及持续时间,速度范围为0~255。区别同上。

5.停止运动

_images/x_stop_move.png

可以用该积木块让机器人停止运动。

6.驱动电机

_images/x_drive_motor.png
  • 该程序块可以分别设置机器人的左右两个轮子的速度,来实现前进,后退,转弯。

  • 当左右转速相同,并且数值>0的时候,机器人按照设置速度前进。

  • 当左右转速相同,并且数值<0的时候,机器人按照设置速度后退。

  • 当左轮>0,右轮<0,机器人是左转。

  • 当右轮>0,左轮<0,机器人是右转。

7.控制舵机转动

_images/steering_gear_rotating1.png

该积木块可以控制舵机旋转到一定的角度,旋转度数的范围大小是-90~90。可用来制作丰富的带舵机的小制作。

8.响度

_images/x_loudness.png

我们用响度来表示声音传感器的反馈值,响度的范围大小是0~255。

9.超声波传感器距离

_images/x_ultrasonic_distance.png

该积木块返回值是机器人的超声波传感器检测到离障碍物的距离。

10.超声波传感器检测到障碍物程序块

_images/ultrasonic_detection_of_obstacles.png

反馈机器人的超声波传感器是否检测到障碍物。是的话返回值是True, 否则返回值是False.

11.巡线传感器数值程序块

_images/tracking_sensor_value.png

该积木块可以分别反馈巡线传感器左右两个光电对管检测的灰度值,黑色物体的返回值接近0,白色物体返回值接近255。

12.巡线传感器颜色检测程序块

_images/ultrasonic_color.png

分别用于判断巡线传感器左侧或者右侧是否检测到黑色或白色,条件成立时返回为真。

视觉识别摄像头积木块编程指南
视觉识别摄像头简介

(1)视觉识别摄像头可以作为Xtron的扩展来使用,它是一款用于图像识别的传感器。

(2)其内置的深度学习引擎可以识别多种目标物体,例如颜色检测、球体检测、人体检测、卡片识别等。

(3)检测结果可以通过 I2C 进行输出,体积小巧,功耗低,所有算法本地处理,无须联网,可广泛应用于人工智能教具、创客等产品或领域。

(4)提供了简单而实用的参数设置功能:摄像头帧率,LED 颜色,数码变焦,白平衡,算法性能设置。合理设置这些参数,将会有利于摄像头性能的提升。

下面我们将介绍视觉识别摄像头的使用方法。

视觉识别摄像头硬件连接

视觉识别摄像头的外设和接口如图所示:

_images/MU_hard1.png

(1)将传感器左侧输出模式拨码开关1拨至下方,2拨至上方;

(2)将传感器连接到Xtron的I2C扩展接口;

(3)将传感器的地址选择拨码开关拨至对应位(默认地址0x60,对应MU00,1、2都在下方,只有在与其他传感器地址冲突时才需要进行更改,平时不推荐修改此设置),

视觉识别摄像头积木块介绍
  1. 初始化模块

    将视觉传感器的连接初始化为I2C模式。

    _images/initialization_port2.png
  2. 开启算法

    当前版本共有如下7种算法:

    • 色块检测:指定颜色,输出视野内该颜色色块的长度与中心点坐标

    • 颜色识别:视野内指定坐标点的颜色信息

    • 球体检测:球体识别算法并不能识别任何球体,仅支持橙色乒乓球(Label:1)和绿色网球(Label:2)的识别。

    • 人体检测:依据上半身轮廓

    • 形状卡片:识别5张形状卡片

    • 交通卡片:识别5张交通卡片

    • 数字卡片:识别10张数字卡片

    _images/MU21.png
  3. 设置算法性能

    • 不同算法性能下识别的速度与准确率会有所差异,可根据实际的应用需要选择合适的性能参数。

    • 速度优先:需要高速处理的场合,,如实时跟踪某个物体;对某个物体需要做出快速的响应;场地或背景可以控制的环境。识别速度快,误报率稍高;

    • 性能均衡:默认模式,适合一般场景的应用需求;

    • 准确率优先:复杂场景情况下使用,识别速度稍慢,误报率低;当多类识别算法同时开启时,譬如形状卡片与交通卡片混合摆放识别时,请采用该模式,以消除不同组卡片间的误报。

    _images/MU31.png
  4. 关闭/开启摄像头高帧率模式

    • 摄像头帧率指摄像头采集图片的速度,分为高速模式和标准模式,高速模式为 50fps,标准模式为 25fps。

    • 提高摄像头帧率可以提高图像处理的速度,缓解图像拖影问题,但功耗会有一定增加。环境较暗时,标准模式比高速模式成像要亮一些。

    • 默认使用高帧率模式,相对普通模式有更快的识别速度,但功耗和发热量随之增加,可用于快速检测的场景,如需要低功耗使用则可关闭。

      _images/high_frame_rate2.png
  5. 设置摄像头白平衡

    (1)当摄像头视野中出现大面积有颜色的物体时,摄像头会发生白平衡失真,产生偏色现象,通过事先锁定白平衡能够防止此问题的发生。

    (2)但白平衡功能并不总是有利于色彩还原的,合理使用白平衡对于颜色相关的算法是十分关键。

    (3)白平衡的调节分为自动调节方式和固定参数方式,对于一张构图颜色均衡的图像,其 R,G,B 三个通道的值应是分布均匀的,如果 R、G、B 通道分布出现了失衡,自动白平衡功能会适时的修改各通道的色彩增益值使其重新分布均衡,而固定白平衡是不会改变其色彩增益的。

    (4)模式介绍:

    • 自动模式:适用于光照良好且对颜色要求不高的环境中使用;

    • 锁定模式:适用于颜色还原要求较高的环境,让摄像头面对白纸进行白平衡校准,然后锁定白平衡参数,锁定后颜色不会随环境的改变而变化;

    • 白光模式:适合于白色灯光或者阴天环境中使用,该模式也属于自动白平衡模式;

    • 黄光模式:适合于黄色灯光或者阳光环境中使用,该模式也属于自动白平衡模式。

    (5)锁定白平衡的校准方法

    • 将摄像头面向一张白纸 10~20cm 处,确保摄像头中心区域完全面向白纸,灯光照向白纸,但尽量不要有阴影遮挡;

    • 调用锁定白平衡指令,或短按功能按键(摄像头左侧 mode 键);

    • 摄像头的 LED 会闪烁一下白色灯光,开始白平衡校准;

    • 几秒钟后,当 LED 闪烁一下青色灯光后,表明白平衡校准完成;

    • 如果 LED 闪烁为紫色灯光,则表明校准失败,可以再次重新校准。

    备注 1:由于校准白平衡需要几秒钟的时间,所以使用软件锁定白平衡时应该位于小 MU 设置最后使用,并设定 2 秒左右的暂停时间等待校准完成。

    备注 2:按键方式可以在小 MU 运行的任何时刻去校准白平衡,而指令模式只适合于开机后的配置阶段使用。

    备注 3:如果校准时使用的不是白纸,即便校准后显示为青色灯光,那么图像也可能是处于偏色状态的,因为该功能会将其他颜色尽量调节为白色。

    (6) 锁定白平衡模式的使用场景

    1. 摄像头视野中存在大面积单色物体:

      当图像中出现大面积红色时,红色 R 通道值明显高于 G、B两个通道,摄像头了为调节白平衡而将 G、B 增益提高,所以其周围的白色区域呈现出了淡青色。类似的,大面积绿色周围会呈现淡紫色,而大面积蓝色周围会呈现淡黄色。经过校准并锁定白平衡后,三种颜色周围的白色被正确的还原,不存在偏色现象。

    2. 摄像头近距离检测颜色:

      摄像头十分靠近单色物体时,自动白平衡为了还原白色,将原本的红绿蓝卡片调节到完全失衡的状态,此时已经失去了原本的颜色信息,校准并锁定白平衡后,其原本颜色可以得到正确的还原。

    _images/camera_white_balance2.png
  6. 设置摄像头数码变焦

    • 具有数码变焦功能,共有 5 个档位可以使用,利用镜头缩放功能可以看到远处的目标物体。

    • 数码变焦等级越大可检测的距离越远,但视野范围会变窄。

    • 数码变焦等级1(距离近,视野广)~数码变焦等级5(距离远,视野窄)。

    • 针对不同距离的物体通过试验测试合理设置数码变焦等级值可以取得较好的识别效果。

    • 使用等级3-5时,图像帧率会比等级1-2低。

    _images/MU41.png
  7. 板载LED灯光设置

    • 视觉传感器正面板载有两颗LED灯,左侧是LED1, 右侧是LED2. 每闪烁一次表示执行一帧图像识别。

    • 可通过设置识别到目标与未识别到目标时灯光的颜色来获得反馈。

    • 默认设置:未检测到闪红灯,检测到则闪蓝灯。当进行颜色识别时,默认LED关闭。

    _images/MU51.png
  8. 恢复模块默认设置

    • 该程序块用来关闭所有算法,重置所有硬件设置。

    • 在调试模式下,建议在程序开始的时候执行该程序块,或者是手动点一下reset按键。因为算法不会在程序结束后自动关闭,长期调试不同算法会导致占用过多的内存。

    _images/restore_the_default2.png
  9. 判断摄像头是否检测到目标

    检测到所选的目标后,返回True, 否则返回False。

    _images/MU61.png
  10. 判断摄像头是否检测到颜色

    (1)检测到目标位置的颜色后,返回true, 否则返回False。

    (2)色块检测与颜色识别的区别:

    色块检测:指定一种颜色和该颜色块尺寸的最小值,然后摄像头会在图像中寻找符合该要求的一个色块区域,返回其坐标和大小,解决“是不是”的问题。下图左侧设定为检测蓝色,摄像头会在图像中寻找蓝色色块方位。

    颜色识别:指定一个检测区域,然后摄像头统计该区域中像素的颜色,并返回该颜色的Label值标签以及具体的红 R,绿 G,蓝 B 通道的值,解决“是哪一个”的问题。下图右侧设定识别区域位于图像中心,图中识别结果为绿色,Label5

    _images/MU7_11.png _images/MU7_31.png

    (3)颜色Label分类标签的定义:

    _images/MU7_21.png
    _images/MU71.png
  11. 判断摄像头是否检测到色块

    检测的目标色块可以在下拉框里选择,摄像头检测到所选目标色块后,返回true, 否则返回False。

    _images/MU91.png
  12. 获取检测目标的坐标以及大小

    返回值是检测到的目标的坐标。检测目标可以在下拉框选择,获取的值有横向,纵向坐标,以及目标的宽度和高度。

    (1)X-Y 坐标:摄像头输出图像的宽高比例为 4:3。在图像坐标系中,水平与垂直坐标均被量化到了 0~100 的范围内,其含义是该坐标相对于完整图像的百分比位置。例如 X 为30时,即该物体的 X 坐标位于水平方向距离原点 30%的位置上。

    (2)W-H 宽高:当检测到物体后,返回物体的 Width 宽度值和 Height 高度值,其量程同样被量化到了 0~100 的范围内,其 W 宽度的含义是其在整个水平方向所占据的百分比值,H 高度的含义是其在整个垂直方向所占据的百分比值。需要注意的是,由于水平垂直的比例是 4:3,所以对于宽高相同的正方形物体而言,其输出的宽高值是存在一个 3:4 的比例关系的,而并不是相等的关系。

    (3)Label 分类标签:对于具有分类识别功能的算法而言,还会根据所检测到的不同物体输出其对应的分类标签值,该值是内部设定好的一系列数字,每一个数字对应一个特定的物体,以球体算法为例,当 Label 标签为 1 时,代表检测到了一个乒乓球,而如果 Label 标签输出为 2,则说明此刻检测到的是一个网球。Label 分类标签在颜色和卡片的算法中是一个十分关键的信息。

    _images/MU81.png _images/MU8_11.png
  13. 获取目标颜色里对应的RGB值

    颜色识别输出结果并不是坐标和宽高,而是颜色的 label 标签以及 R 红,G 绿,B 蓝三个通道的值(范围 0~255)。在使用颜色识别时可以指定识别区域的坐标,其余参数为默认值。

    _images/MU101.png
  14. 判断是否检测到形状卡片里所选形状

    检测到形状卡片里所选形状卡片后,返回true, 否则返回False。形状有钩,叉,圆形,方形,三角形可以选。

    _images/MU111.png
  15. 判断是否检测到交通卡片里所选图标

    检测到交通卡片里所选图标后,返回true, 否则返回False。图标有向前,向左,向右,掉头,停车可以选。

    _images/MU121.png
  16. 判断是否检测到数据卡片里对应数字

    检测到数字卡片里所选数字后,返回true, 否则返回False。数字有0-9可以选择。

    _images/MU131.png
  17. 判断是否检测到所选颜色

    检测到所选的颜色后,返回true, 否则返回False。颜色有9种可以选择。

    _images/MU141.png
完整示例
  1. 球体与人体检测:

    球体算法的特殊性:球体算法分为搜索阶段和跟踪阶段,在球体未检测到时处于搜索阶段,此时处理速度相对比较慢,检测距离也会比较近。一旦检测到球体后,会进入跟踪阶段,处理速度会有所提升,检测距离也会变远。当球体丢失后,会再次进入搜索阶段。

    人体算法的有效特征:人体检测实际是检测人体的上半身特征,上半身特征是指由头部(必须包含人脸)和胸部以上(肩膀)构成的特征组合,如果图像中具有符合人体上半身特征,那么会被认为是有人体被检测到。

    初始程序:采用I2C连接,启用人体检测算法,其余设置为默认。

    循环程序:如果视觉传感器检测到人体,会通过I2C向Xtron发送检测到的数据,Xtron会通过屏幕显示位置和类型信息,否则循环显示未检测到人体,球体检测同理。

    实验现象:未检测到人体则视觉传感器闪红灯,屏幕显示”body undetected”。检测到人体则视觉传感器闪蓝灯,屏幕显示返回的坐标等信息。

    _images/MUlizi11.png
  2. 卡片识别

    我们具有 3 类卡片算法:形状卡片,交通卡片,数字卡片。摄像头只能识别下述特定图案的卡片。在一幅图像中,同一个算法只能返回一个卡片的检测结果,但可以同时运行不同类型的卡片算法。

    初始程序:采用I2C连接,启用交通卡片识别算法,其余设置为默认。

    循环程序:如果视觉传感器检测到交通卡片,会通过I2C向Xtron发送检测到的数据,Xtron会通过屏幕显示位置和类型信息,否则循环显示未识别,其他类型的卡片识别同理。

    实验现象:未检测到卡片则视觉传感器LED闪红灯,屏幕显示”card undetected”。识别到则视觉传感器LED闪蓝灯,屏幕显示返回的坐标信息和交通卡片的具体图案信息。

_images/MUlizi11.png
  1. 颜色识别

    在使用颜色识别算法时,需要指定一个颜色识别区域,算法运行后只返回该区域内的颜色信息。颜色识别区域小,像素少,速度快,但容易因各别像素的偏色而造成可信度的降低;颜色识别区域大,像素多,速度慢,但容易受背景的干扰。颜色识别区域应根据实际需求而合理设置。

    颜色识别输出结果并不是坐标和宽高,而是颜色的 label 标签以及 R 红,G 绿,B 蓝三个通道的值(范围 0~255)。

    初始程序:采用I2C连接,启用颜色识别算法,锁定摄像头白平衡防止偏色,其余设置为默认。

    循环程序:视觉传感器识别坐标(50,50)处的颜色,通过I2C向Xtron发送检测到的数据,Xtron会通过屏幕显示识别到的通道信息和颜色类别。

    实验现象:视觉传感器始终不闪灯,屏幕显示返回的通道值和颜色的类别。

  2. 色块检测

    色块检测在不更改设置的情况下只能检测一种选定的颜色,摄像头会寻找视野中符合该色块的地方,返回结果最好的那一个,

    初始程序:采用I2C连接,启用色块检测算法,锁定摄像头白平衡防止偏色,其余设置为默认。

    循环程序:如果视觉传感器检测到红色块,会通过I2C向Xtron发送检测到的数据,Xtron会通过屏幕识别到的位置和类型信息,否则循环显示未检测到。

    实验现象:未识别到时视觉传感器闪红灯,控制台显示”color block undetected”。识别到红色块则视觉传感器闪蓝灯,屏幕显示获得的红色块坐标大小信息。

    _images/MUlizi41.png

后续将更新更多案例,敬请期待。。。

基础扩展包积木块编程指南
基础扩展
控制马达输出程序块 _images/x_control_motor_output.png

控制马达的输出,数值范围为0~255。

控制舵机旋转程序块 _images/x_steering_gear_rotating.png

控制舵机旋转度数,数值范围为-90~90。

设置LED灯带颜色程序块 _images/x_LED_lamp_shade.png

设置LED灯带的颜色,可以分别设置1~11的灯带,也可以一键设置全部灯带颜色,颜色为红橙黄绿蓝靛紫黑白。

数码管数值显示程序块 _images/x_digital_tube_value.png

实时反馈数码管显示的数值。

触摸按键被按下程序块 _images/x_press_the_touch_button.png

判断触摸按键是否被按下,执行下一条指令。

温湿度传感器程序块 _images/x_onboard_temperature.png

反馈温湿度传感器的板载温度、板载湿度以及扩展温度。

电位器数值程序块 _images/x_potentiometer_value.png

反馈电位器的数值。

Xtron Scratch 游戏编程指南
  1. Ovobot Xtron可以用来编写MakeCode Arcade游戏,也可以用作Scratch的游戏手柄,只需要简单几步,就可以实现.

  • Xtron开关键处于OFF位置,把Xtron用USB连接到电脑,这时候屏幕显示F4图案.

_images/F41.png _images/null3.png
  • 点击ovoblock网页或者软件上的【帮助】->【下载固件】获取flasher.uf2文件,把flasher.uf2文件复制到Xtron中。

    _images/gujian1.png
    _images/null3.png

    【Xtron 遥控器固件】可以让Xtron成为Scratch游戏的手柄,你可以用方向键和A B键来代替键盘上对应的按键。手柄有两个模式,一个是按键模式,另一个是重力加速度模式(体感模式),可以通过MENU按键来切换模式。

_images/null3.png
  • 按下RST按键,这时候屏幕是黑色的。现在,固件已经加载完成。

  1. 你可以在下面的两个平台上编写Scratch游戏:

(1)Ovoblock软件

Ovoblock是一款基于Scratch 3.0开发的电脑端编程软件,支持Mac、PC和浏览器平台,兼容Scratch 3.0的所有功能,同时也支持python语言开发。

Ovoblock下载链接:https://www.ovobot.cn/zh-hans/app/#Ovoblock

(2)Scratch官网:https://scratch.mit.edu/projects/editor/?tutorial=getStarted

  1. 下面是一些Scratch游戏课程,可以供你参考。当然不仅仅局限于下面的游戏,只要你编写的游戏可以用键盘来控制,那么同样也可以用Xtron来控制。

  • Xtron的4个方向键对应键盘的方向键

  • Xtron的A B按键对应键盘的按键A 以及按键B

第一课 走迷宫
今日任务:

今天我们将利用Scratch制作一个迷宫游戏,通过Xtron的上,下,左,右按键来移动人物,如果人物碰到迷宫墙壁则游戏失败。同时,如果碰到游戏中的巡逻兵也会失败。

任务拆解:

(1)利用什么工具绘制迷宫?

(2)人物如何接收键盘指令?

(3)如何判断碰到迷宫墙壁会失败?

(4)如何判定游戏胜利?

(5)如何让巡逻兵角色进行巡逻?

(6)如何判断碰到巡逻兵失败?

动手操作:

第一步:点选右下角舞台,选择背景。

_images/stage.png

用矩形工具绘制如下图形。

_images/background.png

第二步:点击选择角色,挑选一个你喜欢的角色。

_images/role.png

第三步:我们要实现的效果是小狗可以按照键盘指令移动。如果在移动过程中角色Dog1偏离路线碰到了墙壁则失败,移动到终点则成功! 一开始小狗从“起点开始”,注意下图x:和y:的大小,x和y的数值代表角色1的位置。 一开始默认的大小是100,如果你挑选的角色比较大,那么,修改大小值,使角色可以通过迷宫的一些空隙, 然后注意这个大小值,我们后面初始化的时候需要用到。

_images/dog1.png

(1)一开始,我们需要确定角色1出现的位置以及大小,还要设置翻转模式为左右翻转。

_images/dog1_example.png

(2)然后我们控制角色1移动。

_images/dog1_move_example.png

(3)添加一个食物角色,放在出口处。狗狗走出迷宫,吃到食物则游戏胜利。

(4)在移动的过程中,碰到迷宫黑色墙壁则失败,碰到食物则成功,但是无论成功还是失败,小狗都将重新返回到起点。

_images/dog1_success.png

(5)移动过程中,有的空隙很小,小狗过不去,我们用A按键让小狗变大,B按键让小狗变小。

_images/dog1_bigger.png

第四步:添加一个角色Ladybug2作为巡逻兵。

_images/Ladybug2.png

第五步:为Ladybug2添加脚本,让它可以满屏幕移动。

_images/Ladybug2_move.png

第六步:最终,角色Dog1的完整程序如下:

_images/Ladybug2_move_example.png
课后反思:

(1)为了增加游戏的趣味性一,可否增加时间限制功能?在规定的时间内没有过关就失败。

(2)为了增加游戏的趣味性二:在游戏中能否增加“传送门”角色?当主角碰到传送门的时候可以被“传送”?

第二课 人物控制
今日任务:

今天我们将制作一个游戏人物,这个游戏人物可以由Xtron的上,下,左,右按键来控制移动,还可以用A B按键做出“出拳”,“跳跃”的动作。

任务拆解:
_images/task.png
动手操作:

第一步:点击角色里的绘制按键,来绘制一个人物角色。

_images/draw_the_characters.png

第二步:绘制人物角色。

(1)绘制造型1如下:

_images/modelling1.png

(2)造型1绘制结束后,复制造型1,下方出现造型2,我们修改造型2为:

_images/modelling2.png

(3)再复制出一个造型3,修改如下:

_images/modelling3.png

第三步:我们为人物角色编写程序,按Xtron上,下,左,右按键的时候人物移动(只能左右翻转),按A按键出拳,按B按键跳跃。

_images/modelling_move.png

第四步:增加另外一个角色,作为我们的角色1的攻击对象,我们选择一个Bat角色。

_images/bat.png

第五步:为Bat角色编写代码,Bat随意的移动,当碰到人物角色的拳头是,说出“啊!”,然后消失。

程序如下:

_images/bat_example.png

第六步:为我们的游戏选择一个好看的背景.

_images/modelling_background.png
课后反思:

(1)请你自行设计“出腿”,“飞踹”等大招。

(2)当游戏人物攻击的时候,有时会出现这样一种情况,明明还没有出拳,但是敌人已经被击中消失了,这是为什么,怎么改进?

第三课 坦克控制
今日任务:

今天我们要制作一个可以利用Xtron的按键控制(上下左右)方向、发射子弹的坦克, 并且,当“子弹”击中敌方坦克时,敌方坦克会发生“爆炸”。

任务拆解:
_images/TKKZ1.png
动手操作:

第一步:绘制角色1(坦克)。小提示:用左侧的矩形工具绘制更方便!

_images/TKKZ2.png

第二步:绘制角色2(炮弹),可以使用毛笔工具绘制,数值可以设置为20。

_images/TKKZ3.png

两个角色(角色1、角色2绘制完如下):

_images/TKKZ4.png

第三步:为角色1添加脚本。

_images/TKKZ5.png

新建消息,输入新消息的名称fire。

_images/TKKZ6.png

第四步:为角色2添加脚本。

_images/TKKZ7.png

第五步:看运行结果。

_images/TKKZ8.png

第六步:接下来我们来创作子弹碰到敌方坦克后,敌方坦克“爆炸”的效果。

绘制角色3(敌方坦克):

_images/TKKZ9.png

为角色3 设计第二个爆炸造型:

_images/TKKZ10.png

为角色3 设计脚本:

_images/TKKZ11.png
课后思考:

(1)会用变量的同学可以思考一下怎么计分?(击中一辆敌方坦克+1分?)

(2)我们利用上面的程序制作出的我方坦克虽然可以上下移动,但是只能向上发射子弹, 怎么才能让我方坦克可以根据坦克面向的方向,向上下左右四个方向发射子弹呢?

第四课 接礼物大作战
今日任务:

今天我们要制作一个接礼物的scratch游戏,规则如下:

(1)玩家控制一个角色,该角色只允许在舞台下方左右移动并且由Xtron的按键控制方向;

(2)舞台上方会随即降落各种“礼物”,每种礼物的下落速度不同,接到每种礼物所得的分数也不相同,但接到“ghost”时会减分;

(3)游戏计时30秒,30秒内你所得分数小于20,则游戏失败,否则游戏胜利!

(4)再次点击绿旗可以重新开始游戏!

任务拆解:
_images/JLW1.png
动手操作:

第一步:新建角色1(汽车),也可以挑选一个你喜欢的角色。

_images/JLW2.png

第二步:新建一个变量score,我们准备用这个变量计得分!

_images/JLW3.png _images/JLW4.png

第三步:启动计时器。

_images/JLW5.png

第四步:创建角色2(香蕉),角色3(薯条),角色4(幽灵), 这样一来我们的四个角色就全部就位了,通过输入的数字决定角色的大小,将四个小角色缩小一些如下:

_images/JLW6.png

第五步:为角色1(汽车)编程。

1、

_images/JLW7.png

2、变量score清零,计时器清零;

3、要重复(判断)什么呢?

_images/JLW8.png

当然是要判断时间到了30秒以后,score有没有到30分,得到了30分胜利,没得到失败!

4、还没完,我们还忘了点儿啥?角色1还不能用键盘控制左右移动,这个怎么实现?

第六步:为角色2(香蕉)编程。

1、

_images/JLW9.png

2、角色2一开始要显示出来

_images/JLW10.png

3、一开始,确定角色2的位置(屏幕最上方,向下掉落,所以x和y应该是多少?)

_images/JLW11.png

4、要重复(判断)什么呢?

_images/JLW12.png

角色2可以向下掉落,在掉落过程中,没被角色1接住,碰到边缘了怎么办?

_images/JLW13.png

在掉落过程中,被角色1接住了,怎么办?

_images/JLW14.png

第七步:将角色2的程序复制给角色3或角色4,但是角色3和角色4的程序与角色2的程序可不能完全一致,我们可以对角色3和角色4的程序做一些变动,试想一下需要做什么变动?

第八步:运行你的程序,看结果。

课后反思:

(1)这个程序还有一些问题!作为新玩家,一开始是不知道你的游戏如何操作的,你能否想个什么办法介绍一下你的游戏?

(2)比如如何让你的角色1作为主持人?

(3)或者再新建一个主持人角色?

提示:

_images/JLW15.png
第五课 大鱼吃小鱼
今日任务:

(1)设计一条可以用键盘控制上下左右移动的鱼(角色1);

(2)当鱼(角色1)吃到比它大的鱼,游戏失败;

(3)当鱼(角色1)吃到比它小的鱼,自己的体型变大;

(4)当它吃到章鱼(角色4),自己的体型变小。

任务拆解:

(1)首先要绘制一条鱼(角色1);

(2)为这条鱼(角色1)编写脚本,实现键盘控制上下左右移动;

(3)新增被吃的鱼角色,当被吃的鱼碰到鱼(角色1)的嘴,判断谁的个头大,如果鱼(角色1)比自己大,那么自己被吃,鱼(角色1)长大一些。如果自己比鱼(角色1)大,那么游戏失败!

(4)同理,制作其他被吃的鱼和章鱼(角色4)。

动手操作:

第一步:绘制鱼(角色1);

(一)利用圆形工具和直线工具绘制出如下图形:

_images/DY1.png

(二)然后利用线条工具(我选了红色线条),在嘴部绘制两条线,如下图:

_images/DY2.png

(三)点击左下角转换为位图(用来填充鱼的嘴部)。

_images/DY3.png

(四)利用填色工具,选中透明色,将嘴部填充为透明色。

_images/DY4.png

(五)然后将该角色在舞台上摆放好,如下图:

_images/DY5.png

(六)接下来,进入角色1的造型界面,右击造型1复制出造型2。

_images/DY6.png

(七)将造型2的鱼尾部用橡皮擦擦除掉。

_images/DY7.png

(八)画上向另外一个方向摆动的鱼尾,请看下方对比图,注意尾巴方向的变化。

_images/DY8.png

(九)这条鱼(角色1)的两个造型完工,再导入其他3个角色图片。

_images/DY9.png

第二步:为角色2(或者角色3)编写脚本。

_images/DY10.png

第三步:为角色1编写脚本。

_images/DY11.png

第四步:请为剩下的角色编写(复制)脚本代码吧!

课后反思:

(1)如果作为一个完整的游戏,必须有胜利和失败的条件才行,那么这个游戏中,没有计时器也没有计分器,你能思考一下,这两个“器”怎么添加到程序中吗?

(2)关于这个程序,你还有没有其他想增加的游戏效果(内容),试着改一改,添一添吧!

第六课 弹珠游戏
今日任务:

(1)“木板”角色用来接球;

(2)“足球”角色不停弹跳,碰到边缘可以反弹;

(3)“足球”角色碰到木板会被反弹,碰到下方的蓝色区域失败,游戏结束。

_images/DZ1.png
任务拆解:
_images/DZ2.png
动手操作:

第一步:绘制木板(角色1),并让木板可以受按键控制左右移动。

_images/DZ3.png

将木板放置在舞台偏下的部分,然后为木板添加脚本,实现木板受按键控制可以左右移动的功能! (这段程序请同学们自行编写吧,难度等级:一颗星)

第二步:绘制下方的蓝色区域(角色2),球碰到此区域则失败!

_images/DZ4.png

第三步:导入球(角色3),我在此例中使用了篮球的角色。

_images/DZ5.png _images/DZ6.png

接下来,我们要思考的问题就是首先球可以移动起来,然后,碰到边缘就反弹,碰到木板也反弹,碰到下方蓝色区域就失败!所以,需要用到的指令是: 确定球一开始出现的位置,想想这步有没有必要?

_images/DZ7.png

球一开始的运动方向随机:

_images/DZ8.png

然后重复执行,重复执行什么呢?往下看:

_images/DZ9.png

球可以移动起来,并且碰到边缘反弹。

_images/DZ10.png

碰到木板角色怎么办?

_images/DZ11.png

(难点)碰到木板球的方向要改变:

_images/DZ12.png

那么,如果碰到下方蓝色区域呢?

_images/DZ13.png

试着把球的程序编出来吧!难点在小球碰到木板后,方向是如何改变的?

第四步:其实,完成了前面三步之后,你运行程序,如果脚本正确的话,你应该可以见到一个接弹珠小游戏被制作出来了。 但是,如果我们止步于此,就有点太可惜了,我们继续给这个游戏加点料!

再增加一个白球(角色4),我们可以把之前篮球的脚本复制给这个白球,但是,我不希望一开始屏幕上有两个球,而是玩家玩接篮球游戏过了10秒之后,这个白球才出现,作为游戏难度的提升,那么,想想,这个白球的脚本应该比篮球的脚本多什么? 提示:

_images/DZ14.png _images/DZ15.png
课后思考:

(1)接下来,我们还想让这游戏更好玩儿一点,我们想在上方加3个左右不停移动的木板,当弹珠碰到木板之后, 木板消失,加分,过一会木板还能再次显示。考虑一下,这个程序怎么完成?

_images/DZ16.png

(2)添加一个计时器,在规定时间内,得到相应的分数,过关,否则失败!

第七课 赛马
今日任务:

今天我要和同学们一起来设计一个赛马的小程序,你可以控制程序中的一匹马,然后按Xtron上的向右方向键(或其他按键),让这匹马跑起来,按下Xtron上的A键(或B键),马儿跳起来越过跑道上的蓝色线条。 当然,如果想成为第一匹冲线的小马,那就要看你的运气和按键的使用了!

任务拆解:
_images/SM1.png
动手操作:

第一步:设计游戏主场景、失败场景、胜利场景。

_images/SM2.png _images/SM3.png _images/SM4.png _images/SM5.png

第二步:确定主持人角色、小马角色(自己控制的小马, 通过颜色编辑的方式修改一下颜色,进行区分),将以上各个角色摆放至舞台之上,如下图:

_images/SM6.png _images/SM7.png

第三步:角色全部就位,下面我们要考虑如何脚本的问题了,我们先从主持人开始, 主持人的功能是讲解游戏规则和被点击之后游戏开始,我给大家些提示:

_images/SM8.png

如何实现支持人被点击后,游戏开始呢?

_images/SM9.png

想想!谁要接收这个广播呢?

不要以为上面的想清楚了就结束了, 这个主持人被点击之后还能一直待在舞台上么?如果想让这个主持人被点击之后消失掉,怎么实现?

_images/SM10.png

第四步:编程时,头脑一定要清晰,刚才我问了一个问题,谁应该接收start game广播呢?答案肯定是小马们了, 接下来就是比较关键的为小马编写脚本,我们这步先为陪跑的小马编写脚本,最后在为我们控制的小马编写脚本。

_images/SM11.png

给小马们设定一个初始位置x和y,统一在起跑线位置出发。

_images/SM12.png

这步有什么用?为什么是随机数?

_images/SM13.png

这个颜色就是终点线的颜色!

_images/SM14.png

陪跑的小马碰到终点线,应该有什么操作?想一想!

提示:

_images/SM15.png

这个hit可以理解为撞(终点)线的意思!那么,问题又来了,谁接收这个hit广播呢?

第五步:我们为自己控制的小马(本例中蓝色小马)编写脚本。

_images/SM11.png

给小马设定一个初始位置x和y,统一在起跑线位置出发。

_images/SM12.png

重复执行什么?我们这匹自己控制的小马身上肩负的使命可不少啊!首先,按下右键,他可以移动;其次,按下A或B键, 他可以跳跃;然后,如果他第一个冲到终点,游戏胜利!不是第一个冲到终点,游戏失败! 还有,碰到蓝色线条游戏失败!肩负着这么多使命(判断),头脑中的脚本就成型了。

右键移动:

_images/SM17.png

这步想明白了么?

_images/SM18.png

终点胜利:这步你好好想想!为啥自己控制的小马到了终点就胜利呢?

_images/SM19.png

A或B键跳跃:

_images/SM20.png _images/SM21.png

A或B键跳跃的脚本我实现的比较笨,你自己想想有没有更好的跳跃方式,可以越过蓝色线条!

碰到蓝色线条失败:

_images/SM22.png

或自己控制的小马脚本到这还么有结束,为啥?刚才我问了一个问题,为什么其他陪跑的小马碰到终点线要判断一下自己是不 是第一个过线的,那么自己控制的小马为什么不需要判断直接就认定游戏胜利呢? 原因是,那个hit的广播其实就是广播给自己控制的小马的!

_images/SM23.png

这下明白了吧!

第六步:把陪跑小马的脚本依次复制给角色2、4、5、6,别忘了改一下x和y的值!这是是否细心的问题,当然,如果没改出了错,你肯定也知道哪儿错了!

第七步:别忘了我们的场景哟!

_images/SM24.png

第八步:运行一下你的程序,看看有没有什么bug。

课后反思:

(1)如果一开始我不指定哪匹小马是我控制的,我在游戏中随机选择一个小马进行比赛,这个怎么实现?

(2)无论游戏胜利和失败,我想让主持人出来说胜利或失败,这个怎么实现?

第八课 深海大战
今日任务:

设计一款深海大战游戏,用Xtron按键左右控制一艘海面上的战舰,A或B键向下发射子弹,在海面下有虎视眈眈的潜艇,他们 可以向你发射子弹,还有无辜的潜水爱好者,甚至还有幽灵般出现的深水炸弹,你要尽可能多的击中潜艇,同时要避免杀害无 辜的潜水者。 同时,深水炸弹是一把双刃剑,你击中了炸弹,他可以帮助你消灭掉周围的潜艇,同时也会对你和潜水者造成同样的破坏性伤 害!

任务拆解:
_images/SH1.png
程序分析:

(1)背景:可分为正常背景和失败背景,云彩飘过效果(角色设计)。

(2)战舰:按键控制战舰的左右移动,按下A或B键可以发射一枚炮弹,炮弹的运动方向是从战舰中心处开始向下运动,那么,这里要强调一下,炮弹没有击中任何目标,碰到了海底(边缘)怎么办?

(3)潜水艇:随机从左右两侧出现,并分别向左右移动,那么,潜潜水艇碰到边缘如何?潜水艇被炮弹击中如何?潜水艇被鱼类击中如何?

(4)潜水员:随机从左右两侧出现,并向左或右移动,那么,潜水员碰到边缘如何?潜水员被炮弹击中如何?潜水员被鱼类击中如何?

(5)鱼雷:随机在海底出现(不能出现在空中),鱼雷被炮弹击中又如何?

动手操作:

第一步:场景分析,场景具备的功能是正常显示游戏界面和游戏失败后显示“game over!”

_images/SH2.png _images/SH3.png

场景一和场景二已经制作完毕,那么接下来就是场景上的云彩飘动效果了:

_images/SH4.png

我自己画了三个云彩角色,大家可以自己设计云彩的形状,绘制好之后,就是最重要的脚本环节了: 我仅以cloud1角色为例:

_images/SH5.png

剩下的cloud2和cloud3请大家自行制作吧!

第二步:主角战舰出场。

_images/SH6.png

下面我们来分析一下战舰的脚本:

_images/SH7.png

我们连同战舰发射的炮弹脚本在此一并解决吧!

_images/SH8.png _images/SH9.png _images/SH10.png

第三步:潜水艇出场。

_images/SH11.png

潜水艇的程序很冗长,一段完整的程序我截取了两部分, 下面连续两张图都是潜水艇的程序,我在此仅以潜水艇1为例讲解,潜水艇2的程序请自行编写,基本雷同!

_images/SH12.png _images/SH13.png

潜水艇2的脚本程序请大家自行编写吧! 连同潜水艇发射的炮弹我们在此一并解决吧!

_images/SH14.png

潜水艇发射的炮弹的脚本:

_images/SH15.png

艇我在这个程序中设计了两个潜水艇炮弹,但是scratch3.0版本里面有个克隆自己的功能,你可以试试能否通过克隆的方式克隆一个炮弹出来!另一个炮弹的程序请大家自行完成吧,在此不再赘述了!

第四步:鱼雷出场。

_images/SH16.png

鱼雷的脚本分析如下:

_images/SH17.png

第五步:潜水员出场。

_images/SH18.png

我们接下来分析潜水员的脚本,其实潜水员的脚本和刚刚介绍过的某个角色的脚本基本一样, 我估计大家都能猜出来了对吧?那么我就展示一下潜水员和潜水艇不一样的地方好了!

_images/SH19.png
课后思考:

(1)增加计时器提升难度?

(2)设计第2、3、4……关,如何体现难度升级?

(3)没有设计如何加分的功能,思考一下!

(4)能否为战舰设计两种以上的炮弹增加攻击威力?

第九课 智能小车巡线
今日任务:

设计一个可以按照指定路线行走的小车,我们之前见过的类似巡线小车多出自于lego等机器人小车,其实你有所不知,在scratch中实现小车巡线更加简单,效果也更加直观! 我们一起试一试吧!

任务拆解:
_images/XC1.png _images/XC2.png
程序分析:

(1)背景:绘制清晰的巡线背景;

(2)小车:绘制小车,头部侦测区域可用不同颜色区分。

动手操作:

第一步:绘制背景(角色1),3.0版本的矢量图模式很好用,建议多练习绘制复杂图形。

_images/XC3.png

第二步:绘制小车(角色2),将小车的头部左右两个“传感器”的颜色进行区分。

_images/XC4.png

第三步:编写小车脚本:

_images/XC5.png
课后思考:

(1)试着改变不同的旋转角度和步数,看看是否会运行出错?

(2)自己添加起点和终点。

(3)有没有更快速的侦测方法可以让小车快速到达终点,和同学们一起实验一下不同的算法,比一下谁到达终点所用时间更少?

第十课 坦克大战
今日任务:

将经典游戏《坦克大战》还原于scratch程序中,让学生体验真实游戏的设计流程和思路。

(1)玩家可以操控一辆己方坦克进行上下左右移动,在移动过程中,坦克会被障碍物阻挡无法逾越,必须绕道,玩家可以按下A或B键发射子弹,为了避免子弹的连发,程序中添加了防止连发的指令;当玩家的子弹击中障碍物,障碍物会短暂消失,然后还会再度出现,同时,当子弹击中了地方坦克,地方坦克会消失,一会儿还会随机出现。

(2)地方坦克会在第三个不同的位置随机出现,并且可以边移动边发射子弹,敌方子弹击中障碍物会击毁障碍物,同时,敌方坦克击中castle或者击中己方坦克,游戏gameover!

本课重难点:

(1)如何实现己方坦克通过判断炮管的位置向不同方向发射子弹?

(2)敌方坦克在地图中应该如何移动?

(3)敌方坦克碰到障碍物应该作何反应?

(4)敌方坦克向不同方向开火问题如何解决?

(5)我方坦克、敌方坦克击中不同目标的判断?

(6)游戏失败的定义?

_images/TK1.png
任务拆解:
_images/TK2.png
程序分析:

(1)背景:可分为正常背景和失败背景;

(2)己方坦克:Xtron的上下左右键控制坦克的移动;A或B键控制坦克发射子弹;发射子弹的瞬间判断坦克的朝向,可以实现向四个不同的方向发射子弹;被障碍物阻挡做出反应;

(3)敌方坦克:在屏幕指定位置出现;在屏幕上移动,移动过程中碰到障碍物和边缘做出反应;可以向四个不同的方向发射子弹;

(4)障碍物:被击中后一段时间内消失不再出现;阻挡坦克。

动手操作:

第一步:搞定背景,共两个背景1和2;1为白色背景,2为game over背景!

_images/TK3.png

第二步:搞定己方坦克(Sprite1)。

_images/TK4.png

首先完成Sprite1的绘制工作:

_images/TK5.png

然后搞定Sprite1的脚本:

(1)控制己方坦克上下左右移动的脚本,不解释。

_images/TK6.png

(2)向不同方向开火的脚本的解决方案。

_images/TK7.png

(3)在移动中碰到障碍物或者被敌方坦克子弹击中的解决方案。

_images/TK8.png

第三步:己方坦克(Sprite1)发射子弹解决方案。

_images/TK9.png _images/TK10.png _images/TK11.png _images/TK12.png

第四步:障碍物解决方案。

_images/TK13.png _images/TK14.png

第五步:敌方坦克解决方案。

_images/TK15.png _images/TK16.png

第六步:己方坦克子弹解决方案。

_images/TK17.png _images/TK18.png _images/TK19.png

第七步:castle“老巢”解决方案。

_images/TK20.png _images/TK21.png

学案中没有列举出更多的程序,比如另外两个敌方坦克、敌方坦克子弹和其他障碍物的脚本,大同小异,请自行设计!

课后反思:

(1)该游戏中没有设置胜利的条件,思考一下?

(2)如何实现坦克朝着castle的方向移动攻击,而不是漫无目的的闲逛?

(3)作为一个游戏来说,没有添加计时器和积分变量显然是不合适的,自行添加吧!

第十一课 下100层地狱
今日任务:

将网络上一款同名游戏尝试在scratch中制作出来,用Xtron的上下左右键控制一个主角(可以滚动的球)左右移动,小球自由 落地式下降,木板向上的移动速度也会越来越快!这些都意味着游戏的进行会越来越难,屏幕上有记录“层数”和“速度”的提示 框,同时还会显示小球的瞬时速度、自由落体时间、快制作出来试试看你可以下到多少层?

本课重难点:

(1)小球自由落体的实现?

(2)小球移动+滚动效果?

(3)木板难度提升效果?

(4)如何避免小球碰到木板时嵌入进去的bug?

_images/XDY1.png
任务拆解:
_images/XDY2.png
程序分析:

(1)背景:可分为正常背景和失败背景;

(2)主角球:Xtron的上下左右键控制球的移动;如何实现球的滚动效果,并且在运功过程中如何实现球的一边滚动 一边移动的效果,这样才够真实!最重要的是如何实现小球的自由落地效果?

_images/XDY3.png

(3)楼层:下方随机出现;出现后均向上移动;向上移动的速度不断增加,游戏难度因此不断提升!

(4)变量:记录所下降楼层的变量;记录楼层上升的速度提升值;记录小球每个自由落体的瞬时速度;记录小球自由落体的 分段时间。

动手操作:

第一步:搞定背景!

_images/XDY4.png

背景脚本:

开始显示初始背景:

_images/XDY5.png

游戏失败显示失败背景:

_images/XDY6.png

第二步:搞定主角“小球”!

_images/XDY7.png

小球的脚本:

在讲解小球的脚本及后续其他角色的脚本之前,先来理一下我的程序中有多少角色即将出场。

_images/XDY8.png

一目了然,不用过多解释了吧?小球,之后是四个下方随机出现的木板(block1/2/3/4)!好,我们继续讲小球的脚本程序: 旋转+移动=滚动!

_images/XDY9.png _images/XDY10.png

接下来,下面这些模块判断些什么呢?

_images/XDY11.png _images/XDY12.png

继续向下看:

判断一:

_images/XDY13.png

判断二:

_images/XDY14.png

第三步:搞定木板(以其中block2为例讲解,其余的自行设计就OK了,看懂一个就行了)

_images/XDY15.png

木板脚本:

前面留了一个问题,速度增加其实就是一个变量,为了增加游戏难度设定的变量,目的是让木板的移动速度越来越快!

_images/XDY16.png

下面这些模块判断些什么呢?

_images/XDY11.png _images/XDY12.png

判断一:

_images/XDY17.png

判断二:

_images/XDY18.png

第四步: 请各位自行完成其他几个木板角色的设计吧!

课后反思:

(1)本程序有个问题,也是从大鱼吃小鱼开始我一直没有完美解决的问题,小球碰到木板加一层分数,但是小球只要和木板有接触,就会不停的加分,这个问题我只能退而求其次在程序中放到了木板消失加分!大家看看有没有好的解决方法!

(2)小球碰到了左右边缘也会game over,思考一下这个问题如何解决?

(3)专业一点的书籍上有关于g和scratch步长的换算,感兴趣的亲们自行研究一下!

Xtron Python 指南

开始编程前,首先需要导入必要的库:

from microbit import *
from ovobot import *

以下是使用python给Xtron三合一掌机编程的快速参考,如果你是第一次给Xtron掌机编程请先阅读接下来的部分:

灯光

pyb.ledx.action()

Xtron板载上有2个LED灯,分别为led1、led2,可以分别控制两个灯的点亮和熄灭 这两个LED灯还用来作为状态的指示灯,比如充电时led1亮红灯,下载代码时led1闪红灯,开机时led2亮蓝灯后熄灭。

参数
  • ledx (int) – x可以为1或2,分别用来选择控制led1或者led2点亮和熄灭。

  • action (int) – off:熄灭,on:点亮。

例子:

import pyb
import time

pyb.led_1.on()
time.sleep(0.5)
pyb.led_1.off()
time.sleep(0.5)
pyb.led_2.on()

解析:当xtron启动时,点亮板载上的led1灯,等待0.5秒后,熄灭板载上的led1灯,再等待0.5秒后,点亮板载上的led2灯。

pyb.ledx.toggle()

电平反转就是数字电路的某个端口(输入或者输出)的状态从一个状态转换到另一个状态,如从“1”变化到“0”, 数字电路的状态转换时间非常短,理想认为转换时间为0,这个变化过程就叫电平转换。 即Xtron的led灯从点亮变为熄灭,或者从熄灭变为点亮。 板载上有两个led灯,分别为led1、led2,可以分别控制两个led灯进行电平反转。

参数

ledx (int) – x可以为1或2,分别用来选择控制led1或者led2电平反转。

例子:

import pyb
import time

pyb.led_1.on()
time.sleep(2)
pyb.led_1.toggle()

解析:当xtron启动时,点亮板载上的led1灯,等待2秒后,熄灭板载上的led1灯电平反转,即Xtron的led1灯从点亮变为熄灭。

pyb.ledx.intensity(value)

设置Xtron板载的led灯的亮度,数值范围为0~255。 在点亮LED之后再设置亮度才生效,而且只调节前面程序里已经点亮的LED灯的亮度值。

参数
  • ledx (int) – x可以为1或2,分别用来选择控制led1或者led2的亮度。

  • value (int) – 设置板载上对应led的亮度,数值范围为0~255,数值越大,对应的光亮度越高。

例子:

from button import Button
import pyb

def xtron_button_a_pressed(pin):
  pyb.led_2.on()
  pyb.led_2.intensity(255)

button_a = Button('A',callback=xtron_button_a_pressed)

解析:当xtron的A键被按下时,点亮板载上的led2灯,并且调节灯光亮度至255,led的亮度,数值范围为0~255。

setrgbhexcolor(rgbledIndex, color)

Xtron上有4个RGB彩灯,可以分别设置不同的颜色,通过颜色、饱和度、亮度来调节颜色,数值范围均为0~100。 点击颜色下方的【滴管图标】还可以从已有的角色中一键获取角色上的任意颜色。

参数
  • rgbledIndex (int) – 选择控制板载上彩色灯,从左往右依次为1-2-3-4。

  • color (int) – 设置颜色值,例如”#ff0000”代表红色,”#000000”代表黑色.

例子:

import pyb
from neopixel import *

setrgbhexcolor(1,'#1dc83a')
setrgbhexcolor(2,'#000000')
setrgbhexcolor(3,'#ff0000')
setrgbhexcolor(4,'#ffffff')

解析:Xtron上有4个RGB彩灯,可以分别设置不同的颜色。 当xtron启动时,板载上的RGB灯被点亮,颜色分别为绿色、黑色、红色、白色。

setAllcolor(color)

Xtron上有4个RGB彩灯,可以分别设置不同的颜色,通过颜色、饱和度、亮度来调节颜色,数值范围均为0~100。 同样的,还可以从选择的角色中一键吸取已有的颜色。 和上面的程序块的区别是,上面的是单独设置某一个RGB灯,这个程序块则是同时设置所有的RGB灯。

参数

color (int) – 选择控制板载上所有led彩灯的颜色。

例子:

import pyb
from neopixel import *
import time

setrgbhexcolor(1,'#1dc83a')
setrgbhexcolor(2,'#000000')
setrgbhexcolor(3,'#ff0000')
setrgbhexcolor(4,'#ffffff')
time.sleep(3)
setAllcolor('#e244d1')

解析:Xtron上有4个RGB彩灯,可以分别设置不同的颜色。当xtron启动时,板载上的RGB彩灯被点亮, 颜色分别为绿色、黑色、红色、白色。等待3秒后,板载上的4个RGB彩灯颜色全部变为紫色。

setbrightness(value)

用来设置Xtron板载的RGB灯的亮度。 设置亮度值之后,再设置RGB灯的颜色,亮度值才生效。 如果你想改变亮度值的话,你需要设置亮度值之后,再次设置一下对应的RGB灯颜色。

参数

value (int) – 设置Xtron板载的RGB彩灯的亮度。

例子:

import pyb
from neopixel import *

setbrightness(0.5)
setrgbhexcolor(1,'#1dc83a')
setrgbhexcolor(2,'#000000')
setrgbhexcolor(3,'#ff0000')
setrgbhexcolor(4,'#ffffff')

解析:设置Xtron板载的RGB彩灯的亮度,只有先设置好亮度值,再设置RGB彩灯的颜色,亮度值才生效。 当xtron启动时,板载上的RGB彩灯被点亮,颜色分别为绿色、黑色、红色、白色。

colour_rgb(red, green, blue)

颜色值动态设置,分别设置red红色、green绿色、blue蓝色的数值,数值范围为0~255。

参数

red green blue (int) – 设置板载上对应RGB彩灯的数值,数值范围为0~255。

显示

lcd.clearScreen()

用来清空LCD屏幕上之前显示的所有内容。在同一个位置显示不同的内容,如果不清空,会和之后显示的内容重叠。

例子:

import pyb
import lcd
import time

lcd.drawText(2,2,'Hello',2)
time.sleep(0.5)
lcd.clearScreen()
lcd.drawText(2,2,'Friend',2)
time.sleep(0.5)
lcd.clearScreen()

解析:当xtron启动时,在坐标轴(x=2,y=2)处,显示文本内容:”Hello”,颜色为红色。 等待0.5秒后,清空这个文本,然后在相同位置显示下一文本内容:”Friend”,颜色同样为红色。再等待0.5秒后,清空这个文本。

lcd.setBgColor(colorIndex)

该积木块可以设置屏幕的背景色,一共有16个颜色可以选择,其中第一个颜色是透明色。

参数

colorIndex (int) – 设置屏幕的背景色,一共有16个颜色可以选择,其中第一个颜色是透明色。。

lcd.show()

在设置好屏幕背景以及屏幕显示内容后,加上显示生效积木块,屏幕上才会显示我们设置好的背景及内容。

lcd.drawText(x, y, string, colorIndex)

把文本内容显示在某个坐标(x,y)处。 文本内容可以是字母、数字,暂时不支持中文显示。 坐标的范围是X:0~160, Y: 0~128 文本内容有16个颜色可选,其中第一个颜色是透明色。

参数
  • x y (int) – 通过x轴和y轴的距离,将文本显示在特定的坐标(x,y)上,坐标的范围是X:0~160, Y: 0~128。

  • string (int) – 文本内容可以是字母、数字,暂时不支持中文显示。

  • colorIndex (int) – 文本内容有16个颜色可选,其中第一个颜色是透明色。

lcd.drawHline(x, y, len, color)

绘制线一条水平的线段,在某个坐标(x,y)绘制一条水平的线段,线的长度≤显示屏的长度。 坐标的范围是X:0~160, Y: 0~128,线段长度+ X的坐标<160,否则线段显示不完整。 所有绘制的图案,都要加上显示生效积木块,才会在屏幕上显示出来。 文本内容有16个颜色可选,其中第一个颜色是透明色。

参数
  • x y (int) – 在某个坐标(x,y)绘制一条水平的线段,坐标的范围是X:0~160, Y: 0~128。

  • len (int) – 线的长度≤显示屏的长度。

  • color (int) – 文本内容有16个颜色可选,其中第一个颜色是透明色。

lcd.drawVline(x, y, len, color)

绘制线一条垂直的线段,在某个坐标(x,y)绘制一条垂直的线段,线的长度≤显示屏的长度。 坐标的范围是X:0~160, Y: 0~128,线段长度+ Y的坐标<128,否则线段显示不完整。 所有绘制的图案,都要加上显示生效积木块,才会在屏幕上显示出来。 文本内容有16个颜色可选,其中第一个颜色是透明色。

参数
  • x y (int) – 在某个坐标(x,y)绘制一条垂直的线段,坐标的范围是X:0~160, Y: 0~128。

  • len (int) – 线的长度≤显示屏的长度。

  • color (int) – 文本内容有16个颜色可选,其中第一个颜色是透明色。

lcd.drawLine(x1, y1, x2, y2, color)

绘制一条线段,绘制一条从一个坐标(x1,y1)到另一个坐标(x2,y2)的线段。 坐标的范围是X:0~160, Y: 0~128 和上一个积木块的区别是,这个积木块绘制的线段是任意的方向,上一个只能是水平或者垂直方向。 文本内容有16个颜色可选,其中第一个颜色是透明色。

参数
  • x1 y1 x2 y2 (int) – 确定坐标1(x1,y1)和坐标2(x2,y2)的位置,坐标的范围是X:0~160, Y: 0~128。

  • color (int) – 文本内容有16个颜色可选,其中第一个颜色是透明色。

lcd.drawRect(x, y, width, height, color)

绘制一个空心矩形,在某个坐标(x,y)处绘制一个矩形,通过设置矩形的宽和高来设置矩形的大小。 坐标的范围是X:0~160, Y: 0~128。 如果坐标值加上矩形大小,超过了显示范围,会显示不完整。 文本内容有16个颜色可选,其中第一个颜色是透明色。

参数
  • x y (int) – 在某个坐标(x,y)处绘制一个空心矩形,坐标的范围是X:0~160, Y: 0~128,如果坐标值加上矩形大小,超过了显示范围,会显示不完整。

  • width (int) – 设置空心矩形的宽。

  • height (int) – 设置空心矩形的高。

  • color (int) – 文本内容有16个颜色可选,其中第一个颜色是透明色。

lcd.fillRect(x, y, width, height, color)

绘制一个实心矩形,在某个坐标(x,y)处绘制一个实心矩形,通过设置矩形的宽和高来设置矩形的大小。 坐标的范围是X:0~160, Y: 0~128。 如果坐标值加上矩形大小,超过了显示范围,会显示不完整。 文本内容有16个颜色可选,其中第一个颜色是透明色。

参数
  • x y (int) – 在某个坐标(x,y)处绘制一个实心矩形,坐标的范围是X:0~160, Y: 0~128,如果坐标值加上矩形大小,超过了显示范围,会显示不完整。

  • width (int) – 设置实心矩形的宽。

  • height (int) – 设置实心矩形的高。

  • color (int) – 文本内容有16个颜色可选,其中第一个颜色是透明色。

lcd.circle(x, y, radius, color)

绘制一个空心圆形,在某个坐标(x,y)绘制一个空心圆形,通过设置圆的半径来改变圆的大小。 坐标的范围是X:0~160, Y: 0~128 如果坐标值加上圆形大小,超过了显示范围,会显示不完整。 文本内容有16个颜色可选,其中第一个颜色是透明色。

参数
  • x y (int) – 在某个坐标(x,y)绘制一个空心圆形,通过设置圆的半径来改变圆的大小。坐标的范围是X:0~160, Y: 0~128。

  • radius (int) – 确定好空心圆的圆心(x,y)后,通过设置圆的半径来改变圆的大小。

  • color (int) – 文本内容有16个颜色可选,其中第一个颜色是透明色。

lcd.fill_circle(x, y, radius, color)

绘制一个实心圆形,在某个坐标(x,y)绘制一个实心圆形,通过设置圆的半径来改变圆的大小。 坐标的范围是X:0~160, Y: 0~128 如果坐标值加上圆形大小,超过了显示范围,会显示不完整。 文本内容有16个颜色可选,其中第一个颜色是透明色。

参数
  • x y (int) – 在某个坐标(x,y)绘制一个实心圆形,通过设置圆的半径来改变圆的大小。坐标的范围是X:0~160, Y: 0~128。

  • radius (int) – 确定好实心圆的圆心(x,y)后,通过设置圆的半径来改变圆的大小。

  • color (int) – 文本内容有16个颜色可选,其中第一个颜色是透明色。

lcd.triangle(x1, y1, x2, y2, x3, y3,color)

绘制一个空心三角形,通过设置三个点的坐标(x1,y1)、(x2,y2)、(x3,y3)来绘制一个空心三角形。 设置三角形三个点的坐标,如果坐标值加上三角形大小,超过了显示范围,会显示不完整。 坐标的范围是X:0~160, Y: 0~128 文本内容有16个颜色可选,其中第一个颜色是透明色。

参数
  • x1 y1 x2 y2 x3 y3 (int) – 通过设置三角形三个点的坐标(x1,y1)、(x2,y2)、(x3,y3)来绘制一个空心三角形。坐标的范围是X:0~160, Y: 0~128。

  • color (int) – 文本内容有16个颜色可选,其中第一个颜色是透明色。

lcd.fill_triangle(x1, y1, x2, y2, x3, y3,color)

绘制一个实心三角形,通过设置三个点的坐标(x1,y1)、(x2,y2)、(x3,y3)来绘制一个实心三角形。 设置三角形三个点的坐标,如果坐标值加上三角形大小,超过了显示范围,会显示不完整。 坐标的范围是X:0~160, Y: 0~128 文本内容有16个颜色可选,其中第一个颜色是透明色。

参数
  • x1 y1 x2 y2 x3 y3 (int) – 通过设置三角形三个点的坐标(x1,y1)、(x2,y2)、(x3,y3)来绘制一个实心三角形。坐标的范围是X:0~160, Y: 0~128。

  • color (int) – 文本内容有16个颜色可选,其中第一个颜色是透明色。

(colour_rgb(value, value, value)

用来设置RGB的颜色,在设置屏幕颜色或者画笔颜色的时候,可以用指定的RGB的值来设置颜色。 红绿蓝三种颜色的数值范围分别为0~255。 比如红色有很多种:粉红(255,192,203),深红(220,20,60),淡紫红(255,240,245),弱紫罗兰红(219,112,147), 深粉红(255,20,147)等,我们通过设置不同的RGB值就可以精确的显示不同的颜色。

参数

value (int) – 红绿蓝三种颜色的数值范围分别为0~255。

声音

music.pitch(频率,持续时间= -1,pin = microbit.pin0,wait = True)

该积木块可以播放音符,音符以及节拍长度可以在下拉框里选择。 点击音符,显示的是中央C的音调,可以用左右两边的箭头来切换高低音,左边是低音,右边是高音。 详情请参考:https://microbit-micropython.readthedocs.io/en/latest/music.html

C调中,C、D、E、F、G、A、B分别对应简谱中的1、2、3、4、5、6、7,一个唱名为四分音符持续1个节拍,下方有一个横杠的是八分音符持续1/2节拍, 音符后有一个横杠的为二分音符持续2个节拍,同学们按照音符和节拍数编写整段音乐。

参数
  • note (int) – 默认选择播放的音符为0,即代表暂停播放。

  • beat (int) – 音符播放的节拍数,节拍数为500的倍数,倍数范围为1/16~4。

例子:

from microbit import *
import music


music.pitch(262 , 500 , pin=pin0 , wait=True)
music.pitch(330 , 1000 , pin=pin0 , wait=True)

解析:当绿旗被点击时,播放C音符持续一个节拍,然后播放E音符持续一个节拍。

music.stop(pin = microbit.pin0)

在给定的引脚上停止所有音乐播放,例如:music.stop(pin1)。 如果没有给出引脚,例如:music.stop()假设为pin0。

参数
  • note (int) – 默认选择播放的音符为0,即代表暂停播放。

  • beat (int) – 音符播放的节拍数,节拍数为500的倍数,倍数范围为1/16~4。

music.stopPlay()

停止播放所有声音。

事件

import pyb
pass()

当启动Xtron三合一掌机时,执行此模块下方的程序。

例子:

import pyb
import music

music.pitch(262 , 500 , pin=pin0 , wait=True)

解析:当启动Xtron三合一掌机时,播放C音符持续一个节拍。

from button import Button
def xtron_button_x_pressed(pin):
pass()
button_x = Button('ID',callback=xtron_button_x_pressed)

选择xtron按键触发事件的回调函数。当对应Xtron的按钮被按下时,执行此模块下方的程序。

参数
  • x (int) – 按钮回调事件,返回按键事件实例,x包括”a”A键,”b”B键,”up”方向键上,”down”方向键下, “left”方向键左,”right”方向键右,”menue”菜单键。

  • ID (int) – 注册回调事件,ID为按钮唯一标识符,ID包括”a”A键,”b”B键,”up”方向键上,”down”方向键下, “left”方向键左,”right”方向键右,”menue”菜单键。

控制

import time
time.sleep(n)

等待n秒后执行其下方的程序,n可以是整数或浮点数。

参数

n (int) – 控制xtron执行的指令停止执行指定的时间(秒)。

for count in range(n):

重复执行其内部程序n次,n只能是整数。

参数

n (int) – 控制xtron重复执行其内部程序n次。

while True:

重复执行程序块内部包含的程序。

if False:

当下面的程序条件满足时,执行程序块内部的程序。

if False:
pass()
else:

当下面的程序条件满足时,执行那么内部的程序,不满足时执行否则内部的程序。

while not False:

等待直到条件为真时才继续执行接下来的程序。

while not False:

重复执行其内部的程序,直到下面的程序条件满足时,才执行程序下方的程序。

侦测

read_light_level()

测量光照射的强度。

acc.get_g_x()

反馈Xtron陀螺仪的俯仰、横滚和侧偏的角速度。陀螺仪传感器可用于检测Xtron的旋转角速度,并可以计算旋转的角度。 :param int x: x代表俯仰,y代表横滚,z代表侧偏。

acc.get_ac_x()

根据x、y、z方向,以正整数或负整数获取轴上的加速度测量值,测量单位为毫克。 默认情况下,加速度计的配置范围为+/- 2g,因此此方法将在+/- 2000mg范围内返回。

参数

x (int) – 可选择返回x轴、y轴或z轴的加速度值,x代表x轴,y代表y轴,z代表z轴。

BitCon简介

BitCon Scratch 指南

  • 以下是使用Scratch给BitCon编程的快速参考, 大多数的积木块功能根据文字描述就可以了解。

  • 对积木块参数范围,或者是使用方法不确定的,你可以根据下面对积木块的介绍以及简单的例子来深入的理解。

基础积木块编程指南

遥控器

摇杆程序块
_images/rocker.png

选择摇杆LX、LY、RX、RY,L、R代表左右方向。 BitCon是一款智能编程手柄,基于micro:bit,配置了6个可编程按键、2个全向摇杆、加速度传感器和电子罗盘, 并拥有一个5x5点阵显示屏,可以显示图案、数字和字符等。 BitCon有蓝牙和2.4G两种无线通信方式,可以使用摇杆、 按键和重力感应来控制另外一块micro:bit主板或者Ovobot Bit机器人。

判断按键程序块
_images/judge_color_button.png

BitCon有6个可编程按键,分别为绿色、蓝色、红色、黄色、左上方、右上方按键, 当按键被按下时,可以控制另外一块micro:bit主板或者Ovobot Bit机器人。 也可以连接到电脑,可以使用Ovoblock进行编程来与动画或者游戏角色互动, 还可以与Scratch互动,编写一个Scratch游戏,使用BitCon来闯关。

外观

显示字符程序块
_images/show_string.png

可以控制Bit机器人点阵屏显示相应的字符,选择“等待”即执行完这条指令才会执行下一条指令, “继续”即执行这条指令同时执行下一条指令。

显示图案程序块
_images/show_image.png

点击显示图案程序块的下拉列表,出现图案绘制面板,绘制相应的图案。绘制图案时,可以一键熄灭或点亮所有LED,点击灰色小方格点亮相应的LED。

熄灭屏幕程序块
_images/hide_all_matrix.png

熄灭Bit机器人LED点阵屏。

点亮坐标程序块
_images/light_axis.png

点亮Bit机器人LED点阵屏上某个坐标的LED,x、y的数值范围为0~4,零点在点阵屏的左上角,水平向右为x轴,竖直向下为y轴。

设置坐标程序块
_images/show_on_the_axis.png

分别设置x或y轴的高度。

获得坐标亮度程序块
_images/get_light.png

获得x或y轴的坐标亮度。

声音

播放音符程序块
_images/play_tone.png

Ovoblock的程序块是使用五线谱的音名来显示的,在C调的乐谱中,它们之间的对应关系如下。

_images/music.png

C调中,C、D、E、F、G、A、B分别对应简谱中的1、2、3、4、5、6、7,一个唱名为四分音符持续1个节拍,下方有一个横杠的是八分音符持续1/2节拍, 音符后有一个横杠的为二分音符持续2个节拍。

暂停播放节拍程序块
_images/rest.png

设置暂停播放的节拍数。

无线通讯

控制无线通讯程序块
_images/wireless_communication.png

控制打开、接收、复位无线通讯。

发送无线消息程序块
_images/send_wireless_message.png

发送无线消息。

发送无线消息列表程序块
_images/send_containing_bytes.png

发送无线消息列表。

接收无线消息程序块
_images/receive_wireless_message.png

接收无线消息。

接收无线消息列表程序块
_images/receive_wireless_containing.png

接收无线消息列表。

设置无线讯息频道程序块
_images/set_wireless_channel.png

设置无线讯息频道。

事件

遥控器启动程序块
_images/start_remote.png

判断当Bitcon遥控器启动时,执行下一步操作。

判断Bitcon按键按下程序块
_images/color_button.png

BitCon有6个可编程按键,分别为绿色、蓝色、红色、黄色、左上方、右上方按键,当某一按键被按下时,执行下一步操作。

侦测

判断姿态程序块
_images/gesture.png

判断Bit的姿态,执行程序块下方的程序。

加速度程序块
_images/acceleration.png

返回Bit的x、y和z三个轴的加速度值。

指南针角度程序块
_images/compass_angle.png

返回Bit机器人头部朝向与地球北极方向的夹角,数值范围为顺时针0~359度。

指南针磁场强度程序块
_images/compass_magnetic_density.png

反馈当前环境中总磁场强度,单位是纳特斯拉。用磁铁靠近电子罗盘,看看磁场强度有什么变化。

校正指南针程序块
_images/correcting_compass.png

校正指南针。

温度程序块
_images/temperature.png

反馈温度传感器检测到的温度值。

亮度级别程序块
_images/light_level.png

反馈光敏传感器感应环境光线的强度。可以尝试修改亮度级别,看看不同级别对应什么样的亮度。

运行时间程序块
_images/running_time.png

反馈Bit机器人的运行时间。

视觉识别摄像头积木块编程指南

实时调试的时候MU跑完一次要复位

视觉识别

初始化端口程序块
_images/initialization_port.png

MU00代表智能识别摄像头,此外还包括MU01、MU10、MU11等摄像头,初始化端口程序块 即初始化所设置的摄像头和端口。

恢复默认设置程序块
_images/restore_the_default.png

将智能识别摄像头恢复默认设置。

算法检测程序块
_images/algorithm_testing.png

智能识别摄像头可以检测各种算法,算法包括色块检测、颜色识别、球体检测、人体检测、形状卡片、交通卡片、数字卡片。

判断摄像头检测程序块
_images/camera_detection.png

判断智能识别摄像头是否检测到某种算法,然后执行下一条指令。

检测到颜色识别程序块
_images/color_recognition_detected.png

判断智能识别摄像头是否检测到设置坐标的颜色识别,然后执行下一条指令。

检测到色块颜色程序块
_images/patch_testing.png

判断智能识别摄像头是否检测到黑、白、红、黄等色块,然后执行下一条指令。

获取算法程序块
_images/acquisition_algorithm.png

获取选定智能识别摄像头的纵向坐标、横向坐标、宽度、高度的算法检测。

获取颜色识别程序块
_images/get_color_recognition.png

获取智能识别摄像头在红、绿、蓝等不同通道的颜色识别。

获得算法形状卡片程序块
_images/get_shape_card.png

获得算法形状卡片,钩、叉、圆形、三角形,用来执行下一条特定的指令。

获得算法交通卡片程序块
_images/transportation_card.png

获得算法交通卡片,向左、向右、掉头、停车,用来执行下一条特定的指令。

获得算法数字卡片程序块
_images/digital_card.png

获得算法数字卡片,0~9,用来执行下一条特定的指令。

获得算法颜色识别程序块
_images/color_identification.png

获得算法颜色识别,不同颜色执行不同的指令。

LED识别颜色程序块
_images/recognize_color.png

分别设置led1、led2识别到某种颜色或未识别到某种颜色,执行下一条指令。

设置算法性能程序块
_images/algorithm_performance.png

可以对算法进行优先级排序,设置某种算法的速度优先、性能均衡或准确率优先。

数码变焦程序块
_images/digital_zoom.png

设置智能识别摄像头的数码变焦,分为自动及1~5个等级。

摄像头白平衡程序块
_images/camera_white_balance.png

设置智能识别摄像头的白平衡,分为自动、锁定白平衡、白光模式和黄光模式。

高帧率模式程序块
_images/high_frame_rate.png

设置智能识别摄像头的高帧率模式。

基础扩展包积木块编程指南

基础扩展

控制马达输出程序块
_images/control_motor_output.png

控制马达的输出,数值范围为0~255。

控制舵机旋转程序块
_images/steering_gear_rotating.png

控制舵机旋转度数,数值范围为-90~90。

设置LED灯带颜色程序块
_images/LED_lamp_shade.png

设置LED灯带的颜色,可以分别设置1~11的灯带,也可以一键设置全部灯带颜色,颜色为红橙黄绿蓝靛紫黑白。

数码管数值显示程序块
_images/digital_tube_value.png

实时反馈数码管显示的数值。

触摸按键被按下程序块
_images/press_the_touch_button.png

判断触摸按键是否被按下,执行下一条指令。

温湿度传感器程序块
_images/onboard_temperature.png

反馈温湿度传感器的板载温度、板载湿度以及扩展温度。

电位器数值程序块
_images/potentiometer_value.png

反馈电位器的数值。