1 显示一个pygame窗口
1)初始化
2) 设置窗口(缓存)大小
3)将窗口(缓存)中的内容显示出来
代码如下:
import pygame
pygame.init()
screen = pygame.display.set_mode([640, 480])
screen.fill([255, 255, 255])
pygame.display.flip()
while True:
pass
2 pygame的窗口消息
前面可以显示一个最简单的白色屏幕内容,但整个窗口无法操作了,是因为我们没有设置窗口的响应事件,一般每个pygame程序都有一个无限循环用来处理各种窗口事件:
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit(0)
以上代码只是处理了当窗口收到退出事件时,整个程序退出
3 pygame画图
1)画圆:pygame.draw.circle(surface, color, center, radius,width=0)
surface通常是screen
color表示的是颜色,即rgb的值,红色为[255, 0, 0]
center:表示圆心坐标,平面上的坐标通常是两个值,比如窗口中心[320, 240]
radius:表示直径,我们可以指定为100
width:默认为0,表示画的为实心圆,不是0时表示画的是空心圆
2)画矩形:pygame.draw.rect(surface, color, rect, width=0)
surface通常是screen
color表示颜色
rect表示矩形大小,一般为4个值,前两个值表示矩形左上角坐标,第3个值表示矩形宽度,第4个值表示矩形高度, 如[100, 100, 120, 60], 表示坐标为[100, 100]的位置画一个宽度为120,高度为60的长方形
width:与前面的用法一致
3) 画一条线段:pygame.draw.line(surface, color, start_pos, end_pos)
start_pos表示起点坐标
end_pos表示终点坐标
示例用4根线段画一个矩形的代码:
lines = [[200, 200], [400, 200], [400, 400], [200, 400], [200, 200]] for i in range(len(lines)-1): pygame.draw.line(screen, [255, 0, 0], lines[i], lines[i+1])
4)画一组线段:pygame.draw.lines(surface, color, closed, points)
解决一组坐标画直线的难题
closed:为True表示假如组成的图形有缺口,则封口,False表示不主动封口
points即为连续的点坐标
还是上面的点,画这个图只需一行代码:
pygame.draw.lines(screen, [0, 255, 0], False, lines)
5)画点有几种方法:
1 利用矩形画点:矩形宽度和高度均为1,width也设为1
比如我们利用点画一条直线
代码:
for i in range(50): x = i y = 10 * x + 5 pygame.draw.rect(screen, [255, 0, 0], [x, y, 1, 1], width=1)
2 利用set_at直接改变像素的颜色
代码:
for i in range(50): x = i y = 10 * x + 5 screen.set_at([x, y], [255, 0, 0])
4 pygame动画
1、加载图片
my_ball = pygame.image.load("beach_ball.png")
2、显示图片
screen.blit(my_ball, [x, y])
3、动画显示的几个关键点:
1)、擦除之前的图片(覆盖)
pygame.draw.rect(screen, [255, 255, 255], [x, y, 90, 90], 0)
2)、在新位置上显示图片
screen.blit(my_ball, [x, y])
3)、延迟恰当的时间
pygame.time.delay
4、显示动画
1)显示一个简单的动画
import sys
import pygame
pygame.init()
screen = pygame.display.set_mode([640, 480])
screen.fill([255, 255, 255])
ball = pygame.image.load("beach_ball.png")
x = 0
y = 100
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit(0)
pygame.draw.rect(screen, [255, 255, 255], [x, y, 90, 90])
x += 10
screen.blit(ball, [x, y])
pygame.time.delay(100)
pygame.display.flip()
2)显示左右弹的动画:
"""
显示一个左右弹的球
"""
import sys
import pygame
pygame.init()
screen = pygame.display.set_mode([640, 480])
screen.fill([255, 255, 255])
ball = pygame.image.load("beach_ball.png")
x = 0
y = 100
xspeed = 10
yspeed = 10
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit(0)
pygame.draw.rect(screen, [255, 255, 255], [x, y, 90, 90])
x += xspeed
y += yspeed
if x + 90 > 640:
xspeed = -xspeed
if x < 0:
xspeed = -xspeed
if y + 90 > 480:
yspeed = -yspeed
if y < 0:
yspeed = -yspeed
screen.blit(ball, [x, y])
pygame.time.delay(100)
pygame.display.flip()
3)显示上下左右弹的动画
"""
显示一个上下左右弹的球
"""
import sys
import pygame
pygame.init()
screen = pygame.display.set_mode([640, 480])
screen.fill([255, 255, 255])
ball = pygame.image.load("beach_ball.png")
x = 0
y = 100
xspeed = 10
yspeed = 10
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit(0)
pygame.draw.rect(screen, [255, 255, 255], [x, y, 90, 90])
x += xspeed
y += yspeed
if x + 90 > 640:
xspeed = -xspeed
if x < 0:
xspeed = -xspeed
if y + 90 > 480:
yspeed = -yspeed
if y < 0:
yspeed = -yspeed
screen.blit(ball, [x, y])
pygame.time.delay(100)
pygame.display.flip()
4)显示一个翻滚的球的动画
前面球的移动过程一直像是平移的过程,不够真实,实际球在运动过程中应该是翻滚的动作,这时一幅图显示起来就不行了,需要连续的图片依次显示,关键代码如下:
# 加载图片一次加载一组 balls = [] for i in range(4): ball = pygame.image.load(f"beach_ball{i}.png") balls.append(ball)
# 显示图片,每次显示组中的一张,显示完后再显示下一张,依次显示 screen.blit(balls[index], [x, y]) index += 1 if index > 3: index = 0
完整代码:
import pygame, sys
pygame.init()
screen = pygame.display.set_mode([640, 480])
screen.fill([255, 255, 255])
# 加载图片一次加载一组
balls = []
for i in range(4):
ball = pygame.image.load(f"beach_ball{i}.png")
balls.append(ball)
x = 50
y = 50
x_speed = 10
index = 0
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
pygame.time.delay(100)
pygame.draw.rect(screen, [255, 255, 255], [x, y, 90, 90])
x = x + x_speed
if x > screen.get_width():
x = 0 - 90
# 显示图片,每次显示组中的一张,显示完后再显示下一张,依次显示
screen.blit(balls[index], [x, y])
index += 1
if index > 3:
index = 0
pygame.display.flip()