python壁球小游戏——pygame之旅

本篇博客是跟随嵩老师的教学写下的,入门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)
      

四、效果演示

请添加图片描述

猜你喜欢

转载自blog.csdn.net/m0_51336041/article/details/119077791