zoukankan      html  css  js  c++  java
  • pygame中的碰撞检测

     

    1.两个精灵之间的矩形检测

    import pygame
    import random
    
    BLACK = (  0,   0,   0)
    WHITE = (255, 255, 255)
    RED   = (255,   0,   0)
    
    class Block(pygame.sprite.Sprite):
        def __init__(self, color, width, height):
            super().__init__()
    
            self.image = pygame.Surface([width, height])
            self.image.fill(color)
            self.rect = self.image.get_rect()
    
    pygame.init()
    b=pygame.mouse.set_visible(False)
    screen_width = 700
    screen_height = 400
    screen = pygame.display.set_mode([screen_width, screen_height])
    sprite_list = pygame.sprite.Group()
    block = Block(BLACK, 50, 50)
    block.rect.x = random.randint(50,screen_width-50)
    block.rect.y = random.randint(50,screen_height-50)
    player = Block(RED, 50, 50)
    sprite_list.add(block)
    sprite_list.add(player)
    
    done = False
    clock = pygame.time.Clock()
    i=0
    
    while not done:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                done = True
        screen.fill(WHITE)
        pos = pygame.mouse.get_pos()
        player.rect.x = pos[0]
        player.rect.y = pos[1]
    
        #b = pygame.sprite.collide_rect(block, player)  #两个精灵之间的矩形碰撞检测
        #如果碰撞返回True
    
        b = pygame.sprite.collide_rect_ratio(0.9)(block, player)  #两个精灵之间的矩形碰撞检测
        #两个精灵的矩形面积相互重叠达到10%就返回True
        if b:
            print(i,'两个精灵碰撞了')
        else:
            print(i,'两个精灵没有碰撞')
    
        sprite_list.draw(screen)
        pygame.display.flip()
        i+=1
        clock.tick(2)
    
    pygame.quit()

    2.两个精灵之间的圆检测

    import pygame
    import random
    
    BLACK = (  0,   0,   0)
    WHITE = (255, 255, 255)
    RED   = (255,   0,   0)
    
    class Block(pygame.sprite.Sprite):
        def __init__(self, color, width, height):
            super().__init__()
    
            self.image = pygame.Surface([width, height])
            self.image.fill(color)
            self.rect = self.image.get_rect()
    
    pygame.init()
    b=pygame.mouse.set_visible(False)
    screen_width = 700
    screen_height = 400
    screen = pygame.display.set_mode([screen_width, screen_height])
    sprite_list = pygame.sprite.Group()
    block = Block(BLACK, 50, 50)
    block.rect.x = random.randint(50,screen_width-50)
    block.rect.y = random.randint(50,screen_height-50)
    player = Block(RED, 50, 50)
    sprite_list.add(block)
    sprite_list.add(player)
    
    done = False
    clock = pygame.time.Clock()
    i=0
    
    while not done:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                done = True
        screen.fill(WHITE)
        pos = pygame.mouse.get_pos()
        player.rect.x = pos[0]
        player.rect.y = pos[1]
    
        #b = pygame.sprite.collide_circle(block, player)  #两个精灵之间的圆形碰撞检测
        #【以矩形的对角线为直径形成检测圆,相碰就返回真】
    
        b = pygame.sprite.collide_rect_ratio(0.9)(block, player)  #两个精灵之间的圆形碰撞检测
        # 【以矩形的对角线为直径形成检测圆,相碰就返回真】
        # 两个精灵的圆形面积相互重叠达到10%就返回True
        if b:
            print(i,'两个精灵碰撞了')
        else:
            print(i,'两个精灵没有碰撞')
    
        sprite_list.draw(screen)
        pygame.display.flip()
        i+=1
        clock.tick(2)
    
    pygame.quit()

    3.两个精灵的精准碰撞检测

    import pygame,os
    pygame.init()
    
    os.environ['SDL_VIDEO_WINDOW_POS']="%d,%d"%(1400,100)  #窗口自定义坐标
    screen = pygame.display.set_mode((400,400))
    pygame.display.set_caption("碰撞")
    clock = pygame.time.Clock()
    i=0
    
    class Block(pygame.sprite.Sprite):
        def __init__(self, color, width, height):
            super().__init__()
            self.image = pygame.Surface([width, height]).convert_alpha()
            self.image.set_colorkey((0, 0, 0))  # 设置透明色
            pygame.draw.rect(self.image, color, (10,10,width//2,height//2))
            self.rect = self.image.get_rect()
            self.mask= pygame.mask.from_surface(self.image)  #给精灵添加一个mask属性
    
    
    zu = pygame.sprite.Group()
    
    b1=Block((0,0,255),50,50)
    b1.rect.x=10
    b1.rect.y=200
    zu.add(b1)
    
    p1=Block((255,0,0),50,50)
    p1.rect.x=20
    p1.rect.y=50
    zu.add(p1)
    
    
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_DOWN:
                p1.rect.y +=10
    
            if event.key == pygame.K_UP:
                p1.rect.y -= 10
    
        b = pygame.sprite.collide_mask(p1,b1)  #两个精灵的mask碰撞检测--精准检测
        #参数:两个精灵
        #返回值:碰撞区域的左上角坐标
        #
        print(i,b)
        screen.fill((255,255,255))
        zu.draw(screen)
    
        i+=1
        clock.tick(4)
        pygame.display.update()

    4.精灵和组之间的冲突检测 

    import pygame
    pygame.init()
    
    screen = pygame.display.set_mode((400,400))
    pygame.display.set_caption("碰撞")
    clock = pygame.time.Clock()
    i=0
    
    class Block(pygame.sprite.Sprite):
        def __init__(self, color, width, height):
            super().__init__()
            self.image = pygame.Surface([width, height]).convert_alpha()
            self.image.set_colorkey((0, 0, 0))  # 设置透明色
            pygame.draw.rect(self.image, color, (0,0,width//2,height//2))
            self.rect = self.image.get_rect()
            self.mask= pygame.mask.from_surface(self.image)  #给精灵添加一个mask属性
    
    
    zu = pygame.sprite.Group()
    zu1=pygame.sprite.Group()
    
    b1=Block((0,0,255),50,50)
    b1.rect.x=10
    b1.rect.y=10
    zu.add(b1)
    b2=Block((0,255,0),50,50)
    b2.rect.x=200
    b2.rect.y=200
    zu.add(b2)
    b3=Block((255,255,0),50,50)
    b3.rect.x=220
    b3.rect.y=190
    zu.add(b3)
    
    
    p=Block((255,0,0),50,50)
    p.rect.x=200
    p.rect.y=200
    zu1.add(p)
    
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                exit()
        screen.fill((255,255,255))
        pos = pygame.mouse.get_pos()
        p.rect.x = pos[0]
        p.rect.y = pos[1]
    
        #b = pygame.sprite.spritecollide(p, zu,False)  #精灵和组之间的矩形碰撞检测
        #参数1就是单个精灵
        #参数2是精灵组
        #第三个参数是一个bool值。当为True的时候,碰撞后会删除组中所有冲突的精灵(把精灵踢出组),False的时候不会删除冲突的精灵
        #返回值:列表  返回组中被碰撞的精灵
        #[<Block sprite(in 1 groups)>, <Block sprite(in 1 groups)>]
    
    
        #b = pygame.sprite.spritecollideany(p, zu, False)  #精灵和组之间的矩形碰撞检测
        # 参数1就是单个精灵
        # 参数2是精灵组
        # 参数3是一个bool值。当为True的时候,碰撞后会删除组中所有冲突的精灵(把精灵踢出组),False的时候不会删除冲突的精灵
        # 返回值:布尔值  是否有碰撞
    
        b = pygame.sprite.spritecollide(p, zu, False,pygame.sprite.collide_mask)  #精灵和组之间精准碰撞检测
        ##参数1就是单个精灵
        #参数2是精灵组
        #参数3:是一个bool值。当为True的时候,碰撞后会删除组中所有冲突的精灵(把精灵踢出组),False的时候不会删除冲突的精灵
        #参数4:用精灵的mask进行碰撞检测(透明区域不在碰撞检测范围内)--必须给精灵添加mask属性
        #返回值:列表  返回组中被碰撞的精灵
        #[<Block sprite(in 1 groups)>, <Block sprite(in 1 groups)>]
    
    
        print(i, b)
    
        if b:
            print(i,'两个精灵碰撞了')
        else:
            print(i,'两个精灵没有碰撞')
    
    
        zu.draw(screen)
        zu1.draw(screen)
    
        i+=1
        clock.tick(2)
        pygame.display.update()

    5.精灵组之间的冲突检测 

    import pygame
    pygame.init()
    
    screen = pygame.display.set_mode((400,400))
    pygame.display.set_caption("碰撞")
    clock = pygame.time.Clock()
    i=0
    
    class Block(pygame.sprite.Sprite):
        def __init__(self, color, width, height):
            super().__init__()
            self.image = pygame.Surface([width, height]).convert_alpha()
            self.image.set_colorkey((0, 0, 0))  # 设置透明色
            pygame.draw.rect(self.image, color, (10,10,width//2,height//2))
            self.rect = self.image.get_rect()
            self.mask= pygame.mask.from_surface(self.image)  #给精灵添加一个mask属性
    
    
    zu = pygame.sprite.Group()
    zu1=pygame.sprite.Group()
    
    b1=Block((0,0,255),50,50)
    b1.rect.x=10
    b1.rect.y=200
    zu.add(b1)
    b2=Block((0,255,0),50,50)
    b2.rect.x=200
    b2.rect.y=200
    zu.add(b2)
    b3=Block((255,255,0),50,50)
    b3.rect.x=220
    b3.rect.y=190
    zu.add(b3)
    
    
    p1=Block((255,0,0),50,50)
    p1.rect.x=20
    p1.rect.y=50
    zu1.add(p1)
    
    p2=Block((255,0,0),50,50)
    p2.rect.x=210
    p2.rect.y=20
    zu1.add(p2)
    
    
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_DOWN:
                p1.rect.y +=10
                p2.rect.y += 10
            if event.key == pygame.K_UP:
                p1.rect.y -= 10
                p2.rect.y -= 10
    
        #b=pygame.sprite.groupcollide(zu1, zu, False, False)   #精灵组之间的矩形冲突检测
        #参数1:组1
        #参数2:组2
        #参数3:发生碰撞时,组1中碰撞的精灵是否踢出组
        #参数4:发生碰撞时,组2中碰撞的精灵是否踢出组
        #返回值-字典:键是组1中碰撞的精灵,值是组1中的碰撞精灵与组2中发生碰撞的精灵列表
        #{<Block sprite(in 1 groups)>: [<Block sprite(in 1 groups)>], <Block sprite(in 1 groups)>: [<Block sprite(in 1 groups)>, <Block sprite(in 1 groups)>]}
    
        b = pygame.sprite.groupcollide(zu1, zu, False, False,pygame.sprite.collide_mask)  #精灵组之间的精准碰撞检测
        # 参数1:组1
        # 参数2:组2
        # 参数3:发生碰撞时,组1中碰撞的精灵是否踢出组
        # 参数4:发生碰撞时,组2中碰撞的精灵是否踢出组
        #参数5:用精灵的mask进行碰撞检测(透明区域不在碰撞检测范围内)--必须给精灵添加mask属性
        # 返回值-字典:键是组1中碰撞的精灵,值是组1中的碰撞精灵与组2中发生碰撞的精灵列表
        # {<Block sprite(in 1 groups)>: [<Block sprite(in 1 groups)>], <Block sprite(in 1 groups)>: [<Block sprite(in 1 groups)>, <Block sprite(in 1 groups)>]}
    
        print(i,b)
        screen.fill((255,255,255))
        zu.draw(screen)
        zu1.draw(screen)
    
        i+=1
        clock.tick(4)
        pygame.display.update()

    6.两个图像的精准检测

    看:https://www.cnblogs.com/liming19680104/p/13272989.html    实例2

  • 相关阅读:
    深度学习(十六) ReLU为什么比Sigmoid效果好
    逻辑回归和线性回归区别
    KNN理解
    词向量总结
    HTTP TCP/IP Socket
    AutoMapper控件
    Oracle数据库调优总结
    深度学习(十五) TextCNN理解
    从几张图来看看越来越难做的前端
    ES6学习笔记
  • 原文地址:https://www.cnblogs.com/liming19680104/p/13266344.html
Copyright © 2011-2022 走看看