Pygame基础11-mask 蒙版

蒙版

1

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

mask(蒙版)的用途:

  • 碰撞检测
  • 部分着色

3

案例

和字母的碰撞检测

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

# collision
	if 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)
	
	# collision
	if 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,sys

pygame.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 outline
	offset = 4
	screen.blit(new_obstacle_surf,(obstacle_pos[0] + offset,obstacle_pos[1])) # right
	screen.blit(new_obstacle_surf,(obstacle_pos[0] - offset,obstacle_pos[1])) # left
	screen.blit(new_obstacle_surf,(obstacle_pos[0], obstacle_pos[1] - offset)) # top
	screen.blit(new_obstacle_surf,(obstacle_pos[0], obstacle_pos[1] + offset)) # bottom
	screen.blit(new_obstacle_surf,(obstacle_pos[0] + offset, obstacle_pos[1] - offset)) # topright
	screen.blit(new_obstacle_surf,(obstacle_pos[0] + offset, obstacle_pos[1] + offset)) # bottomright
	screen.blit(new_obstacle_surf,(obstacle_pos[0] - offset, obstacle_pos[1] + offset)) # bottomleft
	screen.blit(new_obstacle_surf,(obstacle_pos[0] - offset, obstacle_pos[1] - offset)) # topleft


	screen.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,sys

pygame.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 part
	if 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.left
	offset_y = obstacle_pos[1] - ship_rect.top
	if 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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c语言--联合体(声明、特点、计算)

目录 一、联合体类型的声明二、 联合体的特点三、 相同成员的结构体和联合体对比四、 联合体大小的计算 一、联合体类型的声明 像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。 但是编译器只为最大的成员分配足够的内存空间。…

游戏引擎中的物理应用

一、 角色控制器 Character Controller和普通的动态对象(Dynamic Actor )是不同的,主要的三个特点是: 它拥有可控制的刚体间的交互假设它是有无穷的摩擦力(可以站停在位置上),没有弹性加速和刹车几乎立即…

2023最新汽车网络安全报告汇总

2023最新汽车网络安全报告、安全参考架构及指南汇总,供大家学习参考。https://t.zsxq.com/18RkG260k 汽车信息安全法律法规及标准全景图V3.2.pdf 车载智能计算基础平台参考架构2.0.pdf 车载智能计算芯片白皮书(2023版).pdf 智能驾驶行为安全评价方法发布版.pdf 智能…

C#实现只保存2天的日志文件

文章目录 业务需求代码运行效果 欢迎讨论! 业务需求 在生产环境中,控制台窗口不便展示出来。 为了在生产环境中,完整记录控制台应用的输出,选择将其输出到文件中。 但是,存储所有输出的话会占用很多空间,…

Docker 部署开源远程桌面工具 RustDesk

RustDesk是一款远程控制,远程协助的开源软件。完美替代TeamViewer ,ToDesk,向日葵等平台。关键支持自建服务器,更安全私密远程控制电脑!官网地址:https://rustdesk.com/ 环境准备 1、阿里云服务器一 台&a…

ChatGPT全方位解析:如何培养 AI 智能对话技能?

简介 ChatGPT 的主要优点之一是它能够理解和响应自然语言输入。在日常生活中,沟通本来就是很重要的一门课程,沟通的过程中表达的越清晰,给到的信息越多,那么沟通就越顺畅。 和 ChatGPT 沟通也是同样的道理,如果想要C…

【论文阅读笔记】SAM-Adapter: Adapting Segment Anything in Underperformed Scenes

1.论文介绍 SAM-Adapter: Adapting Segment Anything in Underperformed Scenes SAM适配器:在表现不佳的场景中适配任何片段 2023年 ICCV Paper Code SAM Fails to Segment Anything? – SAM-Adapter: Adapting SAM in Underperformed Scenes: Camouflage, Shado…

5.5G,只比6G少0.5G

5.5G成为通信行业2024年开年的一大焦点。提到5.5G,多出来的0.5G又是啥?为什么不直接迈向6G时代?今天我们一探究竟! “0.5G”,现在与未来的桥梁 2021年,国际标准组织3GPP为通信技术的进一步发展定义了新的里…

云上百世慧 | 达索系统电池行业智能制造解决方案

当今诸多电池厂商快速成长的同时也面临诸多挑战: ※ 如何获得实时、数据驱动的KPI来衡量生产率? ※ 如何更好地管理生产线、物料流和周期时间? ※ 如何增强整个生产系统并推动实时制造流程? 达索系统专家通过实际案例&#xf…

Kimi精选提示词,总结PPT内容

大家好,我是子云,最近真是觉得Kimi这个大模型,产品体验很棒,能力也是不错,感觉产品经理用心了。 发现一个Kimi 一个小技巧,可以学习到很多高级提示词。 Kimi输入框可以配置常用提示词,同时也可…

上位机图像处理和嵌入式模块部署(qmacvisual亮度检测)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们说过,在机器视觉当中,对于光源的处理要非常小心。这里面不仅包括了选择什么样的光源,还取决于怎样使用…

美创科技获浙江省网络空间安全协会多项荣誉认可

4月2日,浙江省网络空间安全协会第二届会员大会第一次会议在杭州隆重召开,近180家会员单位代表、数十位特邀专家、嘉宾莅临现场。浙江省委网信办副主任马晓军出席会议并致辞,本次大会由协会秘书长吴铤主持。 凝心聚力,继往开来&…

鸿蒙OS开发实例:【应用状态变量共享】

平时在开发的过程中,我们会在应用中共享数据,在不同的页面间共享信息。虽然常用的共享信息,也可以通过不同页面中组件间信息共享的方式,但有时使用应用级别的状态管理会让开发工作变得简单。 根据不同的使用场景,ArkT…

PD虚拟机在 Mac 上运行 Windows 解决方案,实现 Win 与 Mac 双系统!

现在的 Macbook 大多都是 M 芯片,想装双系统都没办法。需要暂时用下 Windows 软件,只能靠虚拟机工具。 而虚拟机软件 Parallels Desktop(简称 PD 虚拟机),则是同类工具中非常出色的存在。支持苹果芯片设备、性能优异&…

2012年认证杯SPSSPRO杯数学建模B题(第二阶段)节能减排全过程文档及程序

2012年认证杯SPSSPRO杯数学建模 节能减排、抑制全球气候变暖 B题 白屋顶计划 原题再现: 第二阶段问题   虽然环境学家对地球环境温度的改变有许多种不同观点,但大多数科学家可以达成一个基本的共识:近年来人类的活动,尤指二氧…

加固HTML大作战:网站安全性提升方案解读

引言 HTML是网站开发的基础语言,它的安全性直接关系到网站的安全性。为了保障网站的安全性,我们需要加固HTML代码。本文将介绍一些具体方法,帮助你加固HTML代码,提高网站的安全性。 摘要 本文将介绍以下几种方法来加固HTML代码…

Android Studio 打开Local Changes界面

在编写代码的过程中,经常要回顾本地仓库做了那些修改。打开Local Changes界面,能做到一目了然,不用再去使用git命令查看。 File->Settings->Version control->Commit 把Use non-modal commit interface 选项 取消勾选 即可

Web前端—(原生JS)购物车效果

目录 购物车效果分析数据单件商品的数据整个界面的数据 分析界面分析事件 购物车效果 先准备好原始数据和素材 在下面数据的基础上,编写index.js 分析数据 编写程序要从数据入手,从数据到界面最后到事件在分析数据的过程中,要分析数据是通过…

C# 批量删除Excel重复项

当从不同来源导入Excel数据时,可能存在重复的记录。为了确保数据的准确性,通常需要删除这些重复的行。 手动查找并删除可能会非常耗费时间,而通过编程脚本则可以实现在短时间内处理大量数据。本文将提供一个使用C# 快速查找并删除Excel重复项…

JAVAEE之Cookie/Session

1.Cookie HTTP 协议自身是属于 "无状态" 协议. "无状态" 的含义指的是: 默认情况下 HTTP 协议的客户端和服务器之间的这次通信, 和下次通信之间没有直接的联系. 但是实际开发中, 我们很多时候是需要知道请求之间的关联关系的. 例如登陆网站成功后, 第二…