掌握了基本图形的画法后,我们可以开始尝试让这些基本图形变成动态的,就像一种桌面,有很多个小球,相互碰撞并改变小球颜色的动态效果。
要达到这种效果,首先要把这个大问题分解成若干个小问题:
1、先让一个小球在屏幕中运动到边界时能弹回;
2、两个小球同时运动时,除了到达边界弹回,还要两个小球相碰撞时弹回并改变颜色;
3、更多小球同时运动。
1、单球运动
单球运动,就是移动画出来的画空心圆,也就是只要改变圆心就可以实现,但是在画下一个圆之前要把上一次画的圆给清除掉。画完后,接着要判断圆心到边界的距离与半径的大小关系,确定下一次的运动方向。
单球运动函数
//单个球运动,碰到边界改变运动方向//dir为运动方向的参数u8 lcd_drawball(u16 *x,u16 *y,u16 r ,u16 color,u16 dir){ u16 flag_x = 0,flag_y = 0; lcd_drawcircle(*x,*y,r,white);//清除上次的圆 switch(dir) //选择运动方向 { case 0: flag_x=0;flag_y=0; break; case 1: flag_x=0;flag_y=1; break; case 2: flag_x=1;flag_y=0; break; case 3: flag_x=1;flag_y=1; break; } if(flag_y==0) (*y)++; //移动圆心 else if(flag_y==1) (*y)--; //移动圆心 if(flag_x==0) (*x)++; //移动圆心 else if(flag_x==1) (*x)--; //移动圆心 lcd_drawcircle(*x,*y,r,color);//画出移动后的圆 if((*y)-r=320) //判断边界 flag_y = 1; //确定下次的运动方向 if((*x)-r=240) //判断边界 flag_x = 1; //确定下次的运动方向 if((flag_x==0)&(flag_y==0))dir=0; if((flag_x==0)&(flag_y==1))dir=1; if((flag_x==1)&(flag_y==0))dir=2; if((flag_x==1)&(flag_y==1))dir=3; return dir; //返回下一次的运动方向}主函数
#include stm32f4xx.h#include core_cm4.h#include ili9341.h#include lcd.hint main(){ u16 x1=30,y1=30,r1=20,dir1=0,color1=red; ili9341_init(); //ili9341初始化 while(1) { dir1=lcd_drawball(&x1,&y1,r1,color1,dir1); }}2、双球运动
双球运动要在单球运动的基础上,再加上双球碰撞的判断函数。可以计算两个圆心的距离和两个圆的半径的大小关系,判断是否相碰撞,如果碰撞就对调运动方向,再改变颜色。
判断两球碰撞函数
//如果两个球碰撞,改变运动方向,颜色void iftwoballcrash(u16 x1,u16 y1,u16 r1,u16 *color1,u16 *dir1,u16 x2,u16 y2,u16 r2,u16 *color2,u16 *dir2){ u16 temp; if((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)<=((r1+r2)*(r1+r2))) { temp=(*dir1); (*dir1)=(*dir2); (*dir2)=temp; (*color1)+=5000; (*color2)+=5000; }}由于要改变原有的数据,所以函数的传参要为指针类型。
主函数
#include stm32f4xx.h#include core_cm4.h#include ili9341.h#include lcd.hint main(){ u16 x1=30,y1=30,r1=20,dir1=0,color1=red; u16 x2=100,y2=30,r2=20,dir2=1,color2=iron_gray; ili9341_init(); //ili9341初始化 while(1) { dir1=lcd_drawball(&x1,&y1,r1,color1,dir1); dir2=lcd_drawball(&x2,&y2,r2,color2,dir2); iftwoballcrash(x1,y1,r1,&color1,&dir1,x2,y2,r2,&color2,&dir2); }}```**3、多球运动**多球运动同样可以通过调用以上两个函数实现,这里就不再进行分析了。
诺基亚贝尔在怀柔5G试验外场中首家成功展示毫米波4Gbps峰值性能
小米6Plus什么时候上市?小米6Plus曝光不断,小米5SPlus已跌至“新低价”!
佳能EOSM6相机采用了APS-C画幅CMOS传感器能在暗光下拍出完美的画质
东芝推出采用最新一代工艺的150V N沟道功率MOSFET,可大幅提高电源效率
如何使用Ionic创建Android应用
STM32 ILI9341驱动TFTLCD(八)LCD碰撞小球
智能手表用户大增 AppleWatch4立大功?
小米米物精英键盘开启众筹,内置科大讯飞语音识别模块
中国十大智能手机品牌:魅族只排第9,小米跌至第4
Go预言实现的后段状态推送设计与实践
关于无人机的新型轻型高速视觉系统
可程式冷热冲击试验箱有多少种冲击方法?
保护关键任务应用程序 传统存储系统无法满足性能要求
手持电缆测试仪的工作原理是怎样的
树莓派4具备怎样的特点
华为回应停止社招到底是什么回事?
怎么使用Go重构流式日志网关呢?
最高降价2600元,华为Mate S、华为P8等四款手机价格降到冰点
什么是Linux内核,Linux内核的作用与功能
开关电源的多种电容讲解