pygame一步步玩转圆、矩形、图像、旋转、透明度alpha、colorkey操作(有完整案例)
最近一直在专研pygame,略有心得,也分享了几篇文章,感谢各位朋友支持。今天,玩转一个非常基础的知识,其实是多个知识点的汇聚,最后输出的效果图如下:文章目录一、包含的基础知识点:(一)画圆(二)画矩形(三)图像变化(四)图像透明度(五)设置colorkey健二、画矩形和圆(一)第一版(二)第二版(三)让圆这部分透明显示,即只显示底色三、黏贴图像(一)黏贴图像(原始图)(二)错误的操作(三)正确的
最近一直在专研pygame,略有心得,也分享了几篇文章,感谢各位朋友支持。
今天,玩转一个非常基础的知识,其实是多个知识点的汇聚,欢迎往下看。
文章目录
最后输出的效果图如下:
一、包含的基础知识点:
画圆、画矩形、图像变化、图像移动、设置透明度、设置colorkey等内容。
包含的相关函数如下:
(一)画圆
circle(Surface,color,pos,radius,width=0)
其中第一、二、五个参数根前面的两个方法是一样的,第三参数指定圆形位置,第四个参数指定半径的大小。
(二)画矩形
rect(Surface,color,Rect,width=0)
第一个参数指定矩形绘制到哪个Surface对象上
第二个参数指定颜色
第三个参数指定矩形的范围(left,top,width,height)
第四个参数指定矩形边框的大小(0表示填充矩形)
(三)图像变化
pygame.transform.scale 用于变化图像的大小
pygame.transform.rotate 用于旋转图像
(四)图像透明度
set_alpha(value, flags=0) -> None
set_alpha(None) -> None
设置 Surface 对象的整体透明度(surface alpha),value 参数的范围是 0 ~ 255,0 表示完全透明,255 表示完全不透明。如果传入 None,那么取消 surface alphas 设置。
(五)设置colorkey健
set_colorkey(Color, flags=0) -> None
set_colorkey(None) -> None
设置当前 Surface 对象的 colorkeys,当绘制 Surface 对象时,将所有与 colorkeys 相同的颜色值绘制为透明。 Color 参数可以是 RGB 颜色,也可以是映射后的颜色索引号,如果传入 None,则取消 colorkeys 的设置。
好的,有了上述的基础知识后,就可以开始一步步玩转这些内容了。
二、画矩形和圆
(一)第一版
效果图:
代码:
import sys, pygame
import os
import random
import time
pygame.init() # 初始化pygame类
screen = pygame.display.set_mode((600, 600)) # 设置窗口大小
pygame.display.set_caption('圆和图形的碰撞') # 设置窗口标题
fps = 10 # 设置刷新率,数字越大刷新率越高
fcclock = pygame.time.Clock()
def run():
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT or event.type == pygame.K_F1:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.quit()
sys.exit()
if event.key == pygame.K_SPACE:
next()
if event.type == pygame.MOUSEBUTTONDOWN:
next()
screen.fill((0, 0, 0)) # 设置背景为白色
pygame.draw.rect(screen, (255, 255, 255), pygame.Rect(200,200,200,200), 0)
pygame.draw.circle(screen, (0, 255, 0), (300, 300), 100)
fcclock.tick(fps)
pygame.display.flip() # 刷新窗口
# time.sleep(10)
if __name__ == '__main__':
run()
(二)第二版
不直接画在screen上,而是新建了一个surface,取名bg,在这个表面去画矩形和图。(可以思考一下为啥要这么操作?
)
核心代码如下:
bg = screen.copy().convert()
pygame.draw.rect(bg, (255, 255, 255), pygame.Rect(200,200,200,200), 0)
pygame.draw.circle(bg, (0, 255, 0), (300, 300), 100)
screen.blit(bg,(0,0))
相关代码如下:
import sys, pygame
import os
import random
import time
pygame.init() # 初始化pygame类
screen = pygame.display.set_mode((600, 600)) # 设置窗口大小
bg = screen.copy().convert()
pygame.display.set_caption('圆和图形的碰撞') # 设置窗口标题
fps = 10 # 设置刷新率,数字越大刷新率越高
fcclock = pygame.time.Clock()
def run():
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT or event.type == pygame.K_F1:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.quit()
sys.exit()
if event.key == pygame.K_SPACE:
next()
if event.type == pygame.MOUSEBUTTONDOWN:
next()
screen.fill((0, 0, 0)) # 设置背景为白色
pygame.draw.rect(bg, (255, 255, 255), pygame.Rect(200,200,200,200), 0)
pygame.draw.circle(bg, (0, 255, 0), (300, 300), 100)
screen.blit(bg,(0,0))
fcclock.tick(fps)
pygame.display.flip() # 刷新窗口
# time.sleep(10)
if __name__ == '__main__':
run()
运行效果同上。
(三)让圆这部分透明显示,即只显示底色
核心代码如下:
bg.set_colorkey((0,255,0))
运行效果如下:
我打算让图像在圆这块区域显示,然后矩形遮挡
三、黏贴图像
(一)黏贴图像(原始图)
import sys, pygame
import os
import random
import time
pygame.init() # 初始化pygame类
screen = pygame.display.set_mode((600, 600)) # 设置窗口大小
bg = screen.copy().convert()
pygame.display.set_caption('圆和图形的碰撞') # 设置窗口标题
fps = 10 # 设置刷新率,数字越大刷新率越高
fcclock = pygame.time.Clock()
tmp = pygame.image.load('./image/agriculture-clouds-countryside-cropland-440731.jpg')
picture = pygame.transform.scale(tmp, (400, 400))
newrect = picture.get_rect(center=(300,300))
def run():
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT or event.type == pygame.K_F1:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.quit()
sys.exit()
if event.key == pygame.K_SPACE:
next()
if event.type == pygame.MOUSEBUTTONDOWN:
next()
screen.fill((0, 0, 0)) # 设置背景为白色
screen.blit(picture,newrect)
fcclock.tick(fps)
pygame.display.flip() # 刷新窗口
# time.sleep(10)
if __name__ == '__main__':
run()
效果如下:
(二)错误的操作
import sys, pygame
import os
import random
import time
pygame.init() # 初始化pygame类
screen = pygame.display.set_mode((600, 600)) # 设置窗口大小
bg = screen.copy().convert()
pygame.display.set_caption('圆和图形的碰撞') # 设置窗口标题
fps = 10 # 设置刷新率,数字越大刷新率越高
fcclock = pygame.time.Clock()
tmp = pygame.image.load('./image/agriculture-clouds-countryside-cropland-440731.jpg')
picture = pygame.transform.scale(tmp, (400, 400))
newrect = picture.get_rect(center=(300,300))
def run():
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT or event.type == pygame.K_F1:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.quit()
sys.exit()
if event.key == pygame.K_SPACE:
next()
if event.type == pygame.MOUSEBUTTONDOWN:
next()
screen.fill((0, 0, 0)) # 设置背景为白色
pygame.draw.rect(bg, (0, 0, 0), pygame.Rect(100,100,400,400), 0)
bg.blit(picture,newrect)
pygame.draw.circle(bg, (0, 255, 0), (300, 300), 200)
bg.set_colorkey((0,255,0))
screen.blit(bg,(0,0))
fcclock.tick(fps)
pygame.display.flip() # 刷新窗口
# time.sleep(10)
if __name__ == '__main__':
run()
运行效果:
分析:虽然设置了透明色,但是圆还是把图像给遮盖了,为啥呢?原因是圆虽然是设置了透明色,但是直接投到了背景层的颜色,因此,我们需要把图像blit到背景表面。这才是正解。
(三)正确的操作
代码如下:
import sys, pygame
import os
import random
import time
pygame.init() # 初始化pygame类
screen = pygame.display.set_mode((600, 600)) # 设置窗口大小
bg = screen.copy().convert()
pygame.display.set_caption('圆和图形的碰撞') # 设置窗口标题
fps = 10 # 设置刷新率,数字越大刷新率越高
fcclock = pygame.time.Clock()
tmp = pygame.image.load('./image/agriculture-clouds-countryside-cropland-440731.jpg')
picture = pygame.transform.scale(tmp, (400, 400))
newrect = picture.get_rect(center=(300,300))
def run():
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT or event.type == pygame.K_F1:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.quit()
sys.exit()
if event.key == pygame.K_SPACE:
next()
if event.type == pygame.MOUSEBUTTONDOWN:
next()
screen.fill((0, 0, 0)) # 设置背景为白色
screen.blit(picture,newrect)
pygame.draw.rect(bg, (0, 0, 0), pygame.Rect(100,100,400,400), 0)
pygame.draw.circle(bg, (0, 255, 0), (300, 300), 200)
bg.set_colorkey((0,255,0))
screen.blit(bg,(0,0))
fcclock.tick(fps)
pygame.display.flip() # 刷新窗口
if __name__ == '__main__':
run()
四、让图像动起来
(一)旋转变化
picture.set_alpha(255-(angle*3) % 200)
(二)透明度变化
tmp = pygame.transform.rotate(picture, -angle)
newRect = tmp.get_rect(center=(300,300))
screen.blit(tmp,newRect)
(三)完整的代码
import sys, pygame
import os
import random
import time
pygame.init() # 初始化pygame类
screen = pygame.display.set_mode((600, 600)) # 设置窗口大小
bg = screen.copy().convert()
pygame.display.set_caption('圆、矩形、图像的碰撞') # 设置窗口标题
fps = 10 # 设置刷新率,数字越大刷新率越高
fcclock = pygame.time.Clock()
tmp = pygame.image.load('./image/agriculture-clouds-countryside-cropland-440731.jpg')
picture = pygame.transform.scale(tmp, (400, 400))
newrect = picture.get_rect(center=(300,300))
def run():
angle = 0
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT or event.type == pygame.K_F1:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.quit()
sys.exit()
if event.key == pygame.K_SPACE:
next()
if event.type == pygame.MOUSEBUTTONDOWN:
next()
screen.fill((0, 0, 0)) # 设置背景为白色
# screen.blit(picture,newrect)
picture.set_alpha(255-(angle*3) % 200)
tmp = pygame.transform.rotate(picture, -angle)
newRect = tmp.get_rect(center=(300,300))
screen.blit(tmp,newRect)
angle += 1
pygame.draw.rect(bg, (0, 0, 0), pygame.Rect(100,100,400,400), 0)
pygame.draw.circle(bg, (0, 255, 0), (300, 300), 200)
bg.set_colorkey((0,255,0))
screen.blit(bg,(0,0))
fcclock.tick(fps)
pygame.display.flip() # 刷新窗口
if __name__ == '__main__':
run()
好的,写完。
后面还有很多好的idea、好的实战案例,分享给大家,欢迎持续关注。
我的目标是写100篇介绍pygame的文章,希望从很浅显的东西开始一步步的介绍分享给大家,让大家不用走弯路、我自己也可以沉淀下来,形成一个个小的知识点。
如果对大家有用,欢迎点赞、持续关注我。
技术的道路上,大家一起探讨、发展、加油!
感谢支持,比心。
更多推荐
所有评论(0)