標籤:替換 一半 演算法 相同 add 就是 一起 迴圈 python
由於待會要用pygame示範,他的座標系是y軸向下,所以這裡我們也用y向下的座標系。
計算sina和cosa,正弦對比斜,餘弦鄰比斜,斜邊可以利用兩點距離公式計算出,即:
於是
AC的長度就是飛彈的速度乘以時間即 |AC|=vt,然後即可計算出AD和CD的長度,於是這一個時間片過去後,飛彈應該出現在新的位置C點,他的座標就是老的點A的x增加AD和y減去CD。
於是,新的C點座標就是:
只要一直反覆迴圈執行這個操作即可,好吧,為了更形象,把第一個時間片和第二個時間片放在一起看看:
很簡單的代碼如下:
如果僅把飛彈考慮為一個質點的話,那麼以上演算法就已經足矣,我沒有做飛彈的旋轉,因為一個質點也不分頭尾不需要旋轉,當然這前提得是你載入的飛彈圖片很小的時候不旋轉看起來也沒什麼問題。但是在pygame裡面做旋轉並不是一件容易的事情(也可能是我無知),好吧我們先把圖片替換成一張矩形的,再加入旋轉函數看看效果如何
因為圖片的座標點是它的左上方的點,所以如果我們想讓圖片的座標固定在箭頭尖點,那麼把圖片實際列印位置x減少圖片長度,y減少一半寬度就行。
但是實際運行效果並不好:
大致方向相同,但是圖片箭頭的尖點並沒有一直跟隨滑鼠,這是為什麼呢。經過我的研究(就因為這個問題沒解決一直沒發布),
我發現原來是這個圖旋轉的機制問題,我們看看旋轉後的圖片變成什麼樣了:
旋轉後的圖片變成了藍色的那個範圍,根據旋轉角度的不同,所變成的圖片大小也不一樣,我們看旋轉90的情況
這樣,兩個飛彈頭的點就一致了。接下來我們分析求旋轉後的飛彈頭的演算法。根據旋轉角度的不同,旋轉角在不同象限參數不一樣,所以我們分為這四種情況
1,2象限
3,4象限,它的旋轉只有正負0—180,所以3,4象限就是負角
顯示圖片的時候我們將他移動
screen.blit(missiled,(x1-width+(x1-C[0]),y1-height/2+(y1-C[1])))
這裡的(x1-width,y1-height/2)其實才是中的(x1,y1)
所以最後我們加入相關演算法代碼,效果就比較完美了
大功告成,最後附上全部的演算法代碼
歡迎大家加入萬人交流,資源共用群::125240963
神級程式員教你用Python實現簡單的飛彈自動追蹤!此乃裝逼神技!