需要用到pygame模块
常用语句
1.pygame.init()
初始化,使用前都加一句
2.pygame.display.set_mode(size)
设置游戏屏幕宽高
3.pygame.display.set_caption('game')
设置屏幕标题
4.pygame.image.load('a.jpg')
加载图片,加载后如果要控制其,需要先用get_rect()
获取其位置,然后用move(x,y)
移动,举例:
picture = pygame.image.load('a.jpg') #添加个图片在里面
position = picture.get_rect() #获取图像的位置矩形
position = position.move(1,1) #移动图像,这里是同时向右下移动1px
5.pygame.transform.flip(picture, True, True)
设置图像翻转,第一个代表翻转的图像,第二个代表是否水平翻转,第三个代表是否垂直翻转
6.screen.fill((255,255,255))
设置填充背景,如果不设置,原来的内容就会一直在,其实就相当于每次更新界面时把界面clear
了一下,并且clear成我们想要的背景,不过这句运行后不会直接填充,其只是写入到内存,真正填充需要在pygame.display.flip()
这句运行后才会显示
7.screen.blit(picture, position)
更新图像,跟那面那句一样只是写入到内存,真正要看到更新需要运行下面那句才能够显示
8.pygame.display.flip()
更新整个界面,也就是将所有内容一起更新显示,如果没有这句,整个屏幕一片黑,什么都没有
9.pygame.time.delay(10)
设置时间延迟(ms)
10.设置频率
需要先实例化一个Clock()
对象,然后再设置频率,举例:
clock = pygame.time.Clock()
clock.tick(200) #频率为1秒更新200次,假如设置一次移动2px,那么就会一秒移动200px
10.pygame.QUIT
退出游戏
常用方法
对图像
1.pygame.transform.flip(picture, True, False)
将图像翻转更新,第一个参数是要更新的东西,第二个代表是否水平翻转,第三个代表是否垂直翻转
2.pygame.transform.rotate(picture, angle)
将图像旋转(逆时针),第一个参数是图像,第二个是度数,比如逆时针转90度:
pygame.transform.rotate(picture, 90)
3.pygame.transform.smoothscale(picture, (x,y))
缩放图像,第一个参数是图像,后一个参数为元组,里面有两个元素,分别是其x、y方向大小,举例:
picture = pygame.transform.smoothscale(picture, (position.width*2,position.height*2)) #这里把长宽变为原来的两倍
4.surface.set_colorkey((r,g,b))
把想要变色的颜色弄透明,举例:
picture = pygame.imgae.load('a.jpg').convert()
#要弄透明,最好给图片弄个透明设置通道,也就是加个.convert()/.convert_alpha(),因为jpg不支持后者,所以这里用第一个
picture.set_colorkey((255,255,255)) #把白色弄透明
注:
对jpg
图片来说,透明度效果可能不太好,旁边偏白的阴影去不掉,而png
图片一般就能处理的很好
5.surface.set_alpha(num)
也是设置透明度,将整个图片设置透明度,范围:0-255,举例:
picture = pygame.imgae.load('a.png').convert_alpha() #加个.convert_alpha,给图片弄个透明设置通道
picture.set_alpha(80) #将透明度设置为80
注:
4、5两种透明度处理方法可以联合起来使用,比如把白色部分透明了,再把整体透明了
6.surface.get_at((x,y))
获得surface
对象上某个坐标的颜色像素,举例:
picture = pygame.image.load('a.png')
position = picture.get_rect()
print(picture.get_at(position.center)) #输出图片最中间点的颜色
结果为:(136, 0, 21, 255)
说明红绿蓝对应配色,以及透明度(255代表不透明)
7.surface.set_at((x,y),num)
设置surface对象上某个坐标的透明度,举例:
picture = pygame.image.load('a.png')
for each in range(200,500):
picture.set_at((300,each),0) #将图片坐标(300,200-500)之间的点都弄空白
绘制图形
1.pygame.draw.rect(surface,(r,g,b),rect,width)
绘制一个矩形,第一个参数说明画在哪个surface
上,比如可以是屏幕,也可以是图像上,第二个参数是一个颜色参数的元组,第三个矩形的区域,需要传入二层元组((x,y),(width,height))
,x、y表示其左上角坐标,width、height表示其长宽,第四个是线条宽度(当为0的时候代表填充内部),举例:
screen = pygame.display.set_mode((200,200))
pygame.draw.rect(screen,(255,0,0),((100,100),(5,5)),1) #在屏幕上画一个红色矩形
2.pygame.draw.circle(Surface, color, pos, radius, width)
绘制一个圆形,第三个参数是圆心坐标,第四个是半径,举例:
pygame.draw.circle(picture, (255,0,0), (10,10), 10, 1)
3.pygame.draw.line(Surface, color, start_pos, end_pos, width)
绘制一条直线,第三、四个参数代表起点和终点,举例:
pygame.draw.line(screen, (255,0,0), (1,1), (50,50), 1)
注:
还有个aaline
,和line
差不多,但是抗锯齿,也就是看起来比line柔顺些,举例:
pygame.draw.aaline(screen, (255,0,0), (1,1), (50,50), 1)
4.pygame.draw.lines(Surface, color, closed, pointlist, width)
绘制一堆线段,第三个参数代表是否首尾两个点相连(0就不相连,1相连),第四个参数是一堆点坐标的列表,举例:
list_lines = ((1,1),(10,0),(200,3),(2,50),(3,6),(5,1))
pygame.draw.lines(screen, (255,0,0), 1, list_lines, 1)
注:
像线段这种东西是没有包着东西的,所以说width不能设置为0(否则没东西显示),因为填充不了(aaline
除外,而且aaline如果设置为0,会比原来更深、粗一点)
5.pygame.draw.polygon(Surface, color, pointlist, width)
绘制一个多边形,第三个参数是坐标列表,代表多边形各个顶点,其实和上面那个一堆线段效果挺像的,但是这个是一个图形,有东西包着,所以可以width=0
来填充,举例:
list_poly = ((1,1),(10,0),(200,3),(2,50),(3,6),(5,1))
pygame.draw.polygon(screen, (255,0,0), list_poly, 0)
6.pygame.draw.ellipse(Surface, color, rect, width)
绘制一个椭圆,其实质就是照着一个矩形里绘制一个最大的圆,所以第三个参数就是那个外面框这的矩形大小(假装有),举例:
pygame.draw.ellipse(screen, (255,0,0), (220,50,200,200), 0)
#这个比较圆
pygame.draw.ellipse(screen, (0,0,0), (100,100,400,100), 1)
#这个比较扁,这两个看起来是不是很像太阳系
7.pygame.draw.arc(Surface, color, Rect, start_angle, stop_angle, width)
绘制一个弧线,最后两个参数是起始/结束角度(逆时针),其实质就像是描绘椭圆的外边多少度到多少度的那一段线,用这个前最好先:import math
,这样就可以使用pi(3.1415926...)
了,举例:
import math
pygame.draw.arc(screen, (0,0,0), (220,50,200,200), 0, math.pi, 1) #从0度到180的圆弧
更多pygame.draw参考
https://www.cnblogs.com/leonyoung/archive/2012/07/01/2572205.html
对其他
1.pygame.mouse.get_pos()
获得当前鼠标位置
常见事件
(在pygame下,比如:pygame.QUIT
)
QUIT:按下右上角
KEYDOWN/KEYUP:按下/松开某个键
MOUSEMOTION:移动鼠标
MOUSEBUTTONDOWN/MOUSEBUTTONUP:按下/松开鼠标(其对应的button中1为左键,2为中间的,3为右键,4为向上滚轮,5为向下滚轮)
注:
上面内容对应event.type
,比如要判断为按下鼠标左键键时:
if event.type == MOUSEBUTTONDOWN: #判断为鼠标按下
if event.button == 1 #1为左键
pass
键盘按键代码
(在pygame下,比如:pygame.K_0
)
K_0 0,对应的还有其他数字
K_a a,对应的还有其他字母
K_KP 数字键盘上的0-9
K_UP ↑,对应的还有DOWN/RIGHT/LEFT
K_F1 F1,对应的还有其他
K_BACKSPACE 回退键
K_TAB TAB键
K_SPACE 空格键
K_RETURN 回车
K_RSHIFT 右边的shift,对应的还有LSHIFT
K_RALT 右边的alt,对应的还有LALT
K_RCTRL 右边的ctrl,对应的还有LCTRL
注:
上面的属性对应的是event.key
,比如要判断是否为上键时:
if event.type == pygame.KEYDOWN: #判断为键盘按下
if event.key == pygame.K_UP: #判断哪个key
pass
动画精灵
其实就是指一个图片类,比如飞机游戏中的飞机,然后新建一个类,里面就存这个飞机的图片
类继承于pygame.sprite.Sprite
然后pygame使用精灵组来管理精灵的绘制和更新,精灵组是一个简单的容器。一般使用pygame.sprite.Group()
函数来创建一个精灵组,当要添加时用group.add(sprite_one)
举例
class Ball(pygame.sprite.Sprite):
def __init__(self, image, position, speed):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load(image).convert_alpha()
self.rect = self.image.get_rect()
self.rect.left, self.rect.top = position #确定左上角位置
self.speed = speed
init()
screen = display.set_mode((600,400))
image = "a.jpg"
balls = []
for i in range(5):
position = [random.randint(0,600), random.randint(0,400)]
speed = [random.randint(0,10), random.randint(0,10)]
ball = Ball(image, position, speed)
balls.append(ball)
while True:
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()
for each in balls:
screen.blit(each.image, each.rect)
display.flip()
参考
https://www.cnblogs.com/msxh/p/5013555.html
碰撞检测
pygame.sprite.spritecollide(sprite, group, dokill, collied=None)
:
用于检测某个精灵是否和组中其他精灵相撞,第一个参数用于指定某个精灵,第二参数用于指定一个组(由sprite.Group()
来生成),第三个用于设置是否从组中删除检测到碰撞的精灵,第四个参数指定一个回调函数,用于定制一个特殊的检测方法(默认情况下检测精灵之间的rect
属性),举例:
pygame.sprite.spritecollide(picture, group, False, pygame.sprite.collide_circle)
实例1.移动图像小游戏,会自动移动,还可以通过键盘方向键移动
(自动移动、键盘事件)
import pygame
import sys
pygame.init() #使用pygame前需要初始化一下
size = width, height = 600, 400
speed = [-2, 1] #第一个参数代表x轴方向移动像素,这里就是向左移动2px,第二个就是向下移动1px
bg = (255, 255, 255)
fullscreen = False #先不全屏
screen = pygame.display.set_mode(size) #设置屏幕大小
pygame.display.set_caption('game') #设置标题
picture = pygame.image.load('a.jpg') #添加个图片在里面
position = picture.get_rect() #获取图像的位置矩形
l_head = picture
r_head = pygame.transform.flip(picture, True, False)
while True:
for event in pygame.event.get(): #获取事件
if event.type == pygame.QUIT: #当点击右上角×时,关闭
sys.exit()
if event.type == pygame.KEYDOWN: #当点击键盘上的按键时
if event.key == pygame.K_UP: #当按上键时,移动方向变成正上方
speed = [0, -1]
if event.key == pygame.K_DOWN:
speed = [0, 1]
if event.key == pygame.K_LEFT:
speed = [-1, 0]
picture = l_head
if event.key == pygame.K_RIGHT:
speed = [1, 0]
picture = r_head
if event.key == pygame.K_F11: #设置F11为全屏
fullscreen = not fullscreen #点击后原来False和True就对调
if fullscreen:
size = width, heigth = 1920, 1080 #屏幕大小改变了,边界也记得改变
screen = pygame.display.set_mode(size, pygame.FULLSCREEN | pygame.HWSURFACE)
#设置屏幕,第一个参数就是尺寸,第二个代表全屏,第三个是只有全屏才支持的硬件加速
else:
size = width, heigth = 600, 400 #变回原来尺寸后边界尺寸也得变回来
screen = pygame.display.set_mode(size)
position = position.move(speed) #图像位置移动
if position.left < 0 or position.right > width: #当要超出左/右边界时
picture = pygame.transform.flip(picture, True, False)
#将图像翻转更新,第一个参数是要更新的东西,第二个代表是否水平翻转,第三个代表是否垂直翻转
speed[0] = -speed[0] #速度反过来,原来向左就变成向右
if position.top < 0 or position.bottom > height:
speed[1] = -speed[1]
screen.fill(bg) #设置填充背景
screen.blit(picture, position) #更新图像
pygame.display.flip() #更新界面
pygame.time.delay(10) #设置10毫秒延迟
实例2.设置图片,并可以用鼠标拖动(鼠标事件)
import pygame
import sys
pygame.init() # 使用pygame前需要初始化一下
size = width, height = 600, 400
bg = (255, 255, 255)
screen = pygame.display.set_mode(size) # 设置屏幕大小
pygame.display.set_caption('game') # 设置标题
picture = pygame.image.load('a.jpg') # 添加个图片在里面
position = picture.get_rect() # 获取图像的位置矩形
moving = False #后面鼠标事件用来判断使用
while True:
for event in pygame.event.get(): # 获取事件
if event.type == pygame.QUIT: # 当点击右上角×时,关闭
sys.exit()
if event.type == pygame.MOUSEBUTTONDOWN: #当按下鼠标时
if event.button == 1: #按下的是鼠标左键
moving = True
if event.type == pygame.MOUSEBUTTONUP: #当松开鼠标时
if event.button == 1:
moving = False
if moving:
position = pygame.mouse.get_pos() #当moving为True时设置位置为鼠标当前的位置
screen.fill(bg) # 设置填充背景
screen.blit(picture, position) # 更新图像
pygame.display.flip() # 更新界面
pygame.time.delay(10) # 设置10毫秒延迟
实例3.将事件显示在屏幕
import pygame
import sys
pygame.init()
size = width, height = 600, 400
screen = pygame.display.set_mode(size)
pygame.display.set_caption('game')
bg = (0,0,0) #背景设置为黑色
font = pygame.font.Font(None, 20) #实例一个font对象,第一个参数是字体,这里选择默认,第二个是字体大小
line_height = font.get_linesize() #将get_linesize()获取的行高赋值给行高
position = 0
screen.fill(bg)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
screen.blit(font.render(str(event), True, (0,255,0)), (0, position))
#font.render()用于渲染文字,第一个参数是要渲染的文本,这里将事件获取的内容渲染
#第二个参数代表是否删除锯齿(去除模糊的马赛克)
#第三个参数是渲染颜色
position += line_height #渲染一次后,位置移动到下一行
if position > height: #当内容写满(大于屏幕高度),清屏
position = 0
screen.fill(bg)
pygame.display.flip()
实例4.自动贪食蛇
from pygame import *
import pygame
import sys
import random
init()
screen = display.set_mode((600,400))
cat = image.load("a.jpg")
position = cat.get_rect()
a = random.randint(100,600),random.randint(100,400)
speed = [0,0]
while True:
for event in pygame.event.get():
if event.type == QUIT:
sys.exit()
if position.center[0] < a[0]: #通过判断图片和随机生成点的位置来进行移动
speed[0] = 1
if position.center[1] < a[1]:
speed[1] = 1
if position.center[0] > a[0]:
speed[0] = -1
if position.center[1] > a[1]:
speed[1] = -1
if position.center[0] == a[0]:
speed[0] = 0
if position.center[1] == a[1]:
speed[1] = 0
if (position.center[0] == a[0]) & (position.center[1] == a[1]):
a = random.randint(100, 600), random.randint(100, 400)
position = position.move(speed)
screen.fill((255,255,255))
draw.rect(screen, (255,0,0), ((a),(10,10)),0)
screen.blit(cat, position)
display.flip()
time.delay(3)