2013-06-27 46 views
2

林幫助我的朋友出了pygame的,但我們堅持查找向量連得2分

所以被正試圖獲得一個彈丸的方向,但我們不能找出如何

例如:

[1,1]將去SE

[1,-1]將去NE

[-1,-1]將去NW

和[-1,1]會去SW

我們需要某種形式的公式,將帶玩家POS和鼠標POS和發現彈丸需要往哪個方向走

這裏是我們被封堵的載體:

def update(self): 

    self.rect.x += self.vector[0] 
    self.rect.y += self.vector[1] 

那麼我們在rects COORDS

+0

這個等式背後的規則是什麼?播放器是否從播放器向鼠標光標的方向發射?或者從屏幕中心到鼠標光標?或者是其他東西?她被限制在8個羅盤方向,還是她可以在任何角度之間進行射擊? – abarnert

+0

玩家可以從任何方向射擊,例如玩家在玩家面前點擊,如果玩家在角色背後點擊箭頭返回的話,那麼箭頭將直接向前,因此給出mousepos和玩家pos我們需要找到箭頭需要走哪個方向 – Serial

回答

5

所以塊傳輸炮彈,首先要從玩家光標獲得矢量距離。 Subtracting two points gives you the vector between them

distance = [mouse.x - player.x, mouse.y - player.y] 

現在,你要normalize that to a unit vector。要做到這一點,你只會得到規範(由Pythagorean theorem),以及規範劃分向量:

norm = math.sqrt(distance[0] ** 2 + distance[1] ** 2) 
direction = [distance[0]/norm, distance[1]/norm] 

最後,你想velocity載體。你通過multiplying得到的方向(單位矢量)乘以速度。你可能想要所有子彈以速度矢量的速度移動,即sqrt(2)(再次由畢達哥拉斯定理)。因爲你想要一顆子彈射擊到東南的矢量[1, 1],你(想必)要讓所有子彈以該速度矢量的速度移動,即sqrt(2)。所以:

bullet_vector = [direction[0] * math.sqrt(2), direction[1] * math.sqrt(2)] 

就是這樣。


Here您可以看到此代碼正常工作。 (這是一個交互式的可視化工具,所以如果你有任何不明白的部分,你可以逐段瀏覽它。)

我在[10.0, 25.0]上創建了一個播放器,並且一個鼠標指針離開了一般(但不完全) - 在[30.0, 70.0]bullet_vector上的劇烈轉向最終爲[0.5743665268941905, 1.2923246855119288],這個向量指向相同的東南方向,速度爲sqrt(2)

這表明它可以去東南(如果你想要去準確東南,變線8 mouse = Point(30.0, 45.0)),它可以在比8個指南針點其他方向去,它總是轉到以相同的速度。

+0

這似乎只適用於8個指南針方向,但它根本不會去SE? – Serial

+0

你的'x'和'y'值是整數嗎?如果是這樣,你會想將它們轉換爲'float'。 (你可以通過在'norm'行執行'** 2.0'而不是'** 2'來做到這一點。) – abarnert

+0

同時,這些都是正確的公式。如果您需要幫助調試您的代碼,您需要向我們展示您的代碼。 (理想情況下是一個小的,可運行的[SSCCE](http://sscce.org),可以證明這個問題。) – abarnert