2014-03-28 118 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

我打算有一个范围,所以这会很好。非常感谢! –

相关问题