原文出处: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图片: