Pygame基础8-碰撞

Collisions

在Pygame中,我们使用矩形来移动物体,并且用矩形检测碰撞。

colliderect检测两个矩形是否碰撞,但是没法确定碰撞的方向。

Rect1.colliderect(Rect2)
# collision -> return Ture 
# else -> return False

collidepoint可以确定一个矩形是否和另一个矩形的某个碰撞(并确定碰撞方向),但是会很麻烦,并且很容易遗漏某些碰撞。

Rect1.collidepoint(x, y)
# x,y is the point on a Rect

在这里插入图片描述

综合考虑之后,
我们通常使用colliderect来检测碰撞,然后根据两个矩形的相对位置确定碰撞方向。

在这里插入图片描述

案例

一个矩形(和边框的碰撞)

# rect1
rect1 = pygame.Rect(100, 100, 50, 50)
color1 = (255, 255, 255)
speed_1_x = 5
speed_1_y = 5def update_rect():global speed_1_x, speed_1_yrect1.x += speed_1_xrect1.y += speed_1_y# rect 和边界的碰撞:if rect1.left <= 0 and speed_1_x <0:speed_1_x *= -1elif rect1.right >= witdth and speed_1_x > 0:speed_1_x *= -1if rect1.top <= 0 and speed_1_y < 0 :speed_1_y *= -1elif rect1.bottom >= height and speed_1_y > 0:speed_1_y *= -1pygame.draw.rect(screen, color1, rect1)# 在主循环中调用 update_rect()
while True:...screen.fill((30, 30, 30))update_rect()...

添加第二个矩形

注意:除了判断碰撞方向之外,还要判断矩形的速度方向,以防止矩形在碰撞后反复移动。

在这里插入图片描述

# rect2
rect2 = pygame.Rect(200, 200, 200, 50)
color2 = (0, 255, 0)
speed_2_x = 0
speed_2_y = 4 # 为了简化,rect2只在竖直方向上移动def update_rect():global speed_1_x, speed_1_y,  speed_2_y...rect2.y += speed_2_y# rect 和边界的碰撞:...if rect2.top <= 0 and speed_2_y < 0 :speed_2_y *= -1elif rect2.bottom >= height and speed_2_y > 0:speed_2_y *= -1# rect1 和 rect2的碰撞collide_threshold = 20if rect1.colliderect(rect2): if abs(rect1.top - rect2.bottom) < collide_threshold and speed_1_y < 0:speed_1_y *= -1elif abs(rect1.bottom - rect2.top) < collide_threshold and speed_1_y > 0:speed_1_y *= -1elif abs(rect1.left - rect2.right) < collide_threshold and speed_1_x < 0:speed_1_x *= -1elif abs(rect1.right - rect2.left) < collide_threshold and speed_1_x > 0:speed_1_x *= -1pygame.draw.rect(screen, color1, rect1)pygame.draw.rect(screen, color2, rect2)

完整案例

两个方块的碰撞。为了简化,rect2只在竖直方向上移动。
在这里插入图片描述

import sys
import time
import pygame# Initialize Pygame
pygame.init()# Set up the display
witdth = 800
height = 600
screen = pygame.display.set_mode((witdth, height))# Set up the clock
clock = pygame.time.Clock()# rect1
rect1 = pygame.Rect(100, 100, 50, 50)
color1 = (255, 255, 255)
speed_1_x = 5
speed_1_y = 5# rect2
rect2 = pygame.Rect(200, 200, 300, 50)
color2 = (0, 255, 0)
speed_2_x = 0 
speed_2_y = 4 # 为了简化,rect2只在竖直方向上移动def update_rect():global speed_1_x, speed_1_y, speed_2_x, speed_2_yrect1.x += speed_1_xrect1.y += speed_1_y#rect2.x += speed_2_xrect2.y += speed_2_y# rect 和边界的碰撞:if rect1.left <= 0 and speed_1_x <0:speed_1_x *= -1elif rect1.right >= witdth and speed_1_x > 0:speed_1_x *= -1if rect1.top <= 0 and speed_1_y < 0 :speed_1_y *= -1elif rect1.bottom >= height and speed_1_y > 0:speed_1_y *= -1if rect2.top <= 0 and speed_2_y < 0 :speed_2_y *= -1elif rect2.bottom >= height and speed_2_y > 0:speed_2_y *= -1#以 HH:MM:SS 的格式 输出当前时间 form_time1 = time.strftime("%H:%M:%S", time.localtime())print('rect2 to bottom', 'time= ', form_time1)# rect1 和 rect 2的碰撞collide_threshold = 20if rect1.colliderect(rect2): if abs(rect1.top - rect2.bottom) < collide_threshold and speed_1_y < 0:speed_1_y *= -1if abs(rect1.bottom - rect2.top) < collide_threshold and speed_1_y > 0:speed_1_y *= -1if abs(rect1.left - rect2.right) < collide_threshold and speed_1_x < 0:speed_1_x *= -1if abs(rect1.right - rect2.left) < collide_threshold and speed_1_x > 0:speed_1_x *= -1# Draw the rectpygame.draw.rect(screen, color1, rect1)pygame.draw.rect(screen, color2, rect2)while True:# Handle eventsfor event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()screen.fill((30, 30, 30))update_rect()# Update the displaypygame.display.flip()# Cap the frame rateclock.tick(60)

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

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

相关文章

单例(Singleton)设计模式

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

【QT入门】 无边框窗口设计之实现窗口阴影

往期回顾&#xff1a; 【QT入门】 设计实现无边框窗口拉伸的公用类-CSDN博客 【QT入门】对无边框窗口自定义标题栏并实现拖动和拉伸效果-CSDN博客 【QT入门】 自定义标题栏界面qss美化按钮功能实现-CSDN博客 【QT入门】 无边框窗口设计之实现窗口阴影 一共用了两个类&#xf…

C 回调函数的两种使用方法

对回调&#xff08;callback&#xff09;函数的一点粗陋理解&#xff0c;在我小时候&#xff0c;隔壁村有家月饼小作坊&#xff08;只在中秋那段时间手工制作一些月饼出售&#xff0c;后来好像不做了&#xff09;&#xff0c;做出的月饼是那种很传统很经典的款式&#xff0c;里…

C语言要点细细梳理(上)

1.类型转换 1.1 隐式类型转换 在两个不同类型数据进行运算时&#xff0c;会把低精度类型的数据转为与高精度类型一致的数据类型然后计算&#xff0c;然后再根据赋值的需要把计算结果转回去 1.2 强制类型转换 可以将某种类型的数据转换为想要的精度&#xff0c;一般int、dou…

Swin_transformer模型解析

目录 •1、网络整体框架 •2 、Patch Merging •3 、W-MSA MSA模块计算量 W-MSA模块计算量 •4、 SW-MSA •5 、Relative Position Bias •1、网络整体框架 •2 、Patch Merging 这里看着挺复杂&#xff0c;其实就相当于先对特征图进行LayerNorm&#xff0c;然后再进行一…

webapi 允许跨域

1.在Nuget安装webapi.cors 添加完会有这个包 然后在项目App_Start 目录下的WebApiConfig.cs里面添加 // Web API 配置和服务// 添加跨域设置config.EnableCors(new EnableCorsAttribute("*", "*", "*"));

CSS基础选择器 小案例复习(画三个小盒子)

&#xff08;大家好&#xff0c;前面我们学习了基础的选择器&#xff0c;俗话说&#xff1a;温故而知新。所以今天我们将通过小案例来复习前面学过的小知识点。另&#xff0c;十分感谢大家对我文章的支持❤️&#xff09; 通过这个案例复习两个地方&#xff1a; 类选择器的使用…

GICv3学习

中断分组 GICD_CTLR&#xff1a;配置是否支持group0、安全group1、非安全group1中断&#xff1b; 怎么配置中断在哪个组&#xff1b; 怎么知道中断是安全的还是非安全的&#xff1b; GICD_IGROUPR&#xff1a; 配置中断分组、中断是安全还是非安全&#xff1b; 4.4 软件产生中…

北方经贸经济类知网收录月刊投稿发表论文

《北方经贸》期刊是由国家新闻出版总署批准&#xff0c;黑龙江省教育厅主管&#xff0c;黑龙江省经济管理干部学院主办的经济类综合期刊。期刊融理论性、知识性、实践性于一体&#xff0c;立足龙江&#xff0c;辐射全国&#xff0c;面向世界&#xff0c;注重研究解决重大现实理…

探索智慧物流园区系统的发展蓝图

在当今数字化时代&#xff0c;智慧物流园区系统正经历着深刻的变革和快速的发展。那么&#xff0c;智慧物流园区系统的发展趋势究竟是什么呢&#xff1f;让我们一同深入探讨。 &#xff08;1&#xff09;智能化是智慧物流园区系统的重要发展趋势之一。通过人工智能、大数据等先…

双机 Cartogtapher 建图文件配置

双机cartogtapher建图 最近在做硕士毕设的最后一个实验&#xff0c;其中涉及到多机建图&#xff0c;经过调研最终采用cartographer建图算法&#xff0c;其中配置多机建图的文件有些麻烦&#xff0c;特此博客以记录 非常感谢我的同门 ”叶少“ 山上的稻草人-CSDN博客的帮助&am…

文心一言指令词宝典之旅行篇

作者&#xff1a;哈哥撩编程&#xff08;视频号、抖音、公众号同名&#xff09; 新星计划全栈领域优秀创作者博客专家全国博客之星第四名超级个体COC上海社区主理人特约讲师谷歌亚马逊演讲嘉宾科技博主极星会首批签约作者 &#x1f3c6; 推荐专栏&#xff1a; &#x1f3c5;…