Pygame基础11-mask 蒙版

蒙版

1

蒙版二值化的图像,每个像素的值只能是0或1。
2

mask(蒙版)的用途:

  • 碰撞检测
  • 部分着色

3

案例

和字母的碰撞检测

在这里插入图片描述
当玩家碰到字母 α \alpha α时,改变玩家颜色为绿色,否则为红色。
注意:我们希望碰到字母 α \alpha α时才变色,而不是碰到字母 α \alpha α所在的矩形就变色。
在这里插入图片描述

# collisionif pygame.sprite.spritecollide(player.sprite,obstacle,False):if pygame.sprite.spritecollide(player.sprite,obstacle,False,pygame.sprite.collide_mask):player.sprite.image.fill('green')else:player.sprite.image.fill('red')

这里我们先用普通的精灵碰撞检测(矩形碰撞),如果发生了矩形碰撞,在使用蒙版碰撞将pygame.sprite.collide_mask作为参数传入pygame.sprite.spritecollide
因为矩形检测比蒙版检测速度快很多,这样做可以减少蒙版检测的次数,提高效率。

https://www.pygame.org/docs/ref/sprite.html#pygame.sprite.spritecollide

完整代码:

import pygame, sys class Player(pygame.sprite.Sprite):def __init__(self):super().__init__()self.image = pygame.Surface((40,40)) self.image.fill('red')self.rect = self.image.get_rect(center = (300,300))self.mask = pygame.mask.from_surface(self.image)def update(self):if pygame.mouse.get_pos():self.rect.center = pygame.mouse.get_pos()class Obstacle(pygame.sprite.Sprite):def __init__(self):super().__init__()self.image = pygame.image.load('alpha.png').convert_alpha()self.rect = self.image.get_rect(center = (400,400))self.mask = pygame.mask.from_surface(self.image)# pygame setup
pygame.init()
screen = pygame.display.set_mode((800,800))
clock = pygame.time.Clock()# group setup
player = pygame.sprite.GroupSingle(Player())
obstacle = pygame.sprite.GroupSingle(Obstacle())while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()screen.fill('white')obstacle.draw(screen) # updating and drawing player.update()player.draw(screen)# collisionif pygame.sprite.spritecollide(player.sprite,obstacle,False):if pygame.sprite.spritecollide(player.sprite,obstacle,False,pygame.sprite.collide_mask):player.sprite.image.fill('green')else:player.sprite.image.fill('red')pygame.display.update()clock.tick(60)

图片轮廓

在这里插入图片描述
将字母 α \alpha α的轮廓变成橘色。
我们需要:

  1. 从surface 创建mask.
  2. 将mask变成surface.
  3. 使用2中的surface创建轮廓(silhouette)
  4. 显示轮廓。
    5
import pygame,syspygame.init()
screen = pygame.display.set_mode((800,800))
clock = pygame.time.Clock()# creating the obstacle
obstacle_surf = pygame.image.load('alpha.png').convert_alpha()
obstacle_pos = (100,100)
# 1. surface -> mask
obstacle_mask = pygame.mask.from_surface(obstacle_surf)# 2. mask -> surface 
new_obstacle_surf = obstacle_mask.to_surface()
#  与colorkey相同的像素变透明
new_obstacle_surf.set_colorkey((0,0,0))# 4. filling in the surface with a color
surf_w,surf_h = new_obstacle_surf.get_size()
for x in range(surf_w):for y in range(surf_h):if new_obstacle_surf.get_at((x,y))[0] != 0:new_obstacle_surf.set_at((x,y),'orange')while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()screen.fill('grey')# complex way for a outlineoffset = 4screen.blit(new_obstacle_surf,(obstacle_pos[0] + offset,obstacle_pos[1])) # rightscreen.blit(new_obstacle_surf,(obstacle_pos[0] - offset,obstacle_pos[1])) # leftscreen.blit(new_obstacle_surf,(obstacle_pos[0], obstacle_pos[1] - offset)) # topscreen.blit(new_obstacle_surf,(obstacle_pos[0], obstacle_pos[1] + offset)) # bottomscreen.blit(new_obstacle_surf,(obstacle_pos[0] + offset, obstacle_pos[1] - offset)) # toprightscreen.blit(new_obstacle_surf,(obstacle_pos[0] + offset, obstacle_pos[1] + offset)) # bottomrightscreen.blit(new_obstacle_surf,(obstacle_pos[0] - offset, obstacle_pos[1] + offset)) # bottomleftscreen.blit(new_obstacle_surf,(obstacle_pos[0] - offset, obstacle_pos[1] - offset)) # topleftscreen.blit(obstacle_surf,obstacle_pos)# simple way to create an outline from a mask# for point in obstacle_mask.outline():# 	x = point[0] + obstacle_pos[0]# 	y = point[1] + obstacle_pos[1]# 	pygame.draw.circle(screen,'red',(x,y),1)pygame.display.update()clock.tick(60)

重叠部分着色

在这里插入图片描述

  1. 使用overlap_mask 获得重叠部分的mask
  2. 重新设置重叠部分mask的颜色。
import pygame,syspygame.init()
screen = pygame.display.set_mode((800,800))
clock = pygame.time.Clock()# ship setup
ship_surf = pygame.image.load('ship.png').convert_alpha()
ship_overlay_surf = pygame.image.load('ship.png').convert_alpha()
ship_rect = ship_surf.get_rect(center = (300,300))
ship_mask = pygame.mask.from_surface(ship_surf)# obstacle setup
obstacle_surf = pygame.image.load('alpha.png').convert_alpha()
obstacle_pos = (100,100)
obstacle_mask = pygame.mask.from_surface(obstacle_surf)while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()screen.fill('white')# obstacle screen.blit(obstacle_surf,obstacle_pos)# moving partif pygame.mouse.get_pos():ship_rect.center = pygame.mouse.get_pos()screen.blit(ship_surf,ship_rect)# mask coloring offset_x = obstacle_pos[0] - ship_rect.leftoffset_y = obstacle_pos[1] - ship_rect.topif ship_mask.overlap(obstacle_mask,(offset_x,offset_y)):new_mask = ship_mask.overlap_mask(obstacle_mask,(offset_x,offset_y))new_surf = new_mask.to_surface()new_surf.set_colorkey((0,0,0))surf_w, surf_h = new_surf.get_size()for x in range(surf_w):for y in range(surf_h):if new_surf.get_at((x,y))[0] != 0:new_surf.set_at((x,y),'orange')screen.blit(new_surf,ship_rect)pygame.display.update()clock.tick(60)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/790152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

考研数学1800还是660还是880?

24考完,大家都发现,没有一本习题册,覆盖了考试的所有知识点。 主流的模拟卷,都没有达到24卷的难度。 这就意味着: 一本习题册不够了! 刷主流模拟卷不够了! 这会需要整个考研复习的安排&…

C++(set和map详解,包含常用函数的分析)

set set是关联性容器 set的底层是在极端情况下都不会退化成单只的红黑树,也就是平衡树,本质是二叉搜索树. set的性质:set的key是不允许被修改的 使用set需要包含头文件 set<int> s;s.insert(1);s.insert(1);s.insert(1);s.insert(1);s.insert(2);s.insert(56);s.inser…

制造业工厂怎么通过MES系统来升级改造车间管理

在当今高度竞争的市场环境下&#xff0c;制造业企业需要不断提高生产效率&#xff0c;以在激烈的竞争中立于不败之地。而一种被广泛应用的方法就是利用MES控制系统&#xff0c;通过数字化管理和自动化控制来改造生产车间提升生产效率。 1、MES管理系统能够实现对生产过程的全面…

Navicat Premium 16 Mac/win---数据库设计、管理与维护轻松掌握数据库管理精髓

Navicat Premium是一款功能强大的数据库开发工具&#xff0c;支持多种数据库系统&#xff0c;如MySQL、Redis、MariaDB、Oracle等&#xff0c;并可与云数据库兼容&#xff0c;如Amazon RDS、Microsoft Azure等。它提供了直观易用的用户界面&#xff0c;使得开发者能够轻松上手并…

k8s calico由IPIP模式切换为BGP模式

按照官网calico.yaml部署后&#xff0c;默认是IPIP模式 查看route -n &#xff0c; 看到是tunl0口进行转发 怎么切换到BGP模式呢&#xff1f; kubectl edit ippool 将ipipMode由Always修改为Never &#xff0c;修改后保存文件即可。无需做任何操作&#xff0c;自动就切换为BG…

MySql实战--普通索引和唯一索引,应该怎么选择

在前面的基础篇文章中&#xff0c;我给你介绍过索引的基本概念&#xff0c;相信你已经了解了唯一索引和普通索引的区别。今天我们就继续来谈谈&#xff0c;在不同的业务场景下&#xff0c;应该选择普通索引&#xff0c;还是唯一索引&#xff1f; 假设你在维护一个市民系统&…

stm32cubeMX_io输入输出讲解

1创建项目&#xff08;可在专栏里找到&#xff09; 2进入当前页面点击引脚将弹出下图选项选择输入输出 带点击GPIO 点击引脚弹出如下选项根据需求选择 如有需要可以使用外部时钟&#xff1b;设置如图使用外部时钟 生成代码 将会弹出一个提示点击中间项//打开项目

HarmonyOS NEXT应用开发之MVVM模式

应用通过状态去渲染更新UI是程序设计中相对复杂&#xff0c;但又十分重要的&#xff0c;往往决定了应用程序的性能。程序的状态数据通常包含了数组、对象&#xff0c;或者是嵌套对象组合而成。在这些情况下&#xff0c;ArkUI采取MVVM Model View ViewModel模式&#xff0c;其…

clickhouse 源码编译部署

clickhouse 源码编译部署 版本 21.7.9.7 点击build project&#xff0c;编译工程&#xff0c;经过一定时间&#xff08;第一次编译可能几个小时&#xff0c;后续再编译&#xff0c;只编译有改动的文件&#xff09;生成release目录 在cmake-build-release → programs目录下…

vivado eFUSE 寄存器访问和编程

eFUSE 寄存器访问和编程 注释 &#xff1a; 在 MPSoC 和 Versal 器件上不支持以下 eFUSE 访问和编程方法。 7 系列、 UltraScale 和 UltraScale 器件具有一次性可编程位用于执行特定功能 &#xff0c; 称为 eFUSE 位。不同 eFUSE 位类型如 下所述&#xff1a; • …

单例(Singleton)设计模式

2.1 设计模式概述 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式免去我们自己再思考和摸索。就像是经典的棋谱&#xff0c;不同的棋局&#xff0c;我们用不同的棋谱。"套路" 经典的设计模式共有23种。每个…

语音识别:基于HMM

HMM语音识别的解码过程 从麦克风采集的输入音频波形被转换为固定尺寸的一组声学向量&#xff1a; 其中是维的语音特征向量&#xff08;例如MFCC&#xff09;。 解码器尝试去找到上述特征向量序列对应的单词&#xff08;word&#xff09;的序列&#xff1a; 单词序列的长度是。…

【大数据存储】实验4 NoSQL数据库

实验4 NoSQL数据库 NoSQL数据库的安装和使用实验环境&#xff1a; Ubuntu 22.04.3 Jdk 1.8.0_341 Hadoop 3.2.3 Hbase 2.4.17 Redis 6.0.6 mongdb 6.0.12 mogosh 2.1.0 Redis 安装redis完成 新建终端启动redisredis-server新建一个终端redis-cli 建表操作 尝…

超越传统时序!多模态+时间序列8个创新方案,刷新SOTA

传统时间序列无法有效捕捉数据中复杂的非线性关系&#xff0c;导致在处理具有复杂动力学特性的系统时效果不佳。为解决此问题&#xff0c;研究者提出了多模态时间序列。 在预测任务中&#xff0c;多模态时间序列能够整合来自不同类型数据源的信息&#xff0c;从而提供更全面的洞…

笔记: JavaSE day15 笔记

第十五天课堂笔记 数组 可变长参数★★★ 方法 : 返回值类型 方法名(参数类型 参数名 , 参数类型 … 可变长参数名){}方法体 : 变长参数 相当于一个数组一个数组最多只能有一个可变长参数, 并放到列表的最后parameter : 方法参数 数组相关算法★★ 冒泡排序 由小到大: 从前…

JavaScript(六)---【回调、异步、promise、Async】

零.前言 JavaScript(一)---【js的两种导入方式、全局作用域、函数作用域、块作用域】-CSDN博客 JavaScript(二)---【js数组、js对象、this指针】-CSDN博客 JavaScript(三)---【this指针&#xff0c;函数定义、Call、Apply、函数绑定、闭包】-CSDN博客 JavaScript(四)---【执…

并发编程之线程池的应用以及一些小细节的详细解析

线程池在实际中的使用 实际开发中&#xff0c;最常用主要还是利用ThreadPoolExecutor自定义线程池&#xff0c;可以给出一些关键的参数来自定义。 在下面的代码中可以看到&#xff0c;该线程池的最大并行线程数是5&#xff0c;线程等候区&#xff08;阻塞队列)是3&#xff0c;即…

数据挖掘|关联分析与Apriori算法详解

数据挖掘|关联分析与Apriori算法 1. 关联分析2. 关联规则相关概念2.1 项目2.2 事务2.3 项目集2.4 频繁项目集2.5 支持度2.6 置信度2.7 提升度2.8 强关联规则2.9 关联规则的分类 3. Apriori算法3.1 Apriori算法的Python实现3.2 基于mlxtend库的Apriori算法的Python实现 1. 关联分…

window中如何在Anaconda虚拟环境中安装compressai

1, 进入CompressAI的Github代码页下载压缩包并解压到自己的项目路径 2&#xff0c;打开anaconda的prompt命令行&#xff0c;激活需要安装的虚拟环境&#xff0c;然后进入compressai文件夹&#xff0c;比如下操作&#xff1a; 3&#xff0c;输出安装命令行 pip install -e . -…

企业必备! 防员工偷懒神器,工作状况一目了然

在当前企业管理中&#xff0c;员工的工作状态和工作效率一直是管理者们关注的焦点。为了更加有效地监管员工的工作微信使用情况&#xff0c;微信管理系统成为了企业必备的神器。 这款系统不仅可以实时监控员工的工作微信&#xff0c;还具有多种实用功能&#xff0c;帮助企业管…