pygame动画实例--吃苹果

原文出处:https://www.cnblogs.com/msxh/p/5027688.html  

我稍作修改

import pygame,os,random
pygame.init()

os.environ['SDL_VIDEO_CENTERED'] = '1'
screen = pygame.display.set_mode((800,600))
pygame.display.set_caption("吃苹果")
clock = pygame.time.Clock()

class renwu(pygame.sprite.Sprite):#人物精灵
    def __init__(self):
        super().__init__()
        self.master_image = pygame.image.load('farmer walk.png').convert_alpha()  # 导入人物动画完整图像
        self.rect=self.master_image.get_rect()
        self.frame_width=self.rect.width//8  #整个图像分层8行--就是每个画面的宽
        self.frame_height =self.rect.height//8  #整个图像分层8列--就是每个画面的高
        self.image = self.master_image.subsurface((0,2*self.frame_height,self.frame_width,self.frame_height))
        #初始动作向右-2行0列的动作
        #每帧画面
        self.mask=pygame.mask.from_surface(self.image)
        self.x=0   #x轴每次移动量
        self.y = 0  # y轴每次移动量
        self.han = 2  # 记录行
        self.lie = 0  # 记录列
        self.li=0   #列偏移量

    def update(self):  # 更新函数
        self.rect.x =self.rect.x+self.x
        self.rect.y = self.rect.y + self.y
        #更新人物坐标
        if self.rect.x<-30 :
            self.rect.x=-30
        if self.rect.x>750:
            self.rect.x = 750
        if self.rect.y<0 :
            self.rect.y=0
        if self.rect.y>530:
            self.rect.y = 530
        #防止人物走出屏幕
        self.lie+=self.li
        if self.lie>7:
            self.lie=0
        self.image = self.master_image.subsurface((self.lie*self.frame_width, self.han * self.frame_height, self.frame_width, self.frame_height))

class pinguo(pygame.sprite.Sprite):  #苹果精灵
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load('food_low.png').convert_alpha()
        self.rect=self.image.get_rect()
        self.mask=pygame.mask.from_surface(self.image)
p_zu = pygame.sprite.Group()   #苹果组
r_zu=pygame.sprite.Group()      #人物组
for i in range(0,50):  #随机坐标产生50个苹果
    p=pinguo()
    p.rect.x=random.randint(20,760)
    p.rect.y = random.randint(80, 560)
    p_zu.add(p)
r=renwu()  #产生人物精灵
r_zu.add(r)


while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:  # 如果按下是向上键
                r.han=0  #第0行向上
                r.y=-5
                r.li=1
            if event.key == pygame.K_LEFT:  # 如果按下是向左键
                r.han=6   #第6行向左
                r.x=-5
                r.li = 1
            if event.key == pygame.K_DOWN:  # 如果按下是向下键
                r.han=4  #第4行向下
                r.y=5
                r.li = 1
            if event.key == pygame.K_RIGHT:  # 如果按下是向右键
                r.han=2  #第2行向右
                r.x=5
                r.li = 1
        elif event.type == pygame.KEYUP:  # 如果有键盘释放
            if event.key == pygame.K_UP:  # 如果释放的是向上键
                r.y=0
                r.li = 0
            if event.key == pygame.K_LEFT:  # 如果释放的是向左键
                r.x=0
                r.li = 0
            if event.key == pygame.K_DOWN:  # 如果释放的是向下键
                r.y = 0
                r.li = 0
            if event.key == pygame.K_RIGHT:  # 如果释放的是向右键
                r.x = 0
                r.li = 0
    b = pygame.sprite.spritecollide(r, p_zu, True, pygame.sprite.collide_mask)  # 精灵和组之间精准碰撞检测
    screen.fill((255,255,255))
    r_zu.update()  # 执行人物精灵的更新函数
    p_zu.draw(screen)
    r_zu.draw(screen)
    clock.tick(30)
    pygame.display.update()
farmer walk.png图片:

food_low.png图片:

原文地址:https://www.cnblogs.com/liming19680104/p/13298873.html