发现我们游戏越来越完善的时候,代码也越来越多,越来越乱。接上节的接苹果游戏,当掉小的苹果同时出现多个的时候,还需要多几分苹果的代码以及操作,那么有办法让代码更有可读性,更容易理解呢?答案是有的,那就是类,这一节,我们把苹果和篮子分别单独出来做一个类,并把他们分别独立到单独的文件中去,好让我们的主逻辑代码更加简洁。
类可以理解为分类
类可以实例化为具体的对象,每个对象都有相关的属性和方法
比如,我们的苹果,它有移动速度这个属性,有移动这个方法
发生独单的文件,之后我们发现有一些基本的值多个文件都用到,这个时候我们就可以考虑弄个独立的配置文件,其他类用到的基本参数都可以放在配置文件config.py
上接课的游戏代码,拆分之后的单独文件可以如下:
- main.py 游戏主文件
- basket.py篮子类文件
- apple.py苹果类文件
- music.py音乐文件
- config .py配置文件
分别来看看这些文件的具体代码
main.py
from apple import *
from basket import *
import music
import config
def main():
pygame.init() # 初始化
screen = pygame.display.set_mode((config.screen_w, config.screen_h)) # 设置窗口的大小
pygame.display.set_caption(config.game_name) #设置游戏界面的标题
# 背景
bg_img = pygame.image.load('bg2.jpg').convert_alpha() # 加载背景
bg_my = pygame.transform.scale(bg_img, (config.screen_w, config.screen_h)) # 指定图片的大小,不指定会直接按照图片本身大小显示
bk = basket()#实例化一个篮子
ap = apple()#实例化一个苹果
fclock = pygame.time.Clock() # 控制时间间隔
apple_count = 0
going = True
while going:
screen.blit(bg_my, (0, 0)) # 背景图最先加载,坐标是(left, top)
screen.blit(bk.img, bk.rect) # 篮子加入画布,坐标是(left, top)
screen.blit(ap.img, ap.rect) # 苹果加入画布,坐标是(left, top)
# 显示文字,显示分数
myfont = pygame.font.Font(None, 50)
textImage = myfont.render('apple:' + str(apple_count), True, (255, 255, 255))
screen.blit(textImage, (50, 50))
# 当车子接主苹果时,通过苹果和车子的位置以及他们的大小来判断他们是否碰撞
if bk.rect.colliderect(ap.rect):
ap.rect.x = randint(20, config.screen_w-20)
ap.rect.y = 0
apple_count += 1
music.jie.play()
ap.move()#苹果移动
for event in pygame.event.get(): # 遍历事件
if event.type == pygame.QUIT: # 退出事件
going = False
if event.type == pygame.KEYDOWN: # 判断获取时间是否为按钮按下的类型
if event.key == pygame.K_LEFT:
bk.move_left() #调用篮子的向左函数
if event.key == pygame.K_RIGHT:
bk.move_right() #调用篮子的向右函数
pygame.display.update()
fclock.tick(200)
pygame.quit()
if __name__ == '__main__':
main()
basket.py
import pygame
import music
import config
class basket(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
position = [300, 550] #篮子默认显示位置
speed = [0, 2] #篮子移动参数
self.img = pygame.image.load('lanzi.png') #加载篮子图片
self.img = pygame.transform.scale(self.img, (120, 80)) # 指定图片的大小,不指定会直接按照图片本身大小显示
self.rect = self.img.get_rect() #获取篮子方形
self.rect.center = position #设置篮子默认位置
self.image = self.img #篮子图片
self.speed = speed #篮子移动参数
#向左移动函数
def move_left(self):
music.mm.play()
self.speed = [-100, 0]
if self.rect.left < 0:
self.rect.left = 0
else:
self.rect = self.rect.move(self.speed)
#向右移动函数
def move_right(self):
music.mm.play()
self.speed = [100, 0]
if self.rect.right > config.screen_w: #右移超出窗体的时,将无法再右移
self.rect.right = config.screen_w
else:
self.rect = self.rect.move(self.speed)
apple.py
import pygame
from random import * #引用随机模块,这里我们可以看看改成 import random 会有什么不同,从而了解这种引用方式
import music
import config
class apple(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
x = randint(20, 430)
position = [x, 20]
speed = [0, 2]
self.img = pygame.image.load('apple.png')
self.rect = self.img.get_rect()
self.rect.center = position
self.image = self.img
self.speed = speed
def move(self):
if (self.rect.y > config.screen_h):
self.rect.y = 0
self.rect.x = randint(20, config.screen_w-20)
music.sb.play()
self.rect = self.rect.move(self.speed)
music.py
import pygame
pygame.mixer.init() # 初始化
if not pygame.mixer.music.get_busy(): #用非逻辑确定当前背景音乐没办法的时候开启背景音乐
pygame.mixer.music.load(r'充满童趣的幽默节奏.mp3') # 游戏背景音乐
pygame.mixer.music.play() # 开始播放音乐流
jie = pygame.mixer.Sound(r'jie.mp3') # 接住苹果的音效
mm = pygame.mixer.Sound(r'mm.mp3') # 移动车子的音效
sb = pygame.mixer.Sound(r'sb.mp3') # 接苹果失败音效
config.py
game_name = "接苹果小游戏"
screen_w = 800
screen_h = 600
多看看,多思考,为什么要这么分,有没更合理的分法
最后介绍下pygame的官网,网站是全英文的,可以学到更加全面的pygame
Godot Engine