image image image image image image image image image image image image image

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()  # 更新窗口画面显示


0 条评论

目前还没有评论...