Python 在Pygame中确定拱射弹与另一个精灵的碰撞

Python 在Pygame中确定拱射弹与另一个精灵的碰撞,python,pygame,Python,Pygame,在pygame中,我有一个从一个角色精灵到另一个角色精灵的投射物,我想确定是否有碰撞。这是一个弹丸和另一个我称之为特朗普的角色之间的碰撞。我在一篇教程中找到了一个方程式,这是我能完成的拱轨迹的最好例子。如果这个等式能得到帮助,那就太棒了 def fireshell(self, elapsedTime): fire = True FPS = 60 # frames per second setting fpsClock = pg.time.Cloc

在pygame中,我有一个从一个角色精灵到另一个角色精灵的投射物,我想确定是否有碰撞。这是一个弹丸和另一个我称之为特朗普的角色之间的碰撞。我在一篇教程中找到了一个方程式,这是我能完成的拱轨迹的最好例子。如果这个等式能得到帮助,那就太棒了

 def fireshell(self, elapsedTime):
        fire = True
        FPS = 60 # frames per second setting
        fpsClock = pg.time.Clock()
        print("fire", self.pos.x, self.pos.y)
        fireX = int(self.pos.x) 
        fireY = int(self.pos.y) 
        print("fireX", fireX, "fireY", fireY, "elapsed time", elapsedTime)
        power = elapsedTime*.0005
        x = int(self.pos.x)
        y = int(self.pos.y) - 100

        while fire:
            for event in pg.event.get():
                if event.type == pg.QUIT:
                    pg.quit()
                    quit()
           pg.draw.circle(self.screen, RED, (x, y), 5)
           x -= int(-(elapsedTime*6))
            y += int((((x - fireX)*0.015)**2) - ((elapsedTime*2)/(12 - elapsedTime )))

            print("X:", x,"Y:", y)

            if y > HEIGHT or x > WIDTH:
               fire = False

            pg.display.update()
            self.clock.tick(20)
我想检查与投射物碰撞的角色sprite在这里:

class TRUMP(pg.sprite.Sprite):
    def __init__(self, spritesheet, all_sprites, mudballGroup, jetsGroup):
        pg.sprite.Sprite.__init__(self)
        self.spritesheet = spritesheet 
        self.all_sprites = all_sprites 
        self.mudballGroup = mudballGroup
        self.jetsGroup = jetsGroup
        self.current_frame2 = 0
        self.last_update2 = 0
        self.load_images()
        self.image = self.TRUMP_fingers_l
        self.rect = self.image.get_rect()
        self.rect.center = (WIDTH *3/4), (589)
        self.rect.centerx = (WIDTH *3/4)
        self.rect.centery = 589
        self.rect.centerx = (WIDTH*5/6)
        self.rect.centery = 589
        self.pos = vec((WIDTH/2), (HEIGHT/2))
        self.vel = vec(0, 0)
        self.acc = vec(0, 0)
        self.dir = 0

要获得弹道轨迹,只需在每帧速度向量的y值上添加一个
重力
常数

对于碰撞检测,您可以再次使用
pygame.sprite.spritecollide
(您已经知道它是如何工作的)

下面是一个完整的示例:

import sys
import pygame as pg


GRAVITY = 3


class Player(pg.sprite.Sprite):

    def __init__(self, pos, color):
        super().__init__()
        self.image = pg.Surface((50, 30))
        self.image.fill(color)
        self.rect = self.image.get_rect(center=pos)
        self.pos = pg.math.Vector2(pos)
        self.vel = pg.math.Vector2()

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


class Projectile(pg.sprite.Sprite):

    def __init__(self, pos, color, target):
        super().__init__()
        self.image = pg.Surface((7, 5))
        self.image.fill(color)
        self.rect = self.image.get_rect(center=pos)
        self.pos = pg.math.Vector2(pos)
        direction = target - self.pos  # Vector to the target.
        # Normalize, then scale direction to adjust the speed.
        self.vel = direction.normalize() * 33

    def update(self):
        self.pos += self.vel
        self.vel.y += GRAVITY
        self.rect.center = self.pos
        if self.rect.y > 580:
            self.kill()


class Game:

    def __init__(self):
        self.fps = 30
        self.screen = pg.display.set_mode((800, 600))
        pg.display.set_caption('Ballistic trajectory')
        self.clock = pg.time.Clock()

        self.bg_color = pg.Color(90, 120, 100)
        self.green = pg.Color('aquamarine2')
        self.blue = pg.Color(30, 90, 150)
        self.font = pg.font.Font(None, 30)

        self.player = Player((100, 300), self.green)
        self.player2 = Player((400, 300), self.blue)
        self.all_sprites = pg.sprite.Group(self.player, self.player2)
        self.projectiles = pg.sprite.Group()
        self.collisions = 0
        self.done = False

    def run(self):
        while not self.done:
            self.handle_events()
            self.run_logic()
            self.draw()
            self.clock.tick(self.fps)

    def handle_events(self):
        for event in pg.event.get():
            if event.type == pg.QUIT:
                self.done = True
            if event.type == pg.MOUSEBUTTONDOWN:
                if event.button == 1:
                    proj = Projectile(
                        self.player.rect.center, pg.Color('sienna2'), event.pos)
                    self.projectiles.add(proj)
                    self.all_sprites.add(proj)
            if event.type == pg.KEYDOWN:
                if event.key == pg.K_a:
                    self.player.vel.x = -3
                if event.key == pg.K_d:
                    self.player.vel.x = 3
                if event.key == pg.K_w:
                    self.player.vel.y = -3
                if event.key == pg.K_s:
                    self.player.vel.y = 3
            if event.type == pg.KEYUP:
                if event.key == pg.K_a and self.player.vel.x == -3:
                    self.player.vel.x = 0
                if event.key == pg.K_d and self.player.vel.x == 3:
                    self.player.vel.x = 0
                if event.key == pg.K_w and self.player.vel.y == -3:
                    self.player.vel.y = 0
                if event.key == pg.K_s and self.player.vel.y == 3:
                    self.player.vel.y = 0

    def run_logic(self):
        self.all_sprites.update()
        hits = pg.sprite.spritecollide(self.player2, self.projectiles, True)
        for collided_sprite in hits:
            self.collisions += 1

    def draw(self):
        self.screen.fill(self.bg_color)
        self.all_sprites.draw(self.screen)
        txt = self.font.render('Collisions {}'.format(self.collisions), True, self.green)
        self.screen.blit(txt, (20, 20))

        pg.display.flip()


if __name__ == '__main__':
    pg.init()
    game = Game()
    game.run()
    pg.quit()
    sys.exit()

我不知道如何与pg.draw.circle相交(self.screen,红色,(x,y),5)。我不知道如何将它分组或与特朗普精灵碰撞。我想我将坚持我的射弹方程(x-=int(-(elapsedTime*8))y+=int(((x-fireX)*0.015)**2)-(elapsedTime*2)/(12-elapsedTime)))但是我如何将它与特朗普角色碰撞呢?如果我理解正确,你的
玩家
s
fireshell
方法应该只发射一个带有重力效应的射弹。你应该像特朗普的
shoot
方法一样,即创建一个射弹实例(你首先需要一个
投射物
类),将其添加到精灵组,并在游戏类的主循环中,检查特朗普实例是否与投射物组发生碰撞。