本次的任务:
基于彩屏驱动函数(已经实现贪吃蛇向右移动),实现贪吃蛇上下左右移动。
我们首先学习一下目前工程的的基本代码结构,这一部分其实在教学课程中有介绍,首先对于屏幕的驱动这里就不需要再复述了,主要的结构包括小蛇的结构体以及循环1s绘制新的位置。
目前的教学工程中已经实现了循环贪吃蛇向右移动,我们本次主要实现上下左右的移动控制,这里我们主要加入的就是模块上4个按键的控制与上下左右的移动的关联。
我们首先要清楚在移动的时候会有个方向的问题,这个时候我们要在my_eat_snake结构体重增加一个成员就是snake_body_dir,咱们这里规定一下关联,就是当A对应上,B对应下,X对应左,Y对应右,在水平移动的时候只能相应上下的按键操作,上下移动的时候只能响应左右按键的操作。
接下来我们就修改snake_move(),函数的内容:
void snake_move(){ uint16_t i; for( i = eat_snake.snake_body_len - 1; i > 0; i--){ eat_snake.my_snake_body[i].iX = eat_snake.my_snake_body[i-1].iX; eat_snake.my_snake_body[i].iY = eat_snake.my_snake_body[i-1].iY; } if(eat_snake.snake_body_dir == 0){ eat_snake.my_snake_body[0].iX += eat_snake.snake_body_width; if(eat_snake.my_snake_body[0].iX > 230){ eat_snake.my_snake_body[0].iX = 10; } eat_snake.my_snake_body[0].iY += 0; } else if(eat_snake.snake_body_dir == 1){ eat_snake.my_snake_body[0].iX -= eat_snake.snake_body_width; if(eat_snake.my_snake_body[0].iX < 10){ eat_snake.my_snake_body[0].iX = 230; } eat_snake.my_snake_body[0].iY += 0; } else if(eat_snake.snake_body_dir == 2){ eat_snake.my_snake_body[0].iY += eat_snake.snake_body_width; if(eat_snake.my_snake_body[0].iY > 120){ eat_snake.my_snake_body[0].iY = 10; } eat_snake.my_snake_body[0].iX += 0; } else if(eat_snake.snake_body_dir == 3){ eat_snake.my_snake_body[0].iY -= eat_snake.snake_body_width; if(eat_snake.my_snake_body[0].iY < 10){ eat_snake.my_snake_body[0].iY = 120; } eat_snake.my_snake_body[0].iX += 0; } }
然后实现按键与方向的关联:
if(get_button(PIN_DIRECTION_KEY_A) == 1){ LED_Toggle(PICO_Pack_G_PIN); if(eat_snake.snake_body_dir == 0 || eat_snake.snake_body_dir == 1) eat_snake.snake_body_dir = 3; } if(get_button(PIN_DIRECTION_KEY_B) == 1){ LED_Toggle(PICO_Pack_G_PIN); if(eat_snake.snake_body_dir == 0 || eat_snake.snake_body_dir == 1) eat_snake.snake_body_dir = 2; } if(get_button(PIN_DIRECTION_KEY_X) == 1){ LED_Toggle(PICO_Pack_G_PIN); if(eat_snake.snake_body_dir == 3 || eat_snake.snake_body_dir == 2) eat_snake.snake_body_dir = 1; } if(get_button(PIN_DIRECTION_KEY_Y) == 1){ LED_Toggle(PICO_Pack_G_PIN); if(eat_snake.snake_body_dir == 3 || eat_snake.snake_body_dir == 2) eat_snake.snake_body_dir = 0; }
效果如下: