赞
踩
最近一直在专研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 设置。
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的文章,希望从很浅显的东西开始一步步的介绍分享给大家,让大家不用走弯路、我自己也可以沉淀下来,形成一个个小的知识点。
如果对大家有用,欢迎点赞、持续关注我。
技术的道路上,大家一起探讨、发展、加油!
感谢支持,比心。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。