pygame4 练习课
admin
2024-03-15 08:15:58
0次

1 显示一个pygame窗口

1)初始化

2)  设置窗口(缓存)大小

3)将窗口(缓存)中的内容显示出来

代码如下:

import pygamepygame.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 = iy = 10 * x + 5pygame.draw.rect(screen, [255, 0, 0], [x, y, 1, 1], width=1)

2 利用set_at直接改变像素的颜色

代码:

for i in range(50):x = iy = 10 * x + 5screen.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 sysimport pygamepygame.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 += 10screen.blit(ball, [x, y])pygame.time.delay(100)pygame.display.flip()

2)显示左右弹的动画:

"""
显示一个左右弹的球
"""
import sysimport pygamepygame.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 += xspeedy += yspeedif x + 90 > 640:xspeed = -xspeedif x < 0:xspeed = -xspeedif y + 90 > 480:yspeed = -yspeedif y < 0:yspeed = -yspeedscreen.blit(ball, [x, y])pygame.time.delay(100)pygame.display.flip()

3)显示上下左右弹的动画

"""
显示一个上下左右弹的球
"""
import sysimport pygamepygame.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 += xspeedy += yspeedif x + 90 > 640:xspeed = -xspeedif x < 0:xspeed = -xspeedif y + 90 > 480:yspeed = -yspeedif y < 0:yspeed = -yspeedscreen.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, syspygame.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_speedif x > screen.get_width():x = 0 - 90# 显示图片,每次显示组中的一张,显示完后再显示下一张,依次显示screen.blit(balls[index], [x, y])index += 1if index > 3:index = 0pygame.display.flip()

相关内容

热门资讯

AI做攻略、“双向奔赴”……国... 本文转自:人民网人民网记者 许维娜今年国庆假期,AI(人工智能)成了不少年轻人的“旅行搭子”。行前做...
合肥的这个“梗”, 翻篇了 社交平台的评论区,曾长期流传一句专属于合肥的黑色幽默。有人问合肥哪里好玩,本地网友半开玩笑地回复:合...
7万+旅游中高层都在的群,今天... 做旅游这行,资源卡位、渠道互通、项目落地——往往就差一个“对的机会”。我们的行业社群已聚集70,00...
一场帐篷音乐节,如何让井研从“... 帐篷音乐节现场封面新闻记者 周洪攀10月的研溪湿地,晚风里裹着柑橘的清甜与民谣的回响。夜幕降临,10...
白鹤翩翩落星愿,上海迪士尼度假... 10月9日,世界候鸟日前夕,上海迪士尼度假区星愿公园的湖风里多了一分白鹤的灵动。三座白鹤雕塑正式揭幕...
成都锦江边赏初秋枫叶飘飘 目前,成都锦江边国华街枫叶树红了。近年来,国华街附近的几条街都栽种了红枫树,是城区较集中看枫叶的点位...
GBTA:商务旅行正在复苏,但... 亚太正在成为全球商务旅行增长的重要引擎。在经历疫情后的快速反弹之后,全球商务旅行正在进入一个新的增长...
从景区焕新到节赛引流 邹城双节... 齐鲁网·闪电新闻10月9日讯 中秋、国庆“双节”假期,邹城市文化和旅游局提前谋划、周密部署,立足自身...
江山如此多娇 且看石楼今朝 金秋十月,黄河岸畔秋意盎然,丰收盛会喜迎国庆。本次石楼国庆文旅活动以“江山如此多娇,且看石楼今朝”为...
海南国庆假期接待游客475.4... 2026年国庆假期,海南接待游客475.40万人次,较2025年增长13.1%,较2024年增长15...