• pygame.sprite--精灵实例--红方块吃黑方块


    在pygame.sprite模块里面包含了一个名为Sprite类,他是pygame本身自带的一个精灵

    在pygame里,sprite通常是一个二维的图片。比如一辆汽车、一个狐狸、一条小狗等 

    使用sprites的主要好处是我们可以把游戏里的所有角色在一个组里做统一处理。我们可以同时渲染、移动他们。我们还可以检测一个角色是否和组里的任何一个角色发生碰撞

    游戏开发最核心的就是碰撞检测了,子弹击中敌人、足球射进门、吃加血包这些都是通过碰撞检测完成的

    碰撞实例一:红方块吃黑方块

    import pygame
    import random
    
    BLACK = (  0,   0,   0)  #黑色
    WHITE = (255, 255, 255)  #白色
    RED   = (255,   0,   0)   #红色
    
    class Block(pygame.sprite.Sprite):
        """
        定义一个Block类,这个类继承了:pygame.sprite.Sprite
        因此,这个类具有了sprite类的所有属性和方法
        """
    
        def __init__(self, color, width, height):
            """
            在Block类的init方法里,我们传入了颜色、宽度、高度三个属性。这里需要注意的是,我们通过super().__init__()调用了父类的初始化方法来初始化sprite的属性
            """
            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])
    
    block_list = pygame.sprite.Group()  #定义精灵组
    # group代表多个sprite为一组被同时管理,比如头、身、手、脚组合成一个大怪
    #block_list用来存储游戏里的碰撞目标
    
    all_sprites_list = pygame.sprite.Group()
    #all_sprites_list用来存储所有的角色
    
    for i in range(50):
        #使用for循环来初始化黑色的块,,我们把所有黑色的块放到block_list和all_sprites_list里
        block = Block(BLACK, 20, 15)  #定义黑色精灵
    
        block.rect.x = random.randrange(screen_width)  #随机坐标--通过draw指令画到对应的位置
        block.rect.y = random.randrange(screen_height)
    
        block_list.add(block)  #加入组
        all_sprites_list.add(block)
    
    player = Block(RED, 20, 15)  #定义红色精灵
    all_sprites_list.add(player)
    
    done = False
    
    clock = pygame.time.Clock()
    score = 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]
    
        blocks_hit_list = pygame.sprite.spritecollide(player, block_list, True)  #检查红色块是否和黑色块发生碰撞
        #参数1:检测对象--红色精灵
        #参数2:检测目标--黑色精灵组
        #参数3:如果group里的元素和player碰撞后,是否移除这个元素(True移除)
      #返回被碰撞到的黑色精灵列表
        for block in blocks_hit_list:
            score += 1
            print('得分:',score)
    
    
        all_sprites_list.draw(screen)  #将所有角色渲染到screen上
        #group对象里有个draw方法,这个方法会循环group里的每个sprite,并调用sprite的draw方法。这样,我们只需要使用一行代码就可以将所有sprite渲染到screen上了
        pygame.display.flip()  #更新整个屏幕
    
        clock.tick(60)
    
    pygame.quit()

    到目前为止,只有player sprite可以移动。接下来我们让游戏里的所有块都可以移动,有了上面的基础,让所有角色一起移动也非常方便

    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()
    
        def update(self):#更新函数
            #当使用组的update方法时,这个函数会自动被调用
            self.rect.y += 1  #
            if self.rect.y > screen_height:  #精灵移出屏幕后再次重新定位到屏幕上
                self.rect.y = random.randrange(-100, -10)
                self.rect.x = random.randrange(0, screen_width)
    
    
    pygame.init()
    b=pygame.mouse.set_visible(False)
    screen_width = 700
    screen_height = 400
    screen = pygame.display.set_mode([screen_width, screen_height])
    
    block_list = pygame.sprite.Group()
    
    all_sprites_list = pygame.sprite.Group()
    
    for i in range(50):
        block = Block(BLACK, 20, 15)
    
        block.rect.x = random.randrange(screen_width)
        block.rect.y = random.randrange(screen_height)
    
        block_list.add(block)
        all_sprites_list.add(block)
    
    player = Block(RED, 20, 15)
    all_sprites_list.add(player)
    
    done = False
    
    clock = pygame.time.Clock()
    score = 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]
    
        blocks_hit_list = pygame.sprite.spritecollide(player, block_list, True)
        for block in blocks_hit_list:
            score += 1
            print('得分:',score)
    
        all_sprites_list.draw(screen)
        pygame.display.flip()
        block_list.update()  #更新组内的所有精灵
        #自动调用Block类的update方法,更新一次调用一次
    
        clock.tick(60)
    
    pygame.quit()

  • 相关阅读:
    C#项目间循环引用的解决办法,有图有真相
    打破关注自己的门
    引用AForge.video.ffmpeg,打开时会报错:找不到指定的模块,需要把发行包第三方文件externalsffmpegin里的dll文件拷到windows的system32文件夹下。
    Gs_Class.Gs_DataFunction数据操作类库20160225
    Gs_Class._BaseQueryWeb查询页面基类(aspx.net)
    关于开钱箱(不是用螺丝刀子开)
    处理模糊查询时读取url地址参数变化的情况
    jeecg单步调试
    jeecg安装——mysql数据库创建+手动执行初始化脚本
    小程序动画效果
  • 原文地址:https://www.cnblogs.com/liming19680104/p/13255064.html
Copyright © 2020-2023  润新知