本篇博客是跟随嵩老师的教学写下的,入门pygame,强推,链接:嵩老师的Python游戏开发教程
嵩天教授的Python游戏开发教程(pygame)
一、最小开发框架
# -*- coding: utf-8 -*-
"""
Created on Sun Jul 25 23:36:28 2021
@author: YouthUpward
"""
import pygame,sys
pygame.init()
screen = pygame.display.set_mode((600,400))
pygame.display.set_caption("pygame游戏之旅")
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
pygame.display.update()
二、部分代码分析过程
1、引入及初始化
#sys是python的标准库,提供朋友python运行环境变量的操纵
#sys.exit()
import pygame,sys
#对pygame内部各功能模块进行初始化创建及变量设置,默认调用
pygame.init()
size = width, height =600, 400
speed=[1,1]
BLACK=0,0,0
#设置相关屏幕模式
#初始化显示窗口,第一个参数是size,一个二值元组,分别表示窗口的宽度和高度
screen = pygame.display.set_mode(size,pygame.RESIZABLE)
#pygame.display控制pygame的屏幕,屏幕尺寸以像素为单位
#pygame中只有一个屏幕,如果要切换屏幕,只能在一个屏幕消失后,生成新的屏幕
pygame.display.set_caption("Pygame游戏之旅") #函数调用,设置窗体标题
#在pygame中载入的任何一个图像,在内部都表示为surface对象
#其中.get_rect()方法返回一个外切的矩形Rect对象
#Rect对象中,top、bottom、left、right表示上下左右,width、height表示宽、高
ball = pygame.image.load("e.png") #将filename路径下的图像载入游戏
ballrect = ball.get_rect()
icon = pygame.image.load("e.png")
pygame.display.set_icon(icon) #函数调用,设置窗口图标
fps = 300 #Frames per Second 每秒帧率参数
#创建一个Clock对象,用于操作时间
fclock = pygame.time.Clock()
2、响应事件并刷新
pygame采用笛卡尔坐标系,如下图示
while True: #无限循环,直到python运行时退出结束
#pygame.event.get()从事件队列中取出事件,并从队列中删除该事件
for event in pygame.event.get():
if event.type == pygame.QUIT: #响应点击右上角'x'的事件
sys.exit()
elif event.type == pygame.KEYDOWN:#响应键盘事件
if event.key == pygame.K_LEFT: #左键,则横向速度递减
speed[0] = speed[0] if speed[0]==0 else (abs(speed[0])-1)*int(speed[0]/abs(speed[0]))
elif event.key == pygame.K_RIGHT: #右键,则横向速度递增
speed[0] = speed[0] +1 if speed[0]>0 else speed[0]-1
elif event.key == pygame.K_UP: #上键,则纵向速度递增
speed[1] = speed[1] +1 if speed[1]>0 else speed[1]-1
elif event.key == pygame.K_DOWN: #下键,则横向速度递减
speed[1] = speed[1] if speed[1]==0 else (abs(speed[1])-1)*int(speed[1]/abs(speed[1]))
elif event.key == pygame.K_ESCAPE: #esc键,实现使用esc键达到退出游戏
sys.exit()
elif event.type == pygame.VIDEORESIZE:#响应窗体大小变化的事件
size = width, height = event.size[0], event.size[1]
screen = pygame.display.set_mode(size,pygame.RESIZABLE)
#矩形移动一个偏移量(x,y),即在横轴方向移动x像素,纵轴方向移动y像素,x、y为整数
if pygame.display.get_active():#如果没有最小化,则矩形移动
ballrect = ballrect.move(speed[0],speed[1])
#壁球反弹运动:遇左右两侧,横向速度取反;遇上下两侧,纵向速度取反
if ballrect.left < 0 or ballrect.right > width:#width为窗体的宽
speed[0] = -speed[0]
if ballrect.top < 0 or ballrect.bottom > height:#height为窗体的高
speed[1] = -speed[1]
#将一个图像绘制在另一个图像上,即将ball绘制到ballrect位置上。
#通过Rect对象引导对壁球的绘制
screen.blit(ball,ballrect)
#函数调用,对显示窗口进行更新
pygame.display.update()
fclock.tick(fps)
三、完整代码
import pygame,sys
#初始化
pygame.init()
icon = pygame.image.load("f.gif")
pygame.display.set_icon(icon)
vInfo = pygame.display.Info()
size=width,height=600,400#设置窗体大小
speed=[1,1]#设置速度
BLACK=0,0,0#设置刷新颜色
screen=pygame.display.set_mode(size,pygame.RESIZABLE)
pygame.display.set_caption("Pygame壁球")#设置窗体标题
ball=pygame.image.load("e.png")#载入壁球图片
ballrect=ball.get_rect()#根据图片生成对应矩形
fps=300
fclock=pygame.time.Clock()
still=False
#窗体背景颜色
bgcolor = pygame.Color("black")
#这个函数接受一个参数,并返回0-255之间的一个整数
def RGBChannel(a):
return 0 if a<0 else (255 if a>255 else int(a))
#事件处理
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT: #响应‘x’事件,退出
sys.exit()
elif event.type == pygame.KEYDOWN: #响应键盘事件
if event.key == pygame.K_LEFT: #左键,则横向速度递减
speed[0] = speed[0] if speed[0]==0 else (abs(speed[0])-1)*int(speed[0]/abs(speed[0]))
elif event.key == pygame.K_RIGHT: #右键,则横向速度递增
speed[0] = speed[0] +1 if speed[0]>0 else speed[0]-1
elif event.key == pygame.K_UP: #上键,则纵向速度递增
speed[1] = speed[1] +1 if speed[1]>0 else speed[1]-1
elif event.key == pygame.K_DOWN: #下键,则横向速度递减
speed[1] = speed[1] if speed[1]==0 else (abs(speed[1])-1)*int(speed[1]/abs(speed[1]))
elif event.key == pygame.K_ESCAPE: #esc键
sys.exit()
elif event.type == pygame.VIDEORESIZE: #响应窗体大小变化事件
size = width,height = event.size[0],event.size[1]
screen=pygame.display.set_mode(size,pygame.RESIZABLE)
elif event.type == pygame.MOUSEBUTTONDOWN:#响应鼠标悬空事件
if event.button==1:
still = True
elif event.type == pygame.MOUSEBUTTONUP: #响应鼠标放下事件,实现矩形跟随鼠标
still = False
if event.button==1:
ballrect = ballrect.move(event.pos[0]-ballrect.left,event.pos[1]-ballrect.top)
elif event.type == pygame.MOUSEMOTION:
if event.buttons[0] == 1:
ballrect = ballrect.move(event.pos[0]-ballrect.left,event.pos[1]-ballrect.top)
if pygame.display.get_active() and not still: #实现最小化后,运动暂停
ballrect=ballrect.move(speed[0],speed[1]) #壁球移动
if ballrect.left<0 or ballrect.right>width:
speed[0]=-speed[0] #壁球反弹
if ballrect.top<0 or ballrect.bottom>height:
speed[1]=-speed[1]
#归一化函数
bgcolor.r = RGBChannel(ballrect.left*255/width) #红色通道值
bgcolor.g = RGBChannel(ballrect.top*255/height) #绿色通道值
bgcolor.b = RGBChannel(min(speed[0],speed[1])*255/max(speed[0],speed[1],1)) #蓝色通道值
screen.fill(bgcolor)
screen.blit(ball,ballrect)
pygame.display.update()
fclock.tick(fps)