2014-03-28 122 views
0

我在Pygame中試驗並試圖製作一個自上而下的射手,並且發現了一個朝向點here的角運動的腳本,並將其用於子彈。我遇到了一個問題,我如何讓子彈向計算的方向移動。我不是在數學(還)很大,但據我所知大多數這是怎麼回事:讓一個物體不斷向一個方向移動Pygame

speed = speed 
distance = [t0 - psx, t1 - psy] 
norm = math.sqrt(distance[0] ** 2 + distance[1] ** 2) 
direction = [distance[0]/norm, distance[1 ]/norm] 
bullet_vector = [direction[0] * speed, direction[1] * speed] 

它是基於移動deltaY/DELTAX的斜率公式。對?有人知道如何做到這一點?

下面是引用完整的源代碼:

import pygame 
from pygame.locals import * 
import math 

#init stuff 
pygame.init() 
screen=pygame.display.set_mode((640,480)) 
clock=pygame.time.Clock() 
run=True 
orbs=[] 
px=1 
py=1 
clock=pygame.time.Clock() 

#movement from one point to another 
def Move(t0,t1,psx,psy,speed): 
    global mx 
    global my 

    speed = speed 

    distance = [t0 - psx, t1 - psy] 
    norm = math.sqrt(distance[0] ** 2 + distance[1] ** 2) 
    direction = [distance[0]/norm, distance[1 ]/norm] 

    bullet_vector = [direction[0] * speed, direction[1] * speed] 
    return bullet_vector 

#bullet class 
class Orb(object): 
    def __init__(self,posorg,posdest): 
     self.posx=posorg[0] 
     self.posy=posorg[1] 
     self.targ=posdest 
     self.posorg=posorg 
    def update(self): 
     bullet_vector=Move(self.targ[0],self.targ[1],self.posx,self.posy,20) 
     self.posx += bullet_vector[0] 
     self.posy += bullet_vector[1] 
     pygame.draw.circle(screen, ((0,0,255)), (int(self.posx),int(self.posy)), 5) 

#main loop 
while run: 
    screen.fill((220,220,220)) 
    for o in orbs: 
     o.update() 
    (mx,my)=(pygame.mouse.get_pos()[0],pygame.mouse.get_pos()[1]) 

    for e in pygame.event.get(): 
     #quit on close button 
     if e.type == QUIT: 
      run=False 
     if e.type==MOUSEBUTTONDOWN: 
      if e.button==1: 
       orbs.append(Orb((px,py),(mx,my))) 
    #player movement 
    key=pygame.key.get_pressed() 

    if key[K_a]: 
     px-=2 
    if key[K_d]: 
     px+=2 
    if key[K_w]: 
     py-=2 
    if key[K_s]: 
     py+=2 
    clock.tick(60) 
    pygame.draw.circle(screen, ((2,150,2)), (int(px),int(py)), 30) 
    pygame.display.update() 

回答

3

您的更新正在改變每個更新子彈載體的價值,..你真正想要的是爲載體只在計算射擊的瞬間,然後更新基於該初始向量的位置......所以改變寶珠是這樣的:

class Orb(object): 
    def __init__(self,posorg,posdest): 
     self.posx=posorg[0] 
     self.posy=posorg[1] 
     self.targ=posdest 
     self.posorg=posorg 
     self.bullet_vector=Move(self.targ[0],self.targ[1],self.posx,self.posy,20) 
    def update(self): 
     self.posx += self.bullet_vector[0] 
     self.posy += self.bullet_vector[1] 
     pygame.draw.circle(screen, ((0,0,255)), (int(self.posx),int(self.posy)), 5) 

這樣的運動矢量計算僅在創建一次。

但是,您還應該添加一個檢查以查看子彈是否仍在屏幕上。如果不是,你應該刪除它來節省資源,當你在一場比賽中有很多子彈時。

祝你好運!

+1

我打算有一個範圍,所以這會很好。非常感謝! –

相關問題