热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于Python3Pygame的乒乓球游戏

游戏界面截图:按键控制:空格:暂停开始W:上S:下游戏玩法说明:开始游戏之后,

游戏界面截图:

在这里插入图片描述


按键控制:

空格: 暂停/开始
W: 上
S: 下


游戏玩法说明:

开始游戏之后,按键盘W/S按键控制球拍上下移动,接住球即可继续游戏,没接住的话游戏结束。结束后按空格可以重新开始游戏


使用的文件:

在这里插入图片描述
图片和音乐也可以没有,可跳过, 但是游戏运行后没音效和图片。下载音频和图片压缩包,解压放到代码相同目录下,百度网盘 :https://pan.baidu.com/s/12QXF2530ymr_sdXAa-e43g 提取码: q6cw

介绍完毕,下面开始撸代码。代码注释比较详细,可以直接复制运行,也可以仔细阅读学习。

Sprite为我们提供了一个装载游戏对象的类,比如这里面的球拍和球,而Group则是Sprite的组合,可以轻松的对Group里面的各个sprite进行碰撞检测、删除、绘制。


依赖库:Pygame

安装pygame模块 : pip install pygame
在这里插入图片描述


兵乓球:ball.py

import pygameclass ball(pygame.sprite.Sprite):"""乒乓球类&#xff0c;存放相关参数"""width &#61; -1 # 宽度speedx &#61; -1 # 每秒横轴移动的像素点speedy &#61; -1 # 每秒纵轴移动的像素点def __init__(self, color, size, screensize, speed, img&#61;False):pygame.sprite.Sprite.__init__(self)if img: # 有图用图&#xff0c;忽略大小size设置&#xff0c;大小由图片大小确定try:self.image &#61; pygame.image.load(img)self.width &#61; self.image.get_size()[0] # 大小修正except Exception as e: # 图片文件发生错误用方块替代print("温馨提示&#xff1a; ", e, "&#xff0c; 请正确配置图片文件")self.image &#61; pygame.Surface((size, size))self.width &#61; sizeself.image.fill(color)else: # 没图用方块替代self.image &#61; pygame.Surface((size, size))self.width &#61; sizeself.image.fill(color)self.rect &#61; self.image.get_rect() # 位置数据(self.WIDTH, self.HEIGHT) &#61; screensize(self.speedx, self.speedy) &#61; speeddef reset(self, speed):self.rect.x &#61; 490 # 球数据self.rect.y &#61; 80(self.speedx, self.speedy) &#61; speeddef update(self):# 上下边界if (((self.rect.y &#43; self.width) > self.HEIGHT) or self.rect.y < 0):self.speedy &#61; -self.speedyelif (self.rect.x &#43; self.width) > self.WIDTH: # 右边界处理self.speedx &#61; -self.speedxself.rect.x &#61; self.rect.x &#43; self.speedxself.rect.y &#61; self.rect.y &#43; self.speedy

乒乓球拍&#xff1a;racket.py

import pygameclass racket(pygame.sprite.Sprite):"""球拍类&#xff0c;存放相关参数"""rkth &#61; 100 # 球拍默认宽度rkwh &#61; 10 # 球拍厚度rkstep &#61; 0 # 每秒球拍移动的像素个数def __init__(self, color, size, speed, img&#61;False):pygame.sprite.Sprite.__init__(self)if img: # 有图用图&#xff0c;忽略大小size设置&#xff0c;大小由图片大小确定try:self.image &#61; pygame.image.load(img)self.rkwh &#61; self.image.get_size()[0] # 大小修正self.rkth &#61; self.image.get_size()[1]except Exception as e: # 图片文件发生错误用方块替代print("温馨提示&#xff1a; ", e, "&#xff0c; 请正确配置图片文件")self.image &#61; pygame.Surface(size)self.width &#61; sizeself.image.fill(color)else: # 没图用方块替代self.image &#61; pygame.Surface(size)(self.rkwh, self.rkth) &#61; sizeself.image.fill(color)self.rect &#61; self.image.get_rect() # 位置数据self.rkstep &#61; speeddef reset(self):self.rect.y &#61; 100

主程序&#xff1a;pong.py

#!/usr/bin/env python3
# -*- encoding: utf-8 -*-
&#39;&#39;&#39;
&#64;File : pong.py
&#64;Desc : 基于py3-pygame的乒乓球游戏
&#39;&#39;&#39;

import sys
import pygame
from pygame.locals import K_SPACE, K_s, K_w
from ball import ball
from racket import racketMHIT &#61; "music/pong.ogg" # 击球声音文件路径
MBEG &#61; "music/maliaobegin.ogg" # 开始音频
MFAIL &#61; "music/fail.ogg" # 游戏失败音频
MBAK &#61; "music/maliaorun.ogg" # 背景音乐音频WIDTH &#61; 808
HEIGHT &#61; 640
FPS &#61; 30
CBACK &#61; (153, 255, 0)
CBALL &#61; (245, 245, 220)
CRKT &#61; (200, 0, 0)
CFONT &#61; (0, 0, 0)def main():isload &#61; False # 音乐是否载入isfont &#61; False # 字体是否存在ispause &#61; False # 是否暂停isfail &#61; Falsescore &#61; 0 # 分数pygame.init()screen &#61; pygame.display.set_mode((WIDTH, HEIGHT))pygame.display.set_caption(&#39;Pong Pygame program&#39;)clock &#61; pygame.time.Clock()bball &#61; ball(CBALL, 20, (WIDTH, HEIGHT), (280 / FPS, 180 / FPS),"img/ball.png")bball.rect.x &#61; 490bball.rect.y &#61; 80rkt &#61; racket(CRKT, (10, 100), 220 / FPS, "img/pingpongbat.png")rkt.rect.x &#61; 0rkt.rect.y &#61; 100ball_list &#61; pygame.sprite.Group() # 存放小球all_list &#61; pygame.sprite.Group() # 存放全部ball_list.add(bball)all_list.add(bball)all_list.add(rkt)pygame.mixer.init() # 初始化音频模块并载入音频文件try:mhit &#61; pygame.mixer.Sound(MHIT)mbegin &#61; pygame.mixer.Sound(MBEG)mbegin.set_volume(0.2)mfail &#61; pygame.mixer.Sound(MFAIL)pygame.mixer.music.load(MBAK)pygame.mixer.music.set_volume(0.4)isload &#61; Trueexcept Exception as m:print("温馨提示&#xff1a; ", m, "&#xff0c; 请正确配置音频文件")if isload: # 载入失败不会推出&#xff0c;后面不会有音乐罢了pygame.mixer.music.play(-1) # 循环播放mbegin.play()# 找不到calibri字体就会使用pygame默认字体&#xff0c;都不支持中文try:ft &#61; pygame.font.SysFont("calibri", 30)ftg &#61; pygame.font.SysFont("calibri", 99)isfont &#61; Trueexcept FileNotFoundError as e:print("温馨提示&#xff1a; ", e, "&#xff0c; 请在电脑上安装对应的字体")while True:screen.fill(CBACK) # 清空画面为背景色for event in pygame.event.get():if event.type &#61;&#61; pygame.QUIT:pygame.quit() # 关闭pygame模块sys.exit(0) # 关闭程序# 空格键按下响应&#xff0c;长摁无效if event.type &#61;&#61; pygame.KEYDOWN and pygame.key.get_pressed()[K_SPACE]:ispause &#61; not ispauseif isfail:isfail &#61; False # 重新开始&#xff0c;重置数据bball.reset((280 / FPS, 180 / FPS))rkt.reset()score &#61; 0if isload:mbegin.play()if (not ispause) and (not isfail): # 未暂停且未结束的情况下才处理移动if (rkt.rect.y - rkt.rkstep >&#61;0) and pygame.key.get_pressed()[K_w]:rkt.rect.y &#61; rkt.rect.y - rkt.rkstepif (rkt.rect.y &#43; rkt.rkth &#43; rkt.rkstep <&#61;HEIGHT) and pygame.key.get_pressed()[K_s]:rkt.rect.y &#61; rkt.rect.y &#43; rkt.rkstepbball.update()if bball.rect.x < (0.7 * rkt.rkwh): # 左边界if pygame.sprite.collide_mask(bball, rkt): # 像素遮罩&#xff08;碰撞&#xff09;检测score &#61; score &#43; 1bball.speedx &#61; -bball.speedxif isload: # 避免音频未正确加载导致的程序异常结束mhit.play()else: # 未击中球拍ispause &#61; Trueisfail &#61; Trueif isload:mfail.play()if isfail and isfont:tover &#61; ftg.render("Game Over", True, CFONT)trest &#61; ft.render("Press SPACE to start again", True, CFONT)screen.blit(tover, (150, 200))screen.blit(trest, (220, 400))if ispause and isfont and (not isfail):pause &#61; ft.render("Press SPACE to continue", True, CFONT)screen.blit(pause, (250, 300))if isfont:text &#61; ft.render("Score: " &#43; str(score), True, CFONT)screen.blit(text, (100, 0))all_list.draw(screen) # 绘制所有的sprite对象clock.tick(FPS) # 以每秒30帧的速率进行绘制pygame.display.update()if __name__ &#61;&#61; &#39;__main__&#39;:main()

玩一局儿&#xff1a;

在这里插入图片描述


认识Pygame


pygame官方文档

官方帮助文档&#xff1a;https://www.pygame.org/docs/英文文档&#xff0c;可以在页面直接使用翻译。


pygame是什么

pygame是跨平台Python模块&#xff0c;专门为电子游戏设计&#xff0c;包含图像、声音等&#xff1b;简单的说它是别人已经编写好的程序&#xff0c;并放在了一个类似库里&#xff0c;专门给别人使用的。


pygame常用模块


模块名功能
pygame.cdrom访问光驱
pygame.cursors加载光驱
pygame.display访问显示设备
pygame.draw绘制形状、线和点
pygame.event管理事件
pygame.font使用字体
pygame.image加载和存储图片
pygame.joystick使用游戏手柄或类似的东西
pygame.key读取键盘按键
pygame.mixer声音
pygame.mouse鼠标
pygame.movie播放视频
pygame.music播放音频
pygame.overlay访问高级视频叠加
pygame.rect管理矩形区域
pygame.sndarray操作声音数据
pygame.sprite操作移动图像
pygame.surface管理图像和屏幕
pygame.surfarray管理点阵图像数据
pygame.time管理时间和帧信息
pygame.transform缩放和移动图像

pygame的图形接口


pygame图形接口

使用pygame.image模块&#xff0c;可以对图像进行读取和保存。

使用pygame.image.load读取图像文件。

img &#61; pygame.image.load(filename)

可以读取文件名为filename的图像文件&#xff0c;pygame会自动确定文件的类型&#xff08;比如GIF或者BMP&#xff09;&#xff0c;一般来说支持JPG、PNG、GIF (non animated)、BMP、PCX、TGA (uncompressed)、TIF、LBM (及PBM)、PBM (及PGM, PPM)、XPM等。它返回一个包含图像的Surface&#xff0c;Surface的格式和原来的文件相同&#xff08;包括颜色格式、透明色和alpha透明&#xff09;。

使用pygame.image.save可以把图像保存到文件中。
pygame.image.save(img, filename)

这个函数可以把img这个Surface的内容保存为filename指定的图像文件&#xff0c;文件格式可以是BMP、TGA、PNG或者JPEG。如果文件扩展名不认识&#xff0c;默认保存为TGA格式。TGA和BMP格式都是非压缩的文件。

还有pygame.image.tostring、pygame.image.fromstring、pygame.image.frombuffer函数可以把图像序列化&#xff0c;即把图像保存在字符串中或者从字符串中读取图像。


变换

使用pygame.transform模块中的函数&#xff0c;可以对图像进行简单的变换。所有的这些函数都需要一个Surface参数指明要处理的图像&#xff0c;并生成一个新的图像表示处理后的结果&#xff0c;原来的图像不会被改变。

使用pygame.transform.flip可以上下左右颠倒图像&#xff0c;比如

newimg &#61; pygame.transform.flip(img, True, False)

第一个参数指定要翻转的图像&#xff0c;第二个参数指定是否对图像进行左右颠倒&#xff0c;第三个参数指定是否对图像进行上下颠倒。函数返回颠倒后的图像。

使用pygame.transform.scale可以对图像进行缩放&#xff0c;比如

newimg &#61; pygame.transform.resize(img, (640, 480))

第一个参数指定要缩放的图像&#xff0c;第二个参数指定缩放后的图像大小&#xff0c;函数返回缩放后的图像。

使用pygame.transform.rotate可以对图像进行旋转&#xff0c;比如

newimg &#61; pygame.transform.rotate(img, 30.0)

第一个参数指定要旋转的图像&#xff0c;第二个参数指定旋转的角度数&#xff0c;正值为逆时针旋转&#xff0c;负值是顺时针旋转。函数返回旋转后的图像。旋转后的图像可能比原来的图像大&#xff0c;才能够容纳原来的整个图像&#xff0c;空出来的部分会补上透明色或者原来图像的左上角点的颜色。

使用pygame.transform.rotozoom可以对图像进行缩放并旋转&#xff0c;比如

newimg &#61; pygame.transform.rotozoom(img, 30.0, 2.0)

第一个参数指定要处理的图像&#xff0c;第二个参数指定旋转的角度数&#xff0c;第三个参数指定缩放的比例。返回处理后的图像。这个函数和前面两个函数不一样&#xff0c;这个函数会对图像进行滤波处理&#xff0c;图像效果会更好&#xff0c;但是速度会慢很多。

使用pygame.transform.scale2x可以对图像进行快速的两倍大小的放大&#xff0c;比如

newimg &#61; pygame.transform.scale2x(img)

使用pygame.transform.chop可以对图像进行裁减&#xff0c;比如

newimg &#61; pygame.transform.chop(img, (100, 100, 200, 200))

第一个参数指定要裁减的图像&#xff0c;第二个参数指定要保留的图像的区域。返回裁减后留下的图像。


对surface的控制


像素格式

pygame里的Surface是用来表示图像的对象。Surface有一定的大小和像素格式。在创建的时候&#xff0c;可以指定。

pygame.Surface((width, height), flags&#61;0, depth&#61;0, masks&#61;None): return Surfacepygame.Surface((width, height), flags&#61;0, Surface): return Surface

如果是8bit像素格式的Surface&#xff0c;它还会用一个调色板映射到24比特颜色。像素格式可以通过指定像素深度或者已有的Surface来控制。flags标志位参数是其他一些Surface选项的集合&#xff0c;你可以指定如下的标志

HWSURFACE, 在视频内存中创建图像 SRCALPHA, 像素格式中会包含一个alpha通道这些参数都仅仅是一个请求&#xff0c;在实际中可能并不能实现。高级用户可以组合一组颜色屏蔽位&#xff0c;masks是4个整数的集合&#xff0c;表示像素里的哪个位用来表示一种颜色。一般的Surface不需要masks参数。

8bit的Surface有一个调色板&#xff0c;把8bit的整数映射到RGB彩色。通过下面函数可以对调色板进行设置&#xff1a;

Surface.set_at(index, RGB): return NoneSurface.set_palette([RGB, RGB, RGB, …]): return None

通过下面的函数可以获得当前的调色板&#xff1a;

Surface.get_palette(): return [RGB, RGB, RGB, …]Surface.get_palette_at(index): return RGB

不同像素类型的Surface之间的blit操作是很慢的&#xff0c;所以一般在blit之前要先通过Surface.convert对图像进行像素格式的变换。Surface.convert有多种不同的用法

Surface.convert(Surface): return SurfaceSurface.convert(depth, flags&#61;0): return SurfaceSurface.convert(masks, flags&#61;0): return SurfaceSurface.convert(): return Surface

新的像素格式可以由现存其它Surface确定&#xff0c;也可以由depth&#xff0c;flags或者masks决定。这些参数和pygame.Surface的参数类似。

如果没有参数&#xff0c;新的Surface会和display Surface的像素格式一样。这是画图最快的格式。转换所有需要多次blit的Surface是一个好主意。

转换出来的Surface不会有像素alpha。如果原来的Surface里面有&#xff0c;他们会被去掉。参看Surface.convert_alpha来保留或者创建每像素alpha。

如果Surface是有alpha通道的&#xff0c;并且需要保留这个信息&#xff0c;则需要使用Surface.convert_alpha&#xff1a;

Surface.convert_alpha(Surface): return SurfaceSurface.convert_alpha(): return Surface


块复制

一个图像复制到另一个上面&#xff0c;这是游戏中最常用的操作&#xff0c;由blit函数来实现

Surface.blit(source, dest, area&#61;None, special_flags &#61; 0): return Rect

画的位置可以由dest参数指定。dest可以是一对坐标值&#xff0c;表示源Surface的左上角在这个Surface上的坐标。dest也可以是一个矩形&#xff0c;矩形的左上角作为blit的位置&#xff0c;而矩形的大小不影响blit。

有一个可选的area矩形参数&#xff0c;可以用来指定只画源Surface的一部分。

一个可选的special_flags参数&#xff0c;可以是BLEND_ADD、BLEND_SUB、BLEND_MULT、BLEND_MIN、BLEND_MAX。将来也可能有其它特殊标记添加进来。

函数返回的矩形表示受影响的像素的区域&#xff0c;不包括目标Surface以外的像素&#xff0c;也不包括剪切区域以外的像素。


透明

pygame支持三种类型 的透明&#xff1a;透明色(colorkey)&#xff0c;Surface alpha和每像素alpha。Surface alpha可以和透明色(colorkey)混合使用&#xff0c;但是有像素alpha的图像不能够使用其它模式。透明色(colorkey)让一种颜色值透明。任 何和这个颜色相同的像素都不会被画出来。Surface alpha值是单独一个值用来改变整个图像的透明度。Surface alpha值是255表示不透明&#xff0c;值是0表示全透明。而每像素alpha是不一样的&#xff0c;它为每个像素保存了一个透明值。这种方法允许精确的控制透明效果&#xff0c;但 是这种方法也是最慢的。每像素alpha不能和其它方法混用。

要设置透明色&#xff0c;使用Surface.set_colorkey函数&#xff1a;

Surface.set_colorkey(Color, flags&#61;0): return NoneSurface.set_colorkey(None): return None

当 把这个Surface blit到令一个Surface时候&#xff0c;和这个透明色颜色相同的像素会变成透明。color参数可以是RGB颜色或者是一个映射的整数。如果传送的是 None&#xff0c;则Surface会没有透明色。如果是有每像素透明的Surface&#xff0c;透明色会被忽略。透明色可以和Surface alpha混合使用。可选的flags参数可以是pygame.RLEACCEL&#xff0c;用来在没有加速的时候提供更好的性能。设置了RLEACCEL的 Surface作为源Surface blit更快&#xff0c;但是修改Surface的内容会更慢。

Surface的当前透明色可以通过Surface.get_colorkey获得&#xff1a;

Surface.get_colorkey(): return RGB or None

如果没有透明色&#xff0c;则函数返回None。

要设置Surface的alpha值&#xff0c;可以通过Surface.set_alpha来实现&#xff1a;

Surface.set_alpha(value, flags&#61;0): return NoneSurface.set_alpha(None): return None

透明值value可以取0到255之间的值&#xff0c;0是完全透明&#xff0c;255是完全不透明。如果value是None&#xff0c;则Surface就没有alpha透明了。

Surface当前的alpha值可以通过Surface.get_alpha获得&#xff1a;

Surface.get_alpha(): return int_value or None

如果没有alpha透明&#xff0c;则这个函数返回None。

每像素在绘图的时侯可以通过颜色元组的第四个参数指定。


剪切区域

每个Surface包含一个剪切区域。默认情况下&#xff0c;剪切区域是整个Surface。如果改变了剪切区域&#xff0c;所有的画图操作都会限制在一个比较小的范围之内。

通过Surface.set_clip可以设置剪切区域&#xff1a;

Surface.set_clip(rect): return NoneSurface.set_clip(None): return None

如果参数是None&#xff0c;则整个Surface都可以修改。剪切区域总是在Surface本身的区域只内的。如果剪切区域比Surface的区域大&#xff0c;则会自动缩小到Surface区域之内。

要获得Surface的当前剪切区域&#xff0c;可以通过Surface.get_clip&#xff1a;

Surface.get_clip(): return Rect

一个Surface总是返回一个有效的矩形&#xff0c;不会超过图像的边界范围。如果Surface设置了None作为剪切区域&#xff0c;则Surface会返回整个Surface的区域。


锁定

对于硬件加速的Surface&#xff0c;它有可能被存在显示内存中。要访问这些Surface上面的像素&#xff0c;就必须先通过Surface.lock对像素进行锁定&#xff1a;

Surface.lock(): return None

锁定完后&#xff0c;可以对Surface上的像素进行操作&#xff0c;操作完成后&#xff0c;应该及时解锁&#xff1a;

Surface.unlock(): return None

一个Surface是否要先锁定再操作&#xff0c;可以通过Surface.mustlock来判断&#xff1a;

Surface.mustlock(): return bool

这个函数返回Ture则需要锁定&#xff0c;否则不需要锁定。一个Surface当前的锁定状态可以通过Surface.get_locked来获得&#xff1a;

Surface.get_locked(): return bool

这个函数返回True表示已经锁定了&#xff0c;False表示没有锁定。

实际上&#xff0c;pygame中所有需要锁定Surface才能操作的函数都会自动地对Surface锁定和解锁。一般情况下不需要调用lock和unlock函 数。但是如果在一段代码中需要反复对Surface上的像素进行操作&#xff0c;则每次都进行锁定和解锁会非常的慢&#xff0c;所以可以在这一串操作开始的时候进行锁定&#xff0c;这一 串操作结束后解锁&#xff0c;避免重复的锁定解锁操作。


绘图

除了可以把事先画好的图片blit到Surface上以外&#xff0c;还可以在Surface上自行在Surface上绘制一些简单的图形&#xff0c;比如点、线、方、圆等。这个功能主要由pygame.draw模块完成。

首先导入pygame.draw模块。

import pygame.draw

如果已经用了import pygame&#xff0c;则pygame.draw模块也被自动导入了。

然后准备好要在上面绘制图形的Surface&#xff0c;比如

surface &#61; pygame.display.set_mode((640, 480))


画矩形

接下来就可以在surface上面绘制想要的图形了。比如说画矩形可以使用pygame.draw.rect函数&#xff1a;

pygame.draw.rect(surface, (0,0,255), (100, 200, 100, 100))

第一个参数指定在哪个Surface上画矩形&#xff0c;第二个参数是矩形的颜色&#xff0c;第三个参数是矩形的位置和大小。

颜 色的参数一般是一个由红绿蓝三种颜色值构成的三元组&#xff0c;0是最暗的&#xff0c;255是最亮的。比如(0,0,255)是纯蓝色&#xff0c;(255,0,0)是纯红色&#xff0c; (0,0,0)是黑色&#xff0c;(255,255,255)是白色等等。有时候也可以使用RGBA四元组来表示颜色。如果Surface包含alpha&#xff0c;四元组中 alpha值会被直接写入到Surface里面&#xff0c;画图函数并不会进行透明的绘画。颜色参数也可以是一个整数&#xff0c;是映射到Surface里的像素值。其他绘图 函数里面的颜色参数也是一样的。

矩形参数由四个值构成的元组&#xff0c;分别是矩形左上角的x、y坐标&#xff0c;矩形的宽和高。

默认情况下&#xff0c;画出来的矩形是实心的&#xff08;中间填充了指定的颜色&#xff09;。如果要画一个只有边框的矩形&#xff0c;可以指定一个可选的参数width。比如

pygame.draw.rect(surface, (0,0,255), (100, 200, 100, 100), 2)

可以在屏幕上画一个边框是2个像素粗的矩形&#xff0c;中间是透明的。如果不指定这个width参数&#xff0c;或者width指定为0&#xff0c;则画出来的矩形就是实心的。其他有些绘图函数里面也有类似的参数&#xff0c;功能也是相似的。

pygame.draw.rect函数返回一个矩形&#xff0c;表示屏幕上被修改的像素的区域范围。其它绘图函数也都有这样的返回值。


画多边形

用pygame.draw.polygon可以在Surface上画一个多边形。比如

pygame.draw.polygon(surface, (255,0,0), [(100, 100),(200, 100),(250,186.6),(200,273.2),(100, 273.2),(50,186.6)])

第三个参数pointlist参数是多边形顶点的列表。可选的第四个width参数是多边形的边的粗细。如果width是0或者被忽略&#xff0c;多边形是被填充的。

pygame.draw.polygon(surface, (0,255,0), [(100, 100),(200, 100),(250,186.6),(200,273.2),(100, 273.2),(50,186.6)],1)


画圆

pygame.draw.circle在Surface上画一个圆形。

pygame.draw.circle(surface, (255,255,0), (100, 100), 50)

第三个参数pos是圆的圆心&#xff0c;第四个参数radius是半径大小。可选的第五个参数width是圆边的粗细&#xff0c;如果width缺省或者是0圆会被填充。


画椭圆

pygame.draw.ellipse在矩形区域中画一个椭圆的形状。比如

pygame.draw.ellipse(surface, (0,255,255), (200, 200, 200, 100))

第三个参数指定的矩形区域是椭圆填充的区域。可选的第四个参数width是边的粗细。如果width缺省或者是0&#xff0c;椭圆会被填充。


画弧线

pygame.draw.arc画椭圆的一段。比如

pygame.draw.arc(surface, (0,255,0), (200, 200, 200, 100), 3.14159/3, 3.14159*2/3)

在Surface上画一个椭圆状的弧线。第三个参数rect指定椭圆填充的矩形。接下来两个角度参数指定起始和终止的角度&#xff08;以弧度为单位&#xff09;&#xff0c;朝右为0度。可选的第六个参数width是弧线的粗细&#xff0c;默认值是1。


画线段

pygame.draw.line函数可以画一条直线段。比如

pygame.draw.line(surface, (255,0,255), (100, 100), (200, 200))

第三个参数指定起点&#xff0c;第四个参数指定终点。可选的第五个参数width指定线的宽度&#xff0c;默认是1。线段终点没有箭头&#xff0c;宽的线段终点是方形的。


画连续的线段

pygame.draw.lines画多条连续的线段。比如

pygame.draw.lines(surface, (255,255,255), False, [(100, 100), (200, 200), (300, 200), (200, 100)])

第四个参数pointlist是一系列点的列表。如果第三个参数是True&#xff0c;则在最后一点和第一点之间会画一条线段。可选的第五个参数表示线的宽度&#xff0c;默认为1。这个函数不会画终点箭头和中间连接头。线段有尖锐的拐角&#xff0c;粗的线段会有不太好看的拐角。


画抗锯齿的线段

pygame.draw.aaline画抗锯齿的线段。

pygame.draw.aaline(surface, (255,255,0), (200, 100), (300, 200))

这个函数的用法和画线段的函数差不多&#xff0c;只是画出来的线段有抗锯齿效果&#xff0c;看上去比较光滑。有一个可选的第五个参数blend&#xff0c;如果blend是True&#xff0c;则阴影部分是和原始像素混合而不是直接覆盖的。这个函数接受浮点数作为点的坐标。

pygame.draw.aalines可以画多条连续的抗锯齿线段。

pygame.draw.aalines(surface, (0,0, 255), False, [(100, 100), (200, 200), (300, 100), (200, 0)])

如果第三个参数如果是True&#xff0c;则在第一个点和最后一点之间会画一条直线。有一个可选的第五个参数blend&#xff0c;如果blend参数是True&#xff0c;则阴影部分是和原始像素混合而不是直接覆盖的。这个函数接受浮点数作为点的坐标。


点操作

画点的方法和其它方法不太一样&#xff0c;用Surface.set_at方法完成画点的操作&#xff0c;比如&#xff1a;

surface.set_at((100, 100), (255,255,255))

第一个参数是点的坐标&#xff0c;第二个参数是颜色。在游戏和实时模拟中&#xff0c;一次取得和设置一个像素是很慢的。

除了可以在Surface上画点&#xff0c;还可以用Surface.get_at读取Surface上像素的值。比如

color &#61; surface.get_at((100, 100))

这个函数返回给定点的颜色值。


填充区域

Surface.fill方法可以用一种颜色填充一个矩形区域。比如

surface.fill((255,0,0), (100, 200, 100, 100))

第一个参数指定要填充的颜色&#xff0c;第二个参数指定填充的矩形区域。如果没有给定第二个参数&#xff0c;整个Surface会被填充。第二个参数会限制备填充的区域。这个函数会返回受影响的Surface区域。


写字

相对于在Surface上画图&#xff0c;在Surface上写文字要复杂得多。

首先需要导入pygame.font模块并初始化。

import pygame.fontpygame.font.init()


选择字体

然后用pygame.font.get_fonts获取可用的字体的列表。

pygame.font.get_fonts()

它返回一个字体名字的列表。

然后再用字体名字列表中的一个名字可以创建一个字体对象。

font &#61; pygame.font.SysFont(“monospace”, 12)

第一个参数指定字体的名字&#xff0c;第二个参数指定字体的大小。可选的第三个参数bold指定是否粗体&#xff0c;默认不是粗题。可选的地四个参数italic指定是否斜体&#xff0c;默认不是斜体。

如果是要使用自己给的字体文件&#xff0c;可以这样创建字体对象

font &#61; pygame.font.Font("/usr/share/fonts/truetype/arphic/uming.ttf", 12)

第一个参数指定要载入的字体文件的完整路径&#xff0c;第二个参数指定字体的大小。

创建文字Surface

使用字体对象的Font.render函数可以创建一个Surface&#xff0c;里面包含写出来的文字。比如

font_surface &#61; font.render(“Hello world!”, False, (255,0,0))

第 一个参数是要写的文字&#xff0c;文字只能包含一行&#xff0c;换行符不会被画出来。第二个参数指定是否使用抗锯齿效果&#xff0c;如果是True字符会有光滑的边缘。第三个参数是字体 的颜色。可选的第四个参数background用来指定文字背景的颜色。如果没有指定background&#xff0c;背景是透明的。返回创建的Surface&#xff0c;它 上面包含了画出来的文字&#xff0c;它的大小是能容纳这些字的最小的大小。

要在已有的Surface上写字&#xff0c;只能先创建一个只包含文字的Surface&#xff0c;然后把它blit到已有的Surface上。比如&#xff1a;surface.blit(font_surface, (100, 100))

在这里插入图片描述


推荐阅读
  • 【图像分类实战】利用DenseNet在PyTorch中实现秃头识别
    本文详细介绍了如何使用DenseNet模型在PyTorch框架下实现秃头识别。首先,文章概述了项目所需的库和全局参数设置。接着,对图像进行预处理并读取数据集。随后,构建并配置DenseNet模型,设置训练和验证流程。最后,通过测试阶段验证模型性能,并提供了完整的代码实现。本文不仅涵盖了技术细节,还提供了实用的操作指南,适合初学者和有经验的研究人员参考。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文介绍如何使用OpenCV和线性支持向量机(SVM)模型来开发一个简单的人脸识别系统,特别关注在只有一个用户数据集时的处理方法。 ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 在使用 SQL Server 时,连接故障是用户最常见的问题之一。通常,连接 SQL Server 的方法有两种:一种是通过 SQL Server 自带的客户端工具,例如 SQL Server Management Studio;另一种是通过第三方应用程序或开发工具进行连接。本文将详细分析导致连接故障的常见原因,并提供相应的解决策略,帮助用户有效排除连接问题。 ... [详细]
  • 通过使用CIFAR-10数据集,本文详细介绍了如何快速掌握Mixup数据增强技术,并展示了该方法在图像分类任务中的显著效果。实验结果表明,Mixup能够有效提高模型的泛化能力和分类精度,为图像识别领域的研究提供了有价值的参考。 ... [详细]
  • 利用树莓派畅享落网电台音乐体验
    最近重新拾起了闲置已久的树莓派,这台小巧的开发板已经沉寂了半年多。上个月闲暇时间较多,我决定将其重新启用。恰逢落网电台进行了改版,回忆起之前在树莓派论坛上看到有人用它来播放豆瓣音乐,便萌生了同样的想法。通过一番调试,终于实现了在树莓派上流畅播放落网电台音乐的功能,带来了全新的音乐享受体验。 ... [详细]
  • 利用 Python 管道实现父子进程间高效通信 ... [详细]
  • 探索聚类分析中的K-Means与DBSCAN算法及其应用
    聚类分析是一种用于解决样本或特征分类问题的统计分析方法,也是数据挖掘领域的重要算法之一。本文主要探讨了K-Means和DBSCAN两种聚类算法的原理及其应用场景。K-Means算法通过迭代优化簇中心来实现数据点的划分,适用于球形分布的数据集;而DBSCAN算法则基于密度进行聚类,能够有效识别任意形状的簇,并且对噪声数据具有较好的鲁棒性。通过对这两种算法的对比分析,本文旨在为实际应用中选择合适的聚类方法提供参考。 ... [详细]
  • 针对图像分类任务的训练方案进行了优化设计。通过引入PyTorch等深度学习框架,利用其丰富的工具包和模块,如 `torch.nn` 和 `torch.nn.functional`,提升了模型的训练效率和分类准确性。优化方案包括数据预处理、模型架构选择和损失函数的设计等方面,旨在提高图像分类任务的整体性能。 ... [详细]
  • 本文介绍了如何在iOS平台上使用GLSL着色器将YV12格式的视频帧数据转换为RGB格式,并展示了转换后的图像效果。通过详细的技术实现步骤和代码示例,读者可以轻松掌握这一过程,适用于需要进行视频处理的应用开发。 ... [详细]
  • 本文深入探讨了HTTP头部中的Expires与Cache-Control字段及其缓存机制。Cache-Control字段主要用于控制HTTP缓存行为,其在HTTP/1.1中得到了广泛应用,而HTTP/1.0中主要使用Pragma:no-cache来实现类似功能。Expires字段则定义了资源的过期时间,帮助浏览器决定是否从缓存中读取资源。文章详细解析了这两个字段的具体用法、相互关系以及在不同场景下的应用效果,为开发者提供了全面的缓存管理指南。 ... [详细]
author-avatar
廊坊0316慢摇酒吧_196
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有