pygame游戏开发

Pygame游戏开发

pygame简介

模块库请参考:pygame官方文档

pygame可以用作游戏开发,但在商业游戏中真正的开发工具却不是pygame。使用pygame开发游戏周期长。

安装pygame

在pycharm中安装第三方库pygame:
在这里插入图片描述

在计算机中安装pygame:
需要用到pip:
查看pip:pip --version
在这里插入图片描述
pip也可以查看自己已经安装的扩展包: pip list
在这里插入图片描述

安装方法可以直接在命令行输入pip install -扩展包名字。

加快安装速度可以使用国内镜像源。
清华:https://pypi.tuna.tsinghua.edu.cn/simple

阿里云:http://mirrors.aliyun.com/pypi/simple/
在这里插入图片描述

游戏最小系统

所谓游戏最小系统指的是如果要写一个游戏最少要写哪些代码。

# 游戏最小系统
import pygame# 1.初始化操作
pygame.init() # 这是对所有操作进行初始化,包括声音、图像等# 2.创建游戏窗口
# set_mode(大小)
window = pygame.display.set_mode((800, 600))
# 设置游戏标题
pygame.display.set_caption("酷电编程")# 3.让游戏保持一直运行的状态
# game loop(游戏循环)
while True:# 4.检测事件for event in pygame.event.get():# 检测关闭按钮被点击的事件if event.type == pygame.QUIT:# 退出exit()

显示图片

import pygamepygame.init()
window = pygame.display.set_mode((800, 600))
pygame.display.set_caption("酷电编程")
# 设置背景颜色
window.fill((255, 255, 255))  # RGB值,(255,255,255)为白色# 游戏开始页面静态效果
# 1、加载图片
image1 = pygame.image.load('D:\\上课内容lxl\\2024_4_20\\酷电仔.png')# 2、渲染图片
# blit(渲染对象,坐标)
window.blit(image1, (0, 0))# 4、操作图片
# 1)获取图片大小
width, high = image1.get_size()  # 获取图片的长、宽
print(width, high)
window.blit(image1, (800 - width, 600 - high))  # 让图片在右下角显示# 2)旋转和缩放
# scale(缩放对象,目标大小) --> 可能会发生形变
new_image1 = pygame.transform.scale(image1, (200, 200))
window.blit(new_image1, (300, 100))# rotozoom(缩放/旋转对象,旋转角度,缩放比例) 逆时针旋转
new_image2 = pygame.transform.rotozoom(image1, 90, 0.5)
window.blit(new_image2, (300, 400))# 3、刷新显示页面
# pygame.display.flip() 第一次刷新
# pygame.display.update() 第二次及以后刷新。两者耗费的资源是不一样的
pygame.display.update()while True:# 游戏帧刷新for event in pygame.event.get():if event.type == pygame.QUIT:exit()

在这里插入图片描述

显示文字

import pygamepygame.init()
window = pygame.display.set_mode((800, 600))
pygame.display.set_caption("酷电编程")
# 设置背景颜色
window.fill((255, 255, 255))  # RGB值,(255,255,255)为白色# 显示文字
# 1、创建字体对象(选笔)
# font = pygame.font.Font()  # Font(字体文件路径,字号)是自定义字体
# font = pygame.font.SysFont()  # SysFont(字体名,字体大小, 是否加粗=False, 是否倾斜=False)用的是系统字体
# lst = pygame.font.get_fonts()  # 获取所有可使用的字体,返回值是所有可用的字体列表
# print(lst)
font = pygame.font.SysFont('arial', 30)# 2、通过字体创建文字对象(用笔写字)
# 字体对象.render(文字内容,True,文字颜色,背景颜色=None)
text = font.render('hello pygame', True, (0, 0, 255), (0, 255, 0))# 3、渲染到窗口上
window.blit(text, (0, 0))# 4、操作文字对象
# (1).获取文字内容的宽度和高度
text_w, text_h = text.get_size()
window.blit(text, (800 - text_w, 600 - text_h))# (2)文字缩放和旋转
new_text1 = pygame.transform.scale(text, (400, 200))
window.blit(new_text1, (400, 0))
new_text2 = pygame.transform.rotozoom(text, 90, 2)
window.blit(new_text2, (100, 200))# 刷新
pygame.display.update()while True:# 游戏帧刷新for event in pygame.event.get():if event.type == pygame.QUIT:exit()

在这里插入图片描述

画线

import pygamepygame.init()
window = pygame.display.set_mode((800, 600))
pygame.display.set_caption("酷电编程")
# 设置背景颜色
window.fill((255, 255, 255))  # RGB值,(255,255,255)为白色# 显示图形
# 1、画直线(原理:两点确定一条直线)
# line(画在哪儿,线的颜色,线的起点,线的终点,线宽(默认为1))
pygame.draw.line(window, (255, 0, 0), (10, 20), (200, 20))  # 这里画在游戏窗口上(一般也是画在游戏窗口上)# 2、画折线(原理:多个点按顺序连接起来)
# lines(画在哪儿,线的颜色,是否闭合,多个点(列表),线宽(默认为1))
points = [(10, 300), (100, 160), (180, 260), (300, 100)]
pygame.draw.lines(window, (0, 255, 0), False, points, 3)  # True:闭合;False:不闭合# 刷新显示页面
# pygame.display.flip() 第一次刷新
# pygame.display.update() 第二次及以后刷新。两者耗费的资源是不一样的
pygame.display.update()while True:# 游戏帧刷新for event in pygame.event.get():if event.type == pygame.QUIT:exit()

在这里插入图片描述

其他图像

其他图像:圆、矩形、椭圆、弧线。

import pygame
from math import pipygame.init()
window = pygame.display.set_mode((800, 600))
pygame.display.set_caption("酷电编程")
# 设置背景颜色
window.fill((255, 255, 255))  # RGB值,(255,255,255)为白色# 显示图形
# 1、画直线(原理:两点确定一条直线)
# line(画在哪儿,线的颜色,线的起点,线的终点,线宽(默认为1))
pygame.draw.line(window, (255, 0, 0), (10, 20), (200, 20))  # 这里画在游戏窗口上(一般也是画在游戏窗口上)# 2、画折线(原理:多个点按顺序连接起来)
# lines(画在哪儿,线的颜色,是否闭合,多个点(列表),线宽(默认为1))
points = [(10, 300), (100, 160), (180, 260), (300, 100)]
pygame.draw.lines(window, (0, 255, 0), True, points, 3)  # True:闭合;False:不闭合# 3、画圆(原理:圆心+半径)
# circle(画在哪儿,线的颜色,圆心坐标,半径,线宽(默认为0,线宽=0时为实心圆,非0时为空心圆))
pygame.draw.circle(window, (0, 0, 255), (200, 250), 100, 2)  # 这里线宽=2,画的是空心圆# 4、画矩形(原理:根据左上角顶点坐标和长、宽即可确定一个矩形)
# rect(画在哪儿,线的颜色,矩形范围(x,y,length,width),线宽(默认为0,线宽=0时为实心矩形,非0时为空心矩形))
pygame.draw.rect(window, (120, 20, 60), (400, 100, 200, 100))  # 线宽默认为0,画的是实心矩形# 5、画椭圆(原理:在矩形里画内切圆,因此画椭圆的参数与画矩形参数一模一样)
# ellipse(画在哪儿,线的颜色,矩形范围(x,y,length,width),线宽(默认为0,线宽=0时为实心椭圆,非0时为空心椭圆))
pygame.draw.ellipse(window, (255, 0, 0), (400, 400, 200, 100), 3)  # 这里线宽=3,画的是空心椭圆# 6、画弧线(原理:弧线是椭圆的一段长度,因此也需要借助矩形参数)
# arc(画在哪儿,线的颜色,矩形范围(x,y,length,width),起始弧度,终止弧度,线宽(默认为1))  # 弧度:0-2π;角度:0-360
pygame.draw.arc(window, (255, 0, 0), (400, 250, 200, 100), 0, pi, 3)  # 这里的弧度与数学中的坐标是完全一样的
# 这里引入了math模块中的pi# 刷新显示页面
# pygame.display.flip() 第一次刷新
# pygame.display.update() 第二次及以后刷新。两者耗费的资源是不一样的
pygame.display.update()while True:# 游戏帧刷新for event in pygame.event.get():if event.type == pygame.QUIT:exit()

在这里插入图片描述

在上面画弧线时用到的弧度与数学中的坐标是一模一样的:
在这里插入图片描述

动画原理

所有动画的原理都是一样的,都是多张照片快速的播放形成动画效果。

移动、缩放和旋转动画

移动动画

import pygameWIN_WIDTH = 800  # 窗口宽度
WIN_HEIGHT = 600  # 窗口高度# 初始化游戏
pygame.init()# 创建窗口
window = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))  # 实际开发中窗口宽和高都是设置为全局变量,这样以后修改很方便(类似于封装的好处)
pygame.display.set_caption('动画原理')  # 设置标题
window.fill((255, 255, 255))  # 背景# 1、显示静态球(实心圆,用画圆的方法)
# circle(画在哪儿,线的颜色,圆心坐标,半径,线宽(默认为0。线宽为0即实心圆,非0为空心圆))
y = 100
pygame.draw.circle(window, (255, 0, 0), (100, y), 50)  # 这里线宽为0画实心圆# 刷新
pygame.display.update()# 在循环上面写的都是静态效果,要实现动态效果必须写在循环内# 游戏循环
while True:# 2、移动动画(动态球,实心)pygame.draw.circle(window, (255, 255, 255), (100, y), 50)  # 在画下一幅图之前需要将前面一副图覆盖掉(使用背景颜色覆盖,这里背景颜色为白色)y += 1  # 数字越大,动画移动的速度越快pygame.draw.circle(window, (255, 0, 0), (100, y), 50)pygame.display.update()  # 刷新# 检测事件for event in pygame.event.get():if event.type == pygame.QUIT:# 退出exit()  # 如果是多线程,这里只会退出该线程,进程并不会退出

运行上述代码发现即便在循环中写 y += 1 ,动画的移动速度还是太快,如何再减慢速度?

答:可以规定每循环 100 次(数字越大,速度越慢)移动一次。

num = 1
while True:num += 1if num % 100 == 0:y += 1# 画图代码...

具体实现:

import pygameWIN_WIDTH = 800  # 窗口宽度
WIN_HEIGHT = 600  # 窗口高度# 初始化游戏
pygame.init()# 创建窗口
window = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))  # 实际开发中窗口宽和高都是设置为全局变量,这样以后修改很方便(类似于封装的好处)
pygame.display.set_caption('动画原理')  # 设置标题
window.fill((255, 255, 255))  # 背景# 1、显示静态球(实心圆,用画圆的方法)
# circle(画在哪儿,线的颜色,圆心坐标,半径,线宽(默认为0。线宽为0即实心圆,非0为空心圆))
y = 100
pygame.draw.circle(window, (255, 0, 0), (100, y), 50)  # 这里线宽为0画实心圆# 刷新
pygame.display.update()# 在循环上面写的都是静态效果,要实现动态效果必须写在循环内num = 1
# 游戏循环
while True:num += 1# 1)移动动画(动态球,实心)if num % 1000 == 0:pygame.draw.circle(window, (255, 255, 255), (100, y), 50)  # 在画下一幅图之前需要将前面一副图覆盖掉(使用背景颜色覆盖,这里背景颜色为白色)y += 1  # 数字越大,动画移动的速度越快pygame.draw.circle(window, (255, 0, 0), (100, y), 50)pygame.display.update()  # 刷新# 检测事件for event in pygame.event.get():if event.type == pygame.QUIT:# 退出exit()  # 如果是多线程,这里只会退出该线程,进程并不会退出

pygame学习-移动动画章节-动画演示

缩放动画

import pygameWIN_WIDTH = 800  # 窗口宽度
WIN_HEIGHT = 600  # 窗口高度# 初始化游戏
pygame.init()# 创建窗口
window = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))  # 实际开发中窗口宽和高都是设置为全局变量,这样以后修改很方便(类似于封装的好处)
pygame.display.set_caption('动画原理')  # 设置标题
window.fill((255, 255, 255))  # 背景# 1、显示静态球(实心圆,用画圆的方法)
# circle(画在哪儿,线的颜色,圆心坐标,半径,线宽(默认为0。线宽为0即实心圆,非0为空心圆))
y = 100  # 圆心初始纵坐标
r = 50  # 圆的初始半径
pygame.draw.circle(window, (255, 0, 0), (100, y), r)  # 这里线宽为0画实心圆# 刷新
pygame.display.update()# 在循环上面写的都是静态效果,要实现动态效果必须写在循环内num = 1
# 游戏循环
while True:num += 1# 2)缩放动画(动态球,实心)if num % 1000 == 0:pygame.draw.circle(window, (255, 255, 255), (100, y), r)  # 在画下一幅图之前需要将前面一副图覆盖掉(使用背景颜色覆盖,这里背景颜色为白色)r += 1  # r += 1 --->半径增大,动画放大;r -= 1 --->半径减小,动画缩小pygame.draw.circle(window, (255, 0, 0), (100, y), r)pygame.display.update()  # 刷新# 检测事件for event in pygame.event.get():if event.type == pygame.QUIT:# 退出exit()  # 如果是多线程,这里只会退出该线程,进程并不会退出

pygame学习-缩放动画章节-动画演示

旋转动画

# 3)旋转动画if num % 1000 == 0:window.fill((255, 255, 255))pygame.draw.circle(window, (255, 0, 0), (100, y), r)pygame.draw.rect(window, (255, 255, 255), (ix, iy, iw, ih))d += 1new_image = pygame.transform.scale(image, d, 1)  # 旋转window.blit(new_image, (ix, iy))pygame.display.update()

移动和缩放同时进行

    # 2)移动和缩放同时进行动画(动态球,实心)if num % 1000 == 0:pygame.draw.circle(window, (255, 255, 255), (100, y), r)  # 在画下一幅图之前需要将前面一副图覆盖掉(使用背景颜色覆盖,这里背景颜色为白色)y += 2  # 移动r += 1  # r += 1 --->半径增大,动画放大;r -= 1 --->半径减小,动画缩小pygame.draw.circle(window, (255, 0, 0), (100, y), r)pygame.display.update()  # 刷新

动画的灵活控制

下面检测边界和修改坐标值得学习:

import pygameWIN_WIDTH = 800  # 窗口宽度
WIN_HEIGHT = 600  # 窗口高度# 初始化游戏
pygame.init()# 创建窗口
window = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))  # 实际开发中窗口宽和高都是设置为全局变量,这样以后修改很方便(类似于封装的好处)
pygame.display.set_caption('动画原理')  # 设置标题
window.fill((255, 255, 255))  # 背景# 静态球(实心圆,用画圆的方法)
# circle(画在哪儿,线的颜色,圆心坐标,半径,线宽(默认为0。线宽为0即实心圆,非0为空心圆))
x, y = 200, 30  # 圆心初始坐标
r = 30  # 圆的初始半径
y_speed = 1  # 圆上下移动的速度
pygame.draw.circle(window, (255, 0, 0), (x, y), r)  # 这里线宽为0画实心圆# 刷新
pygame.display.update()# 在循环上面写的都是静态效果,要实现动态效果必须写在循环内num = 1
# 游戏循环
while True:num += 1# 小球上下反弹的效果if num % 1000 == 0:'''前面在学习移动、缩放动画时用的都是:在画下一幅图之前需要将前面一副图覆盖掉pygame.draw.circle(window, (255, 255, 255), (x, y), r) # (使用背景颜色覆盖,这里背景颜色为白色)也可以用其他方法处理,就是直接再填充一次背景颜色:window.fill((255, 255, 255))  # 原来背景颜色为白色当再次填充完背景颜色后其余之前在窗口中显示的内容需要再重新画出来。【这条不要忘了】'''window.fill((255, 255, 255))  # 再填充一次背景颜色,需要注意其余之前在窗口中显示的内容需要再重新画出来# 修改y坐标y += y_speed# 检测边界# 下边界if y >= WIN_HEIGHT - r:y_speed = y_speed * -1# 上边界if y <= r:y_speed = y_speed * -1pygame.draw.circle(window, (255, 0, 0), (x, y), r)pygame.display.update()# 检测事件for event in pygame.event.get():if event.type == pygame.QUIT:# 退出exit()  # 如果是多线程,这里只会退出该线程,进程并不会退出

pygame学习-动画的灵活控制章节-动画演示

鼠标事件

import pygame
from random import randintWIN_WIDTH = 800  # 窗口宽度
WIN_HEIGHT = 600  # 窗口高度# 初始化游戏
pygame.init()# 创建窗口
window = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))  # 实际开发中窗口宽和高都是设置为全局变量,这样以后修改很方便(类似于封装的好处)
pygame.display.set_caption('动画原理')  # 设置标题
window.fill((255, 255, 255))  # 背景# 刷新
pygame.display.update()count = 0  # 统计事件发生的次数
# 游戏循环
while True:# 检测事件for event in pygame.event.get():# for循环中的代码只有事件发生后才会执行# 发生什么事件执行对应的代码一定要写在for循环中count += 1print(count)# event的type属性是用来区分不同类型的事件'''QUIT ---> 点击关闭按钮对应的事件1、鼠标事件MOUSEBUTTONDOWN ---> 鼠标按下MOUSEBUTTONUP ---> 鼠标弹起MOUSEMOTION ---> 鼠标移动pos ---> 鼠标位置属性(点的哪儿)'''if event.type == pygame.QUIT:# 退出exit()  # 如果是多线程,这里只会退出该线程,进程并不会退出# ---------鼠标事件---------if event.type == pygame.MOUSEBUTTONDOWN:print('鼠标按下', '鼠标按下的位置', event.pos)  # x,y = event.pos 。 event.pos会返回(x,y)元组类型mx, my = event.pos  # 取出鼠标的x,y坐标pygame.draw.circle(window, (255, 255, 0), (mx, my), 50)  # 画圆pygame.display.update()  # 刷新if event.type == pygame.MOUSEBUTTONUP:print('鼠标弹起')if event.type == pygame.MOUSEMOTION:print('鼠标移动')r = randint(0, 255)g = randint(0, 255)b = randint(0, 255)mx, my = event.pos  # 取出鼠标的x,y坐标pygame.draw.circle(window, (r, g, b), (mx, my), 30)  # 画圆pygame.display.update()  # 刷新

pygame学习-鼠标事件章节-动画演示

键盘事件

说明
如果按下键盘没反应一般就是输入法的问题,切换成英文输入法即可。

import pygameWIN_WIDTH = 800  # 窗口宽度
WIN_HEIGHT = 600  # 窗口高度# 初始化游戏
pygame.init()# 创建窗口
window = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))  # 实际开发中窗口宽和高都是设置为全局变量,这样以后修改很方便(类似于封装的好处)
pygame.display.set_caption('动画原理')  # 设置标题
window.fill((255, 255, 255))  # 背景# 刷新
pygame.display.update()# 字体
font = pygame.font.SysFont('arial', 30)
tx = 0count = 0  # 统计事件发生的次数
# 游戏循环
while True:# 检测事件for event in pygame.event.get():# for循环中的代码只有事件发生后才会执行# 发生什么事件执行对应的代码一定要写在for循环中count += 1print(count)# event的type属性是用来区分不同类型的事件'''QUIT ---> 点击关闭按钮对应的事件2、键盘事件KEYDOWN ---> 键盘按键按下KEYUP ---> 键盘按键弹起key ---> 按键值属性(哪个键被按了)'''if event.type == pygame.QUIT:# 退出exit()  # 如果是多线程,这里只会退出该线程,进程并不会退出# ---------键盘事件---------if event.type == pygame.KEYDOWN:print('键盘按键按下', event.key, chr(event.key))  # event.key返回的是ASCII码值,需要转换成对应的字符# 注意这里如果按下键盘没反应一般就是输入法的问题,切换成英文输入法即可if chr(event.key) == 'f':print('闪现')text = font.render(chr(event.key), True, (250, 0, 0))# window.fill((255, 255, 255))  # 再填充一次背景将原来的内容覆盖掉tx += 20window.blit(text, (tx, 300))pygame.display.update()if event.type == pygame.KEYUP:print('键盘按键弹起')

pygame学习-键盘事件章节-动画演示

按钮点击效果

按钮被点击就是要判断鼠标点击事件发生时鼠标点击的坐标是否在按钮的范围内,点击效果实现就是将按钮再重新画一遍。

import pygameWIN_WIDTH = 800  # 窗口宽度
WIN_HEIGHT = 600  # 窗口高度# 初始化游戏
pygame.init()# 创建窗口
window = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))  # 实际开发中窗口宽和高都是设置为全局变量,这样以后修改很方便(类似于封装的好处)
pygame.display.set_caption('动画原理')  # 设置标题
window.fill((255, 255, 255))  # 背景# 按钮上的文字
font = pygame.font.SysFont('隶书', 30)# 按钮:需要先画矩形,再在上面写字
# 1、“确定”按钮
bx1, by1, bw, bh = 30, 100, 100, 50  # x,y,width,height
pygame.draw.rect(window, (255, 0, 0), (bx1, by1, bw, bh))
text1 = font.render('确定', True, (255, 255, 255))
tw1, th1 = text1.get_size()  # 获取文字对象的长、宽
tx1 = bx1 + bw / 2 - tw1 / 2  # 文字对象x坐标
ty1 = by1 + bh / 2 - th1 / 2  # 文字对象y坐标
window.blit(text1, (tx1, ty1))# 2、“取消”按钮
bx2, by2 = 30, 200
pygame.draw.rect(window, (0, 255, 0), (bx2, by2, bw, bh))
text2 = font.render('取消', True, (255, 255, 255))
tw2, th2 = text2.get_size()  # 获取文字对象的长、宽
tx2 = bx2 + bw / 2 - tw2 / 2  # 文字对象x坐标
ty2 = by2 + bh / 2 - th2 / 2  # 文字对象y坐标
window.blit(text2, (tx2, ty2))# 刷新
pygame.display.update()# 游戏循环
while True:# 检测事件for event in pygame.event.get():if event.type == pygame.QUIT:# 退出exit()  # 如果是多线程,这里只会退出该线程,进程并不会退出# 鼠标点击按钮要做的事if event.type == pygame.MOUSEBUTTONDOWN:mx, my = event.pos  # 获取鼠标点击的坐标# 是否点击了“确定”按钮if bx1 <= mx <= bx1 + bw and by1 <= my <= by1 + bh:  # 运算符优先级:算术运算符>比较运算符>逻辑运算符。因此这里并不需要加小括号# 按钮点击的反应:按钮被点击后背景颜色改变,松开后背景颜色恢复pygame.draw.rect(window, (200, 200, 200), (bx1, by1, bw, bh))  # 这里按钮被点击时变为灰色window.blit(text1, (tx1, ty1))  # 文字也要重新渲染pygame.display.update()  # 刷新print('确定按钮被点击')# 是否点击了“取消”按钮if bx2 <= mx <= bx2 + bw and by2 <= my <= by2 + bh:  # 运算符优先级:算术运算符>比较运算符>逻辑运算符。因此这里并不需要加小括号# 按钮点击的反应:按钮被点击后背景颜色改变,松开后背景颜色恢复pygame.draw.rect(window, (200, 200, 200), (bx2, by2, bw, bh))  # 这里按钮被点击时变为灰色window.blit(text2, (tx2, ty2))  # 文字也要重新渲染pygame.display.update()  # 刷新print('取消按钮被点击')# exit()# 鼠标松开按钮要做的事if event.type == pygame.MOUSEBUTTONUP:# 鼠标松开后背景颜色恢复# 这里并没有获取鼠标松开的坐标,意思是不管在哪松开都要执行# “确定”按钮被松开pygame.draw.rect(window, (255, 0, 0), (bx1, by1, bw, bh))  # 鼠标松开时恢复为红色window.blit(text1, (tx1, ty1))  # 文字也要重新渲染pygame.display.update()  # 刷新# “取消”按钮被松开pygame.draw.rect(window, (0, 255, 0), (bx2, by2, bw, bh))  # 鼠标松开时恢复为绿色window.blit(text2, (tx2, ty2))  # 文字也要重新渲染pygame.display.update()  # 刷新

其中确定文字对象坐标的方法:
在这里插入图片描述

pygame学习-按钮点击效果章节-动画演示

封装好的按钮

在上面“按钮点击效果”中发现要实现一个按钮点击效果的代码很多,如果按钮很多,写起来会很繁琐。这时可以用面向对象编程思想,将按钮封装起来,使用时直接调用。

坦克控制

坦克控制主要在于键盘按住不放,坦克移动;键盘松开,坦克停止。

学会了键盘按住不放,移动;键盘松开,停止。鼠标按住不放,鼠标松开实现的方法是一样的。关键在于用到了一个bool值

说明
如果按下键盘没反应一般就是输入法的问题,切换成英文输入法即可。

import pygameWIN_WIDTH = 800  # 窗口宽度
WIN_HEIGHT = 600  # 窗口高度# 初始化游戏
pygame.init()# 创建窗口
window = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))  # 实际开发中窗口宽和高都是设置为全局变量,这样以后修改很方便(类似于封装的好处)
pygame.display.set_caption('动画原理')  # 设置标题
window.fill((255, 255, 255))  # 背景# 放坦克
tank_up = pygame.image.load('坦克up.png')  # 向上的坦克
tank_down = pygame.image.load('坦克down.png')  # 向下的坦克
tank_left = pygame.image.load('坦克left.png')  # 向左的坦克
tank_right = pygame.image.load('坦克right.png')  # 向右的坦克tank_up_width, tank_up_height = tank_up.get_size()
tank_x, tank_y = WIN_WIDTH / 2 - tank_up_width / 2, WIN_HEIGHT - tank_up_height  # 坦克的坐标。涉及坦克的移动(动画的移动),坐标不能写死tank = tank_up  # 默认画的是向上的坦克window.blit(tank, (tank_x, tank_y))# 刷新
pygame.display.update()is_move = False  # 是否移动。默认不动
x_speed = 0  # x坐标移动速度
y_speed = 0  # y坐标移动速度
# 游戏循环
while True:# 要实现“键盘按住不放,移动;键盘松开,停止”的效果需要将移动的效果写在for循环外面if is_move == True:window.fill((255, 255, 255))  # 以背景色覆盖掉原来的tank_x += x_speedtank_y += y_speedwindow.blit(tank, (tank_x, tank_y))pygame.display.update()# 检测事件for event in pygame.event.get():if event.type == pygame.QUIT:# 退出exit()  # 如果是多线程,这里只会退出该线程,进程并不会退出# 坦克移动if event.type == pygame.KEYDOWN:char = chr(event.key)# 往上移动if char == 'w':is_move = True  # 移动x_speed = 0y_speed = -1tank = tank_upelif char == 's':is_move = True  # 向下移动x_speed = 0y_speed = 1tank = tank_downelif char == 'a':is_move = True  # 向左移动x_speed = -1y_speed = 0tank = tank_leftelif char == 'd':is_move = True  # 向右移动x_speed = 1y_speed = 0tank = tank_rightelse:is_move = False  # 停止if event.type == pygame.KEYUP:is_move = False  # 停止

在这里插入图片描述

pygame学习-坦克控制章节-动画演示

补充

前面提到使用如下代码减慢动画速度:

num = 1
while True:num += 1if num % 100 == 0:y += 1# 画图代码...

但事实上有更好的方法。pygame中有time类,可以设置游戏帧数,以此来减慢动画速度。

clock = pygame.time.Clock()  # (放到while循环外)clock.tick(60)   # 设置帧频。(放到while循环内)

贪吃蛇(简易版)

实现了简易版的贪吃蛇,没有实现更详细的控制(比如此时蛇正向上走,如果向让蛇向下走,不能直接按 ‘s’ 键,而应该先向右或向左,然后向下)。

代码目录:
在这里插入图片描述

import pygame
import random
from pygame import RectWIN_WIDTH = 800  # 窗口宽度
WIN_HEIGHT = 600  # 窗口高度# 初始化游戏
pygame.init()# 创建窗口
window = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))  # 实际开发中窗口宽和高都是设置为全局变量,这样以后修改很方便(类似于封装的好处)
pygame.display.set_caption('贪吃蛇')  # 设置标题
window.fill((255, 255, 255))  # 背景# 覆盖背景
snakebg = pygame.image.load("snakebg.png")
applebg = pygame.image.load("applebg.png")# 食物(apple)
apple = pygame.image.load("apple.png")
apple_width, apple_height = apple.get_size()
apple_x, apple_y = WIN_WIDTH // 4, WIN_HEIGHT // 4
window.blit(apple, (apple_x, apple_y))# 蛇
snake_up = pygame.image.load("snakeup.png")  # 向上
snake_down = pygame.image.load("snakedown.png")  # 向下
snake_left = pygame.image.load("snakeleft.png")  # 向左
snake_right = pygame.image.load("snakeright.png")  # 向右snake_width, snake_height = snake_up.get_size()
snake_x, snake_y = WIN_WIDTH / 2 - snake_width / 2, WIN_HEIGHT - snake_heightsnake = snake_up  # 默认向上
window.blit(snake, (snake_x, snake_y))# 刷新
pygame.display.update()clock = pygame.time.Clock()x_speed = 0  # x坐标移动速度
y_speed = -1  # y坐标移动速度# 游戏循环
while True:# 创建矩形对象用于碰撞检测snake_rect = Rect(snake_x, snake_y, snake_width, snake_height)  # 蛇的矩形对象apple_rect = Rect(apple_x, apple_y, apple.get_width(), apple.get_height())  # 苹果的矩形对象# 碰撞检测if snake_rect.colliderect(apple_rect):  # 碰撞函数window.blit(applebg, (apple_x, apple_y))apple_x, apple_y = random.randint(0, WIN_WIDTH - apple_width), random.randint(0, WIN_HEIGHT - apple_height)window.blit(snake, (snake_x, snake_y))window.blit(apple, (apple_x, apple_y))print("吃掉苹果")pygame.draw.circle(window, (255, 255, 255), (snake_x + snake_width / 2, snake_y + snake_height / 2), 52)# window.blit(snakebg, (snake_x, snake_y))snake_x += x_speedsnake_y += y_speedif snake_x <= 0 or snake_x >= WIN_WIDTH - snake_width:print('碰到墙壁,游戏结束')exit()if snake_y <= 0 or snake_y >= WIN_HEIGHT - snake_height:print('碰到墙壁,游戏结束')exit()window.blit(snake, (snake_x, snake_y))pygame.display.update()# 设置帧频clock.tick(60)# 检测事件for event in pygame.event.get():if event.type == pygame.QUIT:# 退出exit()  # 如果是多线程,这里只会退出该线程,进程并不会退出if event.type == pygame.KEYDOWN:char = chr(event.key)if chr(event.key) == 'w':  # 向上x_speed = 0y_speed = -1snake = snake_upelif chr(event.key) == 's':  # 向下x_speed = 0y_speed = 1snake = snake_downelif chr(event.key) == 'a':  # 向左x_speed = -1y_speed = 0snake = snake_leftelif chr(event.key) == 'd':  # 向右x_speed = 1y_speed = 0snake = snake_rightelse:pass

pygame学习-贪吃蛇章节-动画演示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/855473.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ElasticSearch学习篇13_《检索技术核心20讲》进阶篇之LSM树

背景 学习极客实践课程《检索技术核心20讲》https://time.geekbang.org/column/article/215243&#xff0c;文档形式记录笔记。 内容 磁盘和内存数据读取特点 工业界中数据量往往很庞大&#xff0c;比如数据无法全部加载进内存&#xff0c;无法支持索引的高效实时更新&…

Nature Electronics|微器件在柔性基底上的高密度集成(可穿戴电子/界面调控/电子皮肤/柔性电子)

2024年4月22日,韩国首尔大学Yongtaek Hong和美国斯坦福大学Byeongmoon Lee团队,在《Nature Electronics》上发布了一篇题为“A site-selective integration strategy for microdevices on conformable substrates”的论文。论文内容如下: 一、 摘要 微器件可以被集成在柔性…

【GD32F303红枫派使用手册】第十九节

19.1 实验内容 通过本实验主要学习以下内容&#xff1a; SPI简介 GD32F303 SPI简介 SPI NOR FLASH——GD25Q32ESIGR简介 使用GD32F303 SPI接口实现对GD25Q32ESIGR的读写操作 19.2 实验原理 19.2.1 SPI简介 SPI&#xff08;Serial Peripheral interface&#xff09;&…

Django期末重点

思维导图 一、Djanog框架基础 MVT设计模式&#xff08;model模型【操作数据库】、template模板【页面展示】、view视图【处理请求和调用模型模板】&#xff09; 二、Django项目框架搭建 创建项目骨架 django-admin startproject 项目名启动服务 &#xff08;1&#xff09;p…

STM32(七)———TIM定时器(基本and通用)

文章目录 前言一、通用定时器TIM简介1.STM32F10X系列总共最多有八个定时器&#xff1a;2.三种STM32定时器的区别&#xff1a;3.STM32 的通用定时器功能&#xff1a;4.计数器模式 二、基本定时器1.基本定时器的结构框图2.定时时间的计算3.定时器的结构体和库函数 总结 前言 一个…

如何实现ElementUI动态表头?

可能看到这个标题,有些小伙伴会有些疑惑,动态表头是个什么东西,怎么没听说过? 其实动态表头在企业的项目中用途还是非常广泛的,比如erp系统什么的 那么动态表头是什么呢?说简单点就是让ElementUI的Table表格可以实现自定义表头展示+表头拖拽排序的一个功能 这个东西我…

<Rust><iced>基于rust使用iced构建GUI实例:如何将svg格式转为ico格式图片?

前言 本专栏是Rust实例应用。 环境配置 平台:windows 软件:vscode 语言:rust 库:iced、iced_aw 概述 本文是专栏第4篇实例,依旧是一个图像格式转换程序,基于rust的svg库resvg、图像处理库image以及文件处理库rfd。 流程是先用resvg获取svg图片的数据并将其转为png数据…

20.Dcoker跨宿主机容器通信之overlay

Dcoker跨宿主机容器通信之overlay http://www.cnblogs.com/CloudMan6/p/7270551.html 环境准备&#xff0c;三台机器&#xff0c;主机名为docker01&#xff08;192.168.111.11&#xff09;、docker02&#xff08;192.168.111.12&#xff09;、docker03&#xff08;192.168.111…

电子竞赛5——作息时间控制器

一 . 题目要求 用单片机制作作息时间控制器&#xff1b;用四位数码管显示实时时钟&#xff08;时、分&#xff0c;24小时制、12小时制&#xff09;&#xff0c;有秒闪&#xff0c;小时十位有零消隐&#xff1b;可用数字键或、-键校时&#xff08;可快速、-&#xff09;被校位&…

【ARMv8/ARMv9 硬件加速系列 4 -- 加解密 Cryptographic Extension 介绍】

文章目录 ARMv8.0 Cryptographic ExtensionFEAT_AESFEAT_PMULLFEAT_SHA1FEAT_SHA256ARMv8.2 扩展FEAT_SHA512FEAT_SHA3FEAT_SM3FEAT_SM4ARMv8.0 Cryptographic Extension ARMv8.0引入了加密扩展(Cryptographic Extension),旨在加速加密和解密操作。这一扩展通过新增专用指令…

C++代码编写风格:Header-Only与声明实现分离的选择

C代码编写风格&#xff1a;Header-Only与声明实现分离的选择 最近看到一些小伙伴问到了几个比较有趣的问题&#xff0c;这里总结一下&#xff0c;这些都是实际面试中出现过的问题&#xff0c;看看你知道多少&#xff0c;考察一下底子。 面试问题1&#xff1a;你通常编写代码的风…

JAVA云HIS医院管理系统源码 云HIS系统的应用场景

JAVA云HIS医院管理系统源码 云HIS系统的应用场景 云HIS是针对中小医疗健康机构推出的一套基于云端的诊所云HIS服务平台&#xff0c;包括内部管理系统、临床辅助决策系统、体检系统、客户管理与服务系统、健康管理系统、知识管理系统、医患沟通系统、线上营销系统、其他外部系…

降价潮背后:中国产业大模型落地的卡点到底在哪?

“技术是不会以任何商业行为或者人们的意愿所改变它的上限和下限的&#xff0c;它需要的时间是恒定的。” 如果说中国大模型市场最核心的话题是什么&#xff1f;降价则必然是其中之一。 从目前的参赛玩家来看&#xff0c;不论是字节豆包&#xff0c;还是阿里、百度、腾讯、科…

Linux系统之mtr命令的基本使用

Linux系统之mtr命令的基本使用 一、mtr命令介绍二、mtr命令使用帮助2.1 mtr命令的帮助信息2.2 mtr帮助信息解释 三、安装mtr工具四、mtr命令的基本使用4.1 直接使用4.2 设定ping次数4.3 禁用DNS解析4.4 显示IP地址4.5 调整间隔 五、总结 一、mtr命令介绍 mtr命令是一个网络诊断…

Multisim软件仿真之频谱分析仪

网络上有很多Multisim文件&#xff0c;有些是不能复现的&#xff0c;比如频谱仪&#xff0c;按照下面链接去操作&#xff0c;怎么也测试不出来波形&#xff0c;multisim频谱仪使用_multisim输入输出端口-CSDN博客。 原因分析&#xff1a; 1、博主设置参数未讲全&#xff0c;按…

【GUI软件】小红书蒲公英数据批量采集!高效筛选优质博主,助力品牌商

文章目录 一、背景介绍1.0 爬取目标1.1 演示视频1.2 软件说明 二、代码讲解2.0 关于接口2.1 爬虫采集模块2.2 cookie获取2.3 软件界面模块2.4 日志模块 三、获取采集软件 一、背景介绍 1.0 爬取目标 众所周知&#xff0c;蒲公英是小红书推出的优质创作者商业合作服务平台&…

海思SS928/SD3403开发笔记1——使用串口调试开发板

该板子使用串口可以调试&#xff0c;下面是win11 调试 该板子步骤 1、给板子接入鼠标、键盘、usb转串口 2、下载SecureCRT&#xff0c;并科学使用 下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/11dIkZVstvHQUhE8uS1YO0Q 提取码&#xff1a;vinv 3、安装c…

2024最新宝塔面板8.1.0企业版开心版

官方更新记录 【增加】增加【网站】-【HTML项目】 【优化】优化Docker模块使用体验 【优化】优化文件压缩和解压的速度 【修复】修复在上一版本中出现的所有已知问题 开心版更新记录 1.在 PHP切换页面&#xff0c;出现报错弹窗属于正常情况&#xff0c;是因爲没安装 企业…

【C语言】解决C语言报错:Undefined Reference

文章目录 简介什么是Undefined ReferenceUndefined Reference的常见原因如何检测和调试Undefined Reference解决Undefined Reference的最佳实践详细实例解析示例1&#xff1a;缺少函数定义示例2&#xff1a;函数声明和定义不匹配示例3&#xff1a;未链接必要的库示例4&#xff…

Linux驱动开发(一)--字符设备驱动开发基础

1、字符设备驱动简介 字符设备是 Linux 驱动中最基本的一类设备驱动&#xff0c;字符设备就是一个一个字节&#xff0c;按照字节 流进行读写操作的设备&#xff0c;读写数据是分先后顺序的。比如我们最常见的点灯、按键、IIC、SPI&#xff0c; LCD 等等都是字符设备&#xff0c…