当前位置:   article > 正文

pygame一步步玩转圆、矩形、图像、旋转、透明度alpha、colorkey操作(有完整案例)_pygame.draw.rect参数透明度

pygame.draw.rect参数透明度

最近一直在专研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()
  • 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

(二)第二版

不直接画在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))
  • 1
  • 2
  • 3
  • 4

相关代码如下:

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()
  • 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

运行效果同上。

(三)让圆这部分透明显示,即只显示底色

核心代码如下:

bg.set_colorkey((0,255,0))
  • 1

运行效果如下:
在这里插入图片描述

我打算让图像在圆这块区域显示,然后矩形遮挡

三、黏贴图像

(一)黏贴图像(原始图)

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()
  • 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

效果如下:
在这里插入图片描述

(二)错误的操作

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()
  • 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

运行效果:
在这里插入图片描述

分析:虽然设置了透明色,但是圆还是把图像给遮盖了,为啥呢?原因是圆虽然是设置了透明色,但是直接投到了背景层的颜色,因此,我们需要把图像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()
  • 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

四、让图像动起来

(一)旋转变化

 picture.set_alpha(255-(angle*3) % 200)
  • 1

(二)透明度变化

tmp = pygame.transform.rotate(picture, -angle)
newRect = tmp.get_rect(center=(300,300))
screen.blit(tmp,newRect)
  • 1
  • 2
  • 3

(三)完整的代码

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()
  • 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

好的,写完。
后面还有很多好的idea、好的实战案例,分享给大家,欢迎持续关注。
我的目标是写100篇介绍pygame的文章,希望从很浅显的东西开始一步步的介绍分享给大家,让大家不用走弯路、我自己也可以沉淀下来,形成一个个小的知识点。
如果对大家有用,欢迎点赞、持续关注我。

技术的道路上,大家一起探讨、发展、加油!
感谢支持,比心。

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号