上面是我自己画的一个示意图,这个专栏前面的文章已经能够让能个红色物块物块运动以及反弹,下面的青色滑块也能够通过硬件电路上面的按键左右移动了,彩色的砖块也有了,接下来就该写自由运动滑块和小球的碰撞检测了。
SIGNAL X1,Y1,X2,Y2,X3,Y3,X4,Y4:STD_LOGIC_VECTOR(0 to 9); SIGNAL X_shudu,Y_shudu:STD_LOGIC_VECTOR(0 to 9); SIGNAL X11,Y11,X21,Y21,X31,Y31,X41,Y41:STD_LOGIC_VECTOR(0 to 9); --底部滑块位置初始化 X1<=20;Y1<=400;X2<=20;Y2<=460; X3<=50;Y3<=400;X4<=50;Y4<=460; --自由移动的那个滑块位置的初始化 X11<=255;Y11<=420;X21<=255;Y21<=430; X31<=270;Y31<=420;X41<=270;Y41<=430; X_shudu<=10;Y_shudu<=10;
上面这几行代码,初始化了滑块四个点(X1,Y1),(X2,Y2),(X3,Y3),(X4,Y4)
以及自由运动物体四个点(X11,Y11),(X21,Y21),(X31,Y31),(X41,Y41)的坐标
我们实验用的显示屏大小是640*480的。
这个碰撞检测其实特别简单(如下图所示)就是这三种情况:
我们用代码把这三种情况给写出来就行了:
情况一:若(X41,Y41),(X21,Y21)和(X1,Y1)的位置关系为,X41>X1,Y41>=Y1,X21<X1,Y21>=Y1,就让运动物体的Y方向速度反向就行了,即:
PROCESS(X11,Y11,X21,Y21,X31,Y31,X41,Y41) BEGIN --自由物体移动方向右上的代码,水平和竖直方向的移动速度都是shudu个像素 X11<=X11+X_shudu; Y11<=Y11+Y_shudu; X21<=X21+X_shudu; Y21<=Y21+Y_shudu; X31<=X31+X_shudu; Y31<=Y31+Y_shudu; X41<=X41+X_shudu; Y41<=Y41+Y_shudu; IF(X41>X1 AND (Y41>Y1 OR Y41==Y1) AND X21<X1 AND (Y21>Y1 OR Y21==Y1 )) THEN --情况一的位置关系 Y_shudu=!Y_shudu;--Y速度反向 X11<=X11+X_shudu; Y11<=Y11+Y_shudu; X21<=X21+X_shudu; Y21<=Y21+Y_shudu; X31<=X31+X_shudu; Y31<=Y31+Y_shudu; X41<=X41+X_shudu; Y41<=Y41+Y_shudu; END END PROCESS;
情况二:若(X41,Y41),(X21,Y21)和(X1,Y1),(X3,Y3)的位置关系为,X41<X3,Y41>=Y1,X21>X1,Y21>=Y1,让运动物体的Y方向速度反向就行了,即:
PROCESS(X11,Y11,X21,Y21,X31,Y31,X41,Y41) BEGIN --自由物体移动方向右上的代码,水平和竖直方向的移动速度都是shudu个像素 X11<=X11+X_shudu; Y11<=Y11+Y_shudu; X21<=X21+X_shudu; Y21<=Y21+Y_shudu; X31<=X31+X_shudu; Y31<=Y31+Y_shudu; X41<=X41+X_shudu; Y41<=Y41+Y_shudu; IF(X41<X3 AND( Y41>Y1 OR Y41==Y1) AND X21>X1 AND (Y21>Y1 OR Y21==Y1)) THEN --情况二的位置关系 Y_shudu=!Y_shudu;--Y速度反向 X11<=X11+X_shudu; Y11<=Y11+Y_shudu; X21<=X21+X_shudu; Y21<=Y21+Y_shudu; X31<=X31+X_shudu; Y31<=Y31+Y_shudu; X41<=X41+X_shudu; Y41<=Y41+Y_shudu; END END PROCESS;
情况三:若(X41,Y41),(X21,Y21)和(X1,Y1),(X3,Y3)的位置关系为X21>X3,X41>X3,Y21>=Y3,Y41>=Y3,也让运动物体的Y方向速度反向就行了,即
PROCESS(X11,Y11,X21,Y21,X31,Y31,X41,Y41) BEGIN --自由物体移动方向右上的代码,水平和竖直方向的移动速度都是shudu个像素 X11<=X11+X_shudu; Y11<=Y11+Y_shudu; X21<=X21+X_shudu; Y21<=Y21+Y_shudu; X31<=X31+X_shudu; Y31<=Y31+Y_shudu; X41<=X41+X_shudu; Y41<=Y41+Y_shudu; IF(X21>X3 AND X41>X3 AND (Y21>Y3 OR Y21==Y3)AND (Y41>Y3 OR Y41==Y3)) THEN --情况二的位置关系 Y_shudu=!Y_shudu;--Y速度反向 X11<=X11+X_shudu; Y11<=Y11+Y_shudu; X21<=X21+X_shudu; Y21<=Y21+Y_shudu; X31<=X31+X_shudu; Y31<=Y31+Y_shudu; X41<=X41+X_shudu; Y41<=Y41+Y_shudu; END END PROCESS;
就先这样吧,上课去了。在写一个砖块消失的代码就结束了,感觉我写的有啥不对以及意见都可以提,谢谢,感觉帮助到了你就点个关注呗。