Python 使一个物体朝游戏的方向移动

Python 使一个物体朝游戏的方向移动,python,math,pygame,game-physics,angle,Python,Math,Pygame,Game Physics,Angle,我在Pygame中进行实验,试图制作一个自上而下的射击游戏,找到了一个关于朝着一个点的角度运动的脚本,并用它来制作子弹。我有一个问题,我如何让子弹沿着计算的方向移动。我的数学还不太好,但我了解这里发生的大部分事情: speed = speed distance = [t0 - psx, t1 - psy] norm = math.sqrt(distance[0] ** 2 + distance[1] ** 2) direction = [distance[0] / norm, distance[

我在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()

您的更新正在更改每次更新时项目符号向量的值,。。你真正想要的是只在开火时计算向量,然后根据初始向量更新位置。。。因此,将orb更改为类似以下内容:

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)
这样,在创建时仅计算一次运动矢量

但是,您还应该添加一个检查,查看项目符号是否仍在屏幕上。如果不是,当你在一个游戏中有很多子弹时,你应该删除它以节省资源


祝你好运

您的更新正在更改每次更新时的项目符号向量值,。。你真正想要的是只在开火时计算向量,然后根据初始向量更新位置。。。因此,将orb更改为类似以下内容:

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)
这样,在创建时仅计算一次运动矢量

但是,您还应该添加一个检查,查看项目符号是否仍在屏幕上。如果不是,当你在一个游戏中有很多子弹时,你应该删除它以节省资源


祝你好运

我计划有一个范围,所以这将是伟大的工作。非常感谢你!我计划有一个范围,所以这将是伟大的工作。非常感谢你!