基于Python3-Pygame的乒乓球游戏

游戏界面截图:

在这里插入图片描述

按键控制:

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

游戏玩法说明:

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

使用的文件:

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

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

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

依赖库:Pygame

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

兵乓球:ball.py

import pygame class ball(pygame.sprite.Sprite): """ 乒乓球类,存放相关参数 """ width = -1 # 宽度 speedx = -1 # 每秒横轴移动的像素点 speedy = -1 # 每秒纵轴移动的像素点 def __init__(self, color, size, screensize, speed, img=False): pygame.sprite.Sprite.__init__(self) if img: # 有图用图,忽略大小size设置,大小由图片大小肯定 try: self.image = pygame.image.load(img) self.width = self.image.get_size()[0] # 大小修正 except Exception as e: # 图片文件发生错误用方块替代 print("舒适提示: ", e, ", 请正确配置图片文件") self.image = pygame.Surface((size, size)) self.width = size self.image.fill(color) else: # 没图用方块替代 self.image = pygame.Surface((size, size)) self.width = size self.image.fill(color) self.rect = self.image.get_rect() # 位置数据 (self.WIDTH, self.HEIGHT) = screensize (self.speedx, self.speedy) = speed def reset(self, speed): self.rect.x = 490 # 球数据 self.rect.y = 80 (self.speedx, self.speedy) = speed def update(self): # 上下边界 if (((self.rect.y + self.width) > self.HEIGHT) or self.rect.y < 0): self.speedy = -self.speedy elif (self.rect.x + self.width) > self.WIDTH: # 右边界处理 self.speedx = -self.speedx self.rect.x = self.rect.x + self.speedx self.rect.y = self.rect.y + self.speedy 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

乒乓球拍:racket.py

import pygame class racket(pygame.sprite.Sprite): """ 球拍类,存放相关参数 """ rkth = 100 # 球拍默认宽度 rkwh = 10 # 球拍厚度 rkstep = 0 # 每秒球拍移动的像素个数 def __init__(self, color, size, speed, img=False): pygame.sprite.Sprite.__init__(self) if img: # 有图用图,忽略大小size设置,大小由图片大小肯定 try: self.image = pygame.image.load(img) self.rkwh = self.image.get_size()[0] # 大小修正 self.rkth = self.image.get_size()[1] except Exception as e: # 图片文件发生错误用方块替代 print("舒适提示: ", e, ", 请正确配置图片文件") self.image = pygame.Surface(size) self.width = size self.image.fill(color) else: # 没图用方块替代 self.image = pygame.Surface(size) (self.rkwh, self.rkth) = size self.image.fill(color) self.rect = self.image.get_rect() # 位置数据 self.rkstep = speed def reset(self): self.rect.y = 100 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

主程序:pong.py

#!/usr/bin/env python3 # -*- encoding: utf-8 -*- ''' @File : pong.py @Desc : 基于py3-pygame的乒乓球游戏 ''' import sys import pygame from pygame.locals import K_SPACE, K_s, K_w from ball import ball from racket import racket MHIT = "music/pong.ogg" # 击球声音文件路径 MBEG = "music/maliaobegin.ogg" # 开始音频 MFAIL = "music/fail.ogg" # 游戏失败音频 MBAK = "music/maliaorun.ogg" # 背景音乐音频 WIDTH = 808 HEIGHT = 640 FPS = 30 CBACK = (153, 255, 0) CBALL = (245, 245, 220) CRKT = (200, 0, 0) CFONT = (0, 0, 0) def main(): isload = False # 音乐是否载入 isfont = False # 字体是否存在 ispause = False # 是否暂停 isfail = False score = 0 # 分数 pygame.init() screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption('Pong Pygame program') clock = pygame.time.Clock() bball = ball(CBALL, 20, (WIDTH, HEIGHT), (280 / FPS, 180 / FPS), "img/ball.png") bball.rect.x = 490 bball.rect.y = 80 rkt = racket(CRKT, (10, 100), 220 / FPS, "img/pingpongbat.png") rkt.rect.x = 0 rkt.rect.y = 100 ball_list = pygame.sprite.Group() # 存放小球 all_list = pygame.sprite.Group() # 存放所有 ball_list.add(bball) all_list.add(bball) all_list.add(rkt) pygame.mixer.init() # 初始化音频模块并载入音频文件 try: mhit = pygame.mixer.Sound(MHIT) mbegin = pygame.mixer.Sound(MBEG) mbegin.set_volume(0.2) mfail = pygame.mixer.Sound(MFAIL) pygame.mixer.music.load(MBAK) pygame.mixer.music.set_volume(0.4) isload = True except Exception as m: print("舒适提示: ", m, ", 请正确配置音频文件") if isload: # 载入失败不会推出,后面不会有音乐罢了 pygame.mixer.music.play(-1) # 循环播放 mbegin.play() # 找不到calibri字体就会使用pygame默认字体,都不支持中文 try: ft = pygame.font.SysFont("calibri", 30) ftg = pygame.font.SysFont("calibri", 99) isfont = True except FileNotFoundError as e: print("舒适提示: ", e, ", 请在电脑上安装对应的字体") while True: screen.fill(CBACK) # 清空画面为背景色 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() # 关闭pygame模块 sys.exit(0) # 关闭程序 # 空格键按下响应,长摁无效 if event.type == pygame.KEYDOWN and pygame.key.get_pressed( )[K_SPACE]: ispause = not ispause if isfail: isfail = False # 从新开始,重置数据 bball.reset((280 / FPS, 180 / FPS)) rkt.reset() score = 0 if isload: mbegin.play() if (not ispause) and (not isfail): # 未暂停且未结束的状况下才处理移动 if (rkt.rect.y - rkt.rkstep >= 0) and pygame.key.get_pressed()[K_w]: rkt.rect.y = rkt.rect.y - rkt.rkstep if (rkt.rect.y + rkt.rkth + rkt.rkstep <= HEIGHT) and pygame.key.get_pressed()[K_s]: rkt.rect.y = rkt.rect.y + rkt.rkstep bball.update() if bball.rect.x < (0.7 * rkt.rkwh): # 左边界 if pygame.sprite.collide_mask(bball, rkt): # 像素遮罩(碰撞)检测 score = score + 1 bball.speedx = -bball.speedx if isload: # 避免音频未正确加载致使的程序异常结束 mhit.play() else: # 未击中球拍 ispause = True isfail = True if isload: mfail.play() if isfail and isfont: tover = ftg.render("Game Over", True, CFONT) trest = 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 = ft.render("Press SPACE to continue", True, CFONT) screen.blit(pause, (250, 300)) if isfont: text = ft.render("Score: " + str(score), True, CFONT) screen.blit(text, (100, 0)) all_list.draw(screen) # 绘制全部的sprite对象 clock.tick(FPS) # 以每秒30帧的速率进行绘制 pygame.display.update() if __name__ == '__main__': main() 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131

玩一局儿:

在这里插入图片描述

认识Pygame

pygame官方文档

官方帮助文档https://www.pygame.org/docs/英文文档,能够在页面直接使用翻译。ui

pygame是什么

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

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模块,能够对图像进行读取和保存。翻译

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

img = pygame.image.load(filename)

能够读取文件名为filename的图像文件,pygame会自动肯定文件的类型(好比GIF或者BMP),通常来讲支持JPG、PNG、GIF (non animated)、BMP、PCX、TGA (uncompressed)、TIF、LBM (及PBM)、PBM (及PGM, PPM)、XPM等。它返回一个包含图像的Surface,Surface的格式和原来的文件相同(包括颜色格式、透明色和alpha透明)。

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

这个函数能够把img这个Surface的内容保存为filename指定的图像文件,文件格式能够是BMP、TGA、PNG或者JPEG。若是文件扩展名不认识,默认保存为TGA格式。TGA和BMP格式都是非压缩的文件。

还有pygame.image.tostring、pygame.image.fromstring、pygame.image.frombuffer函数能够把图像序列化,即把图像保存在字符串中或者从字符串中读取图像。

变换

使用pygame.transform模块中的函数,能够对图像进行简单的变换。全部的这些函数都须要一个Surface参数指明要处理的图像,并生成一个新的图像表示处理后的结果,原来的图像不会被改变。

使用pygame.transform.flip能够上下左右颠倒图像,好比

newimg = pygame.transform.flip(img, True, False)

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

使用pygame.transform.scale能够对图像进行缩放,好比

newimg = pygame.transform.resize(img, (640, 480))

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

使用pygame.transform.rotate能够对图像进行旋转,好比

newimg = pygame.transform.rotate(img, 30.0)

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

使用pygame.transform.rotozoom能够对图像进行缩放并旋转,好比

newimg = pygame.transform.rotozoom(img, 30.0, 2.0)

第一个参数指定要处理的图像,第二个参数指定旋转的角度数,第三个参数指定缩放的比例。返回处理后的图像。这个函数和前面两个函数不同,这个函数会对图像进行滤波处理,图像效果会更好,可是速度会慢不少。

使用pygame.transform.scale2x能够对图像进行快速的两倍大小的放大,好比

newimg = pygame.transform.scale2x(img)

使用pygame.transform.chop能够对图像进行裁减,好比

newimg = pygame.transform.chop(img, (100, 100, 200, 200))

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

对surface的控制

像素格式

pygame里的Surface是用来表示图像的对象。Surface有必定的大小和像素格式。在建立的时候,能够指定。

pygame.Surface((width, height), flags=0, depth=0, masks=None): return Surfacepygame.Surface((width, height), flags=0, Surface): return Surface

若是是8bit像素格式的Surface,它还会用一个调色板映射到24比特颜色。像素格式能够经过指定像素深度或者已有的Surface来控制。flags标志位参数是其余一些Surface选项的集合,你能够指定以下的标志

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

8bit的Surface有一个调色板,把8bit的整数映射到RGB彩色。经过下面函数能够对调色板进行设置:

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

经过下面的函数能够得到当前的调色板:

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

不一样像素类型的Surface之间的blit操做是很慢的,因此通常在blit以前要先经过Surface.convert对图像进行像素格式的变换。Surface.convert有多种不一样的用法

Surface.convert(Surface): return SurfaceSurface.convert(depth, flags=0): return SurfaceSurface.convert(masks, flags=0): return SurfaceSurface.convert(): return Surface

新的像素格式能够由现存其它Surface肯定,也能够由depth,flags或者masks决定。这些参数和pygame.Surface的参数相似。

若是没有参数,新的Surface会和display Surface的像素格式同样。这是画图最快的格式。转换全部须要屡次blit的Surface是一个好主意。

转换出来的Surface不会有像素alpha。若是原来的Surface里面有,他们会被去掉。参看Surface.convert_alpha来保留或者建立每像素alpha。

若是Surface是有alpha通道的,而且须要保留这个信息,则须要使用Surface.convert_alpha:

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

块复制

一个图像复制到另外一个上面,这是游戏中最经常使用的操做,由blit函数来实现

Surface.blit(source, dest, area=None, special_flags = 0): return Rect

画的位置能够由dest参数指定。dest能够是一对坐标值,表示源Surface的左上角在这个Surface上的坐标。dest也能够是一个矩形,矩形的左上角做为blit的位置,而矩形的大小不影响blit。

有一个可选的area矩形参数,能够用来指定只画源Surface的一部分。

一个可选的special_flags参数,能够是BLEND_ADD、BLEND_SUB、BLEND_MULT、BLEND_MIN、BLEND_MAX。未来也可能有其它特殊标记添加进来。

函数返回的矩形表示受影响的像素的区域,不包括目标Surface之外的像素,也不包括剪切区域之外的像素。

透明

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

要设置透明色,使用Surface.set_colorkey函数:

Surface.set_colorkey(Color, flags=0): return NoneSurface.set_colorkey(None): return None

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

Surface的当前透明色能够经过Surface.get_colorkey得到:

Surface.get_colorkey(): return RGB or None

若是没有透明色,则函数返回None。

要设置Surface的alpha值,能够经过Surface.set_alpha来实现:

Surface.set_alpha(value, flags=0): return NoneSurface.set_alpha(None): return None

透明值value能够取0到255之间的值,0是彻底透明,255是彻底不透明。若是value是None,则Surface就没有alpha透明了。

Surface当前的alpha值能够经过Surface.get_alpha得到:

Surface.get_alpha(): return int_value or None

若是没有alpha透明,则这个函数返回None。

每像素在绘图的时侯能够经过颜色元组的第四个参数指定。

剪切区域

每一个Surface包含一个剪切区域。默认状况下,剪切区域是整个Surface。若是改变了剪切区域,全部的画图操做都会限制在一个比较小的范围以内。

经过Surface.set_clip能够设置剪切区域:

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

若是参数是None,则整个Surface均可以修改。剪切区域老是在Surface自己的区域只内的。若是剪切区域比Surface的区域大,则会自动缩小到Surface区域以内。

要得到Surface的当前剪切区域,能够经过Surface.get_clip:

Surface.get_clip(): return Rect

一个Surface老是返回一个有效的矩形,不会超过图像的边界范围。若是Surface设置了None做为剪切区域,则Surface会返回整个Surface的区域。

锁定

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

Surface.lock(): return None

锁定完后,能够对Surface上的像素进行操做,操做完成后,应该及时解锁:

Surface.unlock(): return None

一个Surface是否要先锁定再操做,能够经过Surface.mustlock来判断:

Surface.mustlock(): return bool

这个函数返回Ture则须要锁定,不然不须要锁定。一个Surface当前的锁定状态能够经过Surface.get_locked来得到:

Surface.get_locked(): return bool

这个函数返回True表示已经锁定了,False表示没有锁定。

实际上,pygame中全部须要锁定Surface才能操做的函数都会自动地对Surface锁定和解锁。通常状况下不须要调用lock和unlock函 数。可是若是在一段代码中须要反复对Surface上的像素进行操做,则每次都进行锁定和解锁会很是的慢,因此能够在这一串操做开始的时候进行锁定,这一 串操做结束后解锁,避免重复的锁定解锁操做。

绘图

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

首先导入pygame.draw模块。

import pygame.draw

若是已经用了import pygame,则pygame.draw模块也被自动导入了。

而后准备好要在上面绘制图形的Surface,好比

surface = pygame.display.set_mode((640, 480))

画矩形

接下来就能够在surface上面绘制想要的图形了。好比说画矩形可使用pygame.draw.rect函数:

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

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

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

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

默认状况下,画出来的矩形是实心的(中间填充了指定的颜色)。若是要画一个只有边框的矩形,能够指定一个可选的参数width。好比

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

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

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

画多边形

用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或者被忽略,多边形是被填充的。

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是圆的圆心,第四个参数radius是半径大小。可选的第五个参数width是圆边的粗细,若是width缺省或者是0圆会被填充。

画椭圆

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

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

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

画弧线

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

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

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

画线段

pygame.draw.line函数能够画一条直线段。好比

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

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

画连续的线段

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

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

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

画抗锯齿的线段

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

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

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

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

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

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

点操做

画点的方法和其它方法不太同样,用Surface.set_at方法完成画点的操做,好比:

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

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

除了能够在Surface上画点,还能够用Surface.get_at读取Surface上像素的值。好比

color = surface.get_at((100, 100))

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

填充区域

Surface.fill方法能够用一种颜色填充一个矩形区域。好比

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

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

写字

相对于在Surface上画图,在Surface上写文字要复杂得多。

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

import pygame.fontpygame.font.init()

选择字体

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

pygame.font.get_fonts()

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

而后再用字体名字列表中的一个名字能够建立一个字体对象。

font = pygame.font.SysFont(“monospace”, 12)

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

若是是要使用本身给的字体文件,能够这样建立字体对象

font = pygame.font.Font("/usr/share/fonts/truetype/arphic/uming.ttf", 12)

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

建立文字Surface

使用字体对象的Font.render函数能够建立一个Surface,里面包含写出来的文字。好比

font_surface = font.render(“Hello world!”, False, (255,0,0))

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

要在已有的Surface上写字,只能先建立一个只包含文字的Surface,而后把它blit到已有的Surface上。好比:surface.blit(font_surface, (100, 100))

 

参考资料:

植物大战僵尸破解版: http://www.pvzbaike.com/archives/pvz_pojie/

相关文章
相关标签/搜索