求子弹射击的pygame矢量角

2024-07-03 07:39:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我在pygame中制作一个游戏,我想创建一个子弹,它可以根据pygame向量的角度旋转图像。最初我想用向量来做,向量会被添加到它的位置,在子弹启动时计算出来,使子弹移动到屏幕上的鼠标上。然而,我意识到从向量获取角度的唯一内置方法是使用pygame.Vector2.angle_to()方法

我决定在子弹初始化之前创建一个角度,然后穿过它,然后使用pygame.transform.rotate(bulletImage, -angle)(我用玩家在屏幕上的位置和鼠标点击的位置来计算)。然而,当我这样做的时候,这个角度似乎不起作用,到处都是。我将包括在火上发生什么以及子弹如何启动的代码。我检查了进入的变量,但是我不能得到一个好的角度;它返回一个相对较低的角度,总是关闭

我的问题是,是否有办法让子弹图像通过其运动矢量或玩家相对矢量旋转,或者我是否需要找到另一种方法来实现这一点

枪战脚本:

def checkFire(self):
        for event in self.game.events:
            if event.type == pygame.MOUSEBUTTONUP:  ## Checks on click release
                mPos = pygame.Vector2(pygame.mouse.get_pos())  ## Gets mouse position and stores it in vector. This will be translated into the vector that moves the bullet
                pPos = self.game.cam.apply(self.player)  ## Gets actual position of player on screen
                pPosVec = pygame.Vector2((pPos.x, pPos.y))
                angle = pPosVec.angle_to(mPos) ## Gets angle between player vector and mouse vector
                mPos.x -= pPos.centerx ## Finds the x and y relativity between the mouse and player and then calculates the offset
                mPos.y -= pPos.centery          
                bullet(self.game, self.rect.center, mPos, angle) ## Inputs values.
                self.lastFire = pygame.time.get_ticks()

我在游戏对象中设置了一个摄像头,它将玩家保持在tilemap内,并使其滚动,因此我必须使用该功能来获取玩家的绝对坐标,当测试时,绝对坐标非常好。问题应该在这里的某个地方

子弹脚本

class bullet(pygame.sprite.Sprite):
    pos = pygame.Vector2((0,0))
    image = pygame.image.load(asset('objects/bullet2.png'))
    vel = 20
    def __init__(self, game, pos, target, angle, **kwargs):
        self.groups = game.sprites, game.bullets, game.layer2
        pygame.sprite.Sprite.__init__(self, self.groups)

        for k, v in kwargs.items():
            self.__dict__[k] = v

        print(angle)
        self.pos = pygame.Vector2(pos)
        self.dir = pygame.Vector2(target).normalize()
        self.image = pygame.transform.rotate(self.image, angle)
        self.rect = pygame.Rect(0, 0, self.image.get_width(), self.image.get_height())
        self.rect.center = self.pos
        

    
    def update(self):
        self.pos += self.dir *self.vel
        self.rect.center = self.pos

子弹的方向运动是完美的,只是角度的偏差不好


Tags: andtheposimageselfgame玩家向量