一、技术点:
动画精灵、全屏模式、碰撞检测、音效播放、边界判断
游戏说明:
1、屏幕上出现10只小羊,速度随机。
2、键盘上下左右控制小狼运动,当小狼碰到小羊时,小羊消失。
代码如下:
# -*- coding: utf-8 -*-d import pygame import sys from random import * # 小羊类 生成小羊对象 class Lamb(pygame.sprite.Sprite): def __init__(self, image, position, speed, bg_size): # 初始化动画精灵 pygame.sprite.Sprite.__init__(self) # 加载传进来的图片 self.image = pygame.image.load(image) self.rect = self.image.get_rect() # 定义随机位置 self.rect.left, self.rect.top = position # 运动速度 self.speed = speed # 屏幕大小 self.width, self.height = bg_size[0], bg_size[1] # 生成半径,检测碰撞 self.radius = self.rect.width / 2 # 运动边界判断 def move(self): self.rect = self.rect.move(self.speed) if self.rect.right < 0: self.rect.left = self.width elif self.rect.left > self.width: self.rect.right = 0 elif self.rect.bottom < 0: self.rect.top = self.height elif self.rect.top > self.height: self.rect.bottom = 0 def main(): pygame.init() lamb_image = "Lamb.png" lang_image = "lang.png" BG_image = "BG1366.png" BG_image1 = "BG1920.png" end_image = "end1.png" # 想添加文字的, 不料弄不出来。显示的是框框 pygame.font.init() font = pygame.font.Font(None, 30) str1 = "一个人坐在房间,拨动琴弦,这是我为你写找的歌啊。歌曲结束,时间停止。\n 望着窗外灯火辉煌,空荡寂静的房间就只剩表针滴答.\ 时间仿佛在这一刻静止,思绪乱了,脑海里你的样子渐渐模糊. 电影就这样散场了吗..... 最简单的旋律,最朴实的歌词,最真挚的爱 " num = 0 line_h = font.get_linesize() # 加载播放背景音乐 pygame.mixer_music.load("bg.ogg") pygame.mixer_music.set_volume(0.2) pygame.mixer_music.play() # 加载羊叫声 lamb_music = pygame.mixer.Sound("lamb.wav") lamb_music.set_volume(0.2) # 加载结束音乐 end_music = pygame.mixer.Sound("end.wav") end_music.set_volume(0.2) bigf11 = True running = True oldbg_size = width, height = 800, 600 newbg_size = oldbg_size screen = pygame.display.set_mode(oldbg_size) pygame.display.set_caption("狼爱上羊") # 生成小狼对象,初始速度为0,60 和 78 是小样的宽高 speed = [0, 0] position = randint(0, width - 60), randint(0, height - 78) lang = Lamb(lang_image, position, speed, oldbg_size) # 生成5个小羊对象,加入列表lambs中 lambs = [] # 生成新的组,用于碰撞检测 group = pygame.sprite.Group() for i in range(10): # 随机产生位置 85 和 100 是小样的宽高 speed = [randint(-4, 4), randint(-4, 4)] position = randint(0, width - 85), randint(0, height - 100) lamb = Lamb(lamb_image, position, speed, oldbg_size) # 如果小羊刚出生就碰上了狼,那么重新定义狼的位置 while pygame.sprite.spritecollide(lang, group, False, pygame.sprite.collide_circle): lang.rect.left, lang.rect.top = randint(0, width - 60), randint(0, height - 78) lambs.append(lamb) group.add(lamb) # 背景图 background = pygame.image.load(BG_image) # 结束图 endimg = pygame.image.load(end_image) while running: for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() if event.type == pygame.KEYDOWN: # 按F11开启全屏 if event.key == pygame.K_F11: bigf11 = not bigf11 # 获取电脑分辨率 newsize = width, height = pygame.display.list_modes()[1][0], pygame.display.list_modes()[1][1] if bigf11: screen = pygame.display.set_mode(newsize) newbg_size = [width, height] # 修改小羊的屏幕大小 for each in lambs: each.width, each.height = newbg_size[0], newbg_size[1] # 修改小狼的屏幕大小 lang.width, lang.height = newbg_size[0], newbg_size[1] if width == 1920: background = pygame.image.load(BG_image1) else: screen = pygame.display.set_mode(oldbg_size) # 修改小羊的屏幕大小 for each in lambs: each.width, each.height = oldbg_size[0], oldbg_size[1] # 修改小狼的屏幕大小 lang.width, lang.height = oldbg_size[0], oldbg_size[1] # 小狼运动 if event.key == pygame.K_UP: lang.speed = [0, -4] lang.move() if event.key == pygame.K_DOWN: lang.speed = [0, 4] lang.move() if event.key == pygame.K_RIGHT: lang.speed = [4, 0] lang.move() if event.key == pygame.K_LEFT: lang.speed = [-4, 0] lang.move() # 填充背景 screen.blit(background, (0, 0)) # 将小羊显示出来 for each in group: each.move() screen.blit(each.image, each.rect) # 将小狼显示出来 screen.blit(lang.image, lang.rect) # 碰撞检测, 如果小狼和小羊碰撞,则删除小羊 if pygame.sprite.spritecollide(lang, group, True, pygame.sprite.collide_circle): lamb_music.play() if len(group) <= 0: end_music.play() # 游戏结束 if len(group) <= 0: screen.blit(background, (0, 0)) screen.blit(endimg, (0, 0)) # screen.blit(font.render(str1, True, (0, 0, 0)), (0, 0)) # 更新页面 pygame.display.flip() # 设置延迟 pygame.time.delay(10) if __name__ == '__main__': main()
效果如下:
资料链接:
链接:https://pan.baidu.com/s/1jTyx1Lz_I9W6UilByeQLXg
提取码:ucs6
本来结束时想显示文字的,那个font弄不出来了,下次学会了再弄。
读书和健身总有一个在路上