import sys
import pygame
from pygame.locals import *
import random
import datetime
class Fish(pygame.sprite.Sprite):
def __init__(self, image):
"""初始化"""
pygame.sprite.Sprite.__init__(self) # 初始化动画精灵
self.image = image # 加载图像
self.rect = self.image.get_rect() # 获取图像的矩形区域
self.mask = pygame.mask.from_surface(self.image) # 创建蒙版,用于完美碰撞检测
self.speedx = random.randint(1, 2)
self.speedy = random.randint(1, 2)
def update(self):
self.rect.x += self.speedx
self.rect.y += self.speedy
if self.rect.left < 0 or self.rect.right > WIDTH:
self.speedx = -self.speedx
self.reversed() # 水平翻转图片
if self.rect.top < 30 or self.rect.bottom > HEIGHT-30:
self.speedy = -self.speedy
def reversed(self):
"""水平翻转图片"""
self.image = pygame.transform.flip(self.image, True, False)
class FishAnimation(pygame.sprite.Sprite):
def __init__(self, images):
"""
有动画的精灵
:param images: 动画帧列表
:param rate: 动画的播放间隔,毫秒
"""
pygame.sprite.Sprite.__init__(self) # 初始化动画精灵
self.images = images
self.image = self.images[0] # 加载图像
self.rect = self.image.get_rect() # 获取图像的矩形区域
self.mask = pygame.mask.from_surface(self.image)
self.speedx = random.randint(1, 2)
self.speedy = random.randint(1, 2)
self.all_frame = len(self.images) # 总的动画帧数目
self.frame = 0 # 当前动画帧
self.last_time = 0 # 记录上次的时间
self.rate = 200 # 动画播放间隔
def update(self):
self.rect.x += self.speedx
self.rect.y += self.speedy
if self.rect.left < 0 or self.rect.right > WIDTH:
self.speedx = -self.speedx
self.reversed() # 水平翻转图片
if self.rect.top < 30 or self.rect.bottom > HEIGHT-30:
self.speedy = -self.speedy
now = pygame.time.get_ticks() # [6]获取当前时间
if now - self.last_time > self.rate: # [6]每200毫秒更新一帧动画
self.last_time = now # [6]更新上次记录的时间为当前时间
self.frame += 1 # [6]动画帧数加1
if self.frame >= self.all_frame:
self.frame = 0
self.image = self.images[self.frame] # [6]更新图片
def reversed(self):
"""水平翻转图片"""
for i in range(self.all_frame):
self.images[i] = pygame.transform.flip(self.images[i], True, False)
self.mask = pygame.mask.from_surface(self.images[0])
def load_images(filename, rows, columns):
"""
加载动画图片
:param filename: 图片的文件名
:param rows: 动画的行数
:param columns: 动画的列数
:return:
"""
images = [] # 存储动画帧的列表
master_image = pygame.image.load(filename).convert_alpha() # 加载动画主图
master_rect = master_image.get_rect() # 获取序列图的尺寸
frame_width = master_rect.width//columns # 单个动画帧的宽度
frame_height = master_rect.height//rows # 单个动画帧的高度
for row in range(rows): # 根据单个动画帧尺寸切割图片
for col in range(columns):
frame_rect = (col * frame_width, row * frame_height, frame_width, frame_height)
frame_image = master_image.subsurface(frame_rect)
images.append(frame_image) # 将单个动画帧加入到列表
return images
pygame.init() # 初始化pygame模块
WIDTH = 1024 # 定义游戏窗口的宽
HEIGHT = 600 # 定义游戏窗口的高
FPS = 60
SCREEN_SIZE = (WIDTH, HEIGHT) # 定义一个元祖
mode_list = pygame.display.list_modes() # 获取电脑支持的全屏分辨率
SCREEN_FULL = mode_list[0]
screen = pygame.display.set_mode(SCREEN_SIZE) # 初始化一个显示画面的窗口
pygame.display.set_caption("Mypygame") # 设置标题
bg = pygame.image.load("./PNG/Background.png").convert() # 加载背景图片
allGroup = pygame.sprite.Group() # 包含所有精灵的精灵组
# 单个精灵
jellyfish_images = load_images("./PNG/Jellyfish.png", 1, 6)
jellyfish = FishAnimation(jellyfish_images)
jellyfish.rect.center = [700, 300]
allGroup.add(jellyfish) # 添加到所有精灵组
# 精灵组1, 装古比鱼
group1 = pygame.sprite.Group()
for i in range(6):
image = pygame.image.load("./PNG/Guppy{}.png".format(i)).convert_alpha()
fish = Fish(image)
fish.rect.center = [100+100*i, 200] # 更改位置,否则会卡住
group1.add(fish) # 将精灵添加到精灵组1
allGroup.add(fish) # 添加到所有精灵组
# 精灵组2, 装比目鱼
group2 = pygame.sprite.Group()
for i in range(5):
fish_images = load_images("./PNG/Flatfish{}.png".format(i), 5, 4)
fish = FishAnimation(fish_images)
fish.rect.center = [100+100*i, 400]
group2.add(fish) # 将精灵添加到精灵组2
allGroup.add(fish) # 添加到所有精灵组
# 字体
font32 = pygame.font.Font("./Font/font01.ttf", 32) # 设置字体,大小为32
title = font32.render("水族箱", True, (255, 255, 255)) # 生成字体
# 音乐
volume = 1.0
pygame.mixer.music.load("./Sounds/Chill.wav") # 加载背景音乐
pygame.mixer.music.set_volume(volume) # 设置音量
pygame.mixer.music.play(-1) # 循环播放背景音乐
# 碰撞音效
sound_bo = pygame.mixer.Sound("./Sounds/bo.wav")
sound_bo.set_volume(volume) # 设置音量
clock = pygame.time.Clock()
while True: # 游戏主循环
clock.tick(FPS)
for event in pygame.event.get(): # 获取事件
if event.type == QUIT: # 退出
pygame.quit() # 退出pygame模块
sys.exit() # 退出系统
# 单个精灵和精灵组碰撞检测, 不用完美碰撞检测,否则会互相卡住
hits = pygame.sprite.spritecollide(jellyfish, group1, False)
if hits:
jellyfish.speedx = -jellyfish.speedx
jellyfish.speedy = -jellyfish.speedy
jellyfish.reversed() # 水平翻转图片
sound_bo.play() # 播放声音特效
for hit in hits:
hit.speedx = -hit.speedx
hit.speedy = -hit.speedy
hit.reversed() # 水平翻转图片
# 精灵组和精灵组碰撞检测, 不用完美碰撞检测,否则会互相卡住
hits = pygame.sprite.groupcollide(group1, group2, False, False)
for fish1 in hits: # 遍历 group1 中被碰到的鱼,fish1为字典的键
fish1.speedx = -fish1.speedx
fish1.speedy = -fish1.speedy
fish1.reversed() # 水平翻转图片
sound_bo.play() # 播放声音特效
for fish2 in hits[fish1]: # # 遍历 group2 中被碰到的鱼,hits[fish1]为fish1对应的列表
fish2.speedx = -fish2.speedx
fish2.speedy = -fish2.speedy
fish2.reversed() # 水平翻转图片
screen.blit(bg, (0, 0)) # 绘制背景
allGroup.update() # 调用组中动画精灵的update方法
allGroup.draw(screen) # 绘制精灵组中的精灵到surface图象上
screen.blit(title, (470, 0)) # 显示文字
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
t = font32.render(now, True, (255, 255, 255)) # 生成字体
screen.blit(t, (380, 570))
pygame.display.update() # 更新窗口画面显示
- 4 次查看
- 举报
0 条评论
目前还没有评论...
168
已通过
0
题解被赞