首页 文章

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

提问于
浏览
1

在pygame中,我有一个射弹从一个角色精灵射到另一个精灵,我想确定是否有碰撞 . 这是一个射击弹和另一个我称之为TRUMP的角色之间的碰撞 . 我在教程中找到了一个方程式,这是我能够完成的拱形轨迹的最佳例子 . 如果这个等式可以帮助它会很棒 .

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)

我想检查与射弹发生碰撞的角色精灵在这里:

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

1 回答

  • 1

    要获得弹道轨迹,您可以在每帧的速度矢量的y值上添加 GRAVITY 常量 .

    对于碰撞检测,您可以再次使用 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()
    

相关问题