python矩形碰撞检测算法_Pygame碰撞检测

python矩形碰撞检测算法_Pygame碰撞检测
学习⾃⼩甲鱼视频教学(笔记)
功能实现:
在随机位置⽣成若⼲个⼩球以随机速度运动;
若⼩球运动出左边界则从右边界进⼊,上下边界同理;
若两⼩球相碰撞则都以相反速度运动分开。
代码如下:
1.尝试⾃⼰写碰撞检测函数(对⽐两球之间的圆⼼距离和半径即可)。
1 importpygame
防盗监控设备
2 importsys
3 importmath
4 from pygame.locals import *
5 from random import *
6
7
8 #⾯向对象的编程⽅法,定义⼀个球的类型
9 classBall(pygame.sprite.Sprite):10 def __init__(self, image, position, speed, bg_size):11 #初始化动画精灵
12 pygame.sprite.Sprite.__init__(self)13
14 self.image =pygame.image.load(image).convert_alpha() =_rect()16 #将⼩球放在指定位置
left, p =position18 self.speed =speed19 self.width, self.height = bg_size[0], bg_size[1]20
21 #定义⼀个移动的⽅法
22 defmove(self): =ve(self.speed)24 #如果⼩球的左侧出了边界,那么将⼩球左侧的位置改为右侧的边界25 #这样便实现了从左边进⼊,右边出来的效果
26 ight <0:left =self.width28 left >self.width:ight =030 bottom
<0:op =self.height32 op >self.height:bottom =034
35
36 defcollide_check(item, target):37 col_balls =[]38 for each intarget:39 distance =math.sqrt(40
math.pow(([0] - [0]), 2) +
41 math.pow(([1] - [1]), 2))42 if distance <= (width + width) / 2:43
col_balls.append(each)44
45 returncol_balls46
47
48 defmain():49 pygame.init()50
51 ball_image = 'ball.png'
52 bg_image = 'background.png'
53 running =True54
55 #根据背景图⽚指定游戏界⾯尺⼨
56 bg_size = width, height = 1024, 500
57 screen =pygame.display.set_mode(bg_size)58 pygame.display.set_caption('Collision Spheres')59
日志存储60 background =pygame.image.load(bg_image).convert_alpha()61
62 #⽤来存放⼩球对象的列表
63 balls =[]64
减速电动机65 #创建6个位置随机,速度随机的⼩球
66 BALL_NUM = 6
67 for i inrange(BALL_NUM):68 position = randint(0, width - 70), randint(0, height - 70)69 speed = [randint(1, 6), randint(1, 6)]70 ball =Ball(ball_image, position, speed, bg_size)71 whilecollide_check(ball, balls):left, p =
randint(0, width - 70), randint(0, height - 70)73
74 balls.append(ball)75
76 clock =pygame.time.Clock()77
78 whilerunning:79 for event ():80 pe ==QUIT:it()82
83 screen.blit(background, (0, 0))84
85 for each inballs:ve()87 screen.blit(each.image, )88
89 for i inrange(BALL_NUM):90 item =balls.pop(i)91
92 ifcollide_check(item, balls):93 item.speed[0] = -item.speed[0]94 item.speed[1] = -item.speed[1]95
96 balls.insert(i, item)97
98 pygame.display.flip()99 clock.tick(60)100
101
102 if __name__ == '__main__':103 main()
View Code
2.使⽤sprite模块提供的碰撞检测函数。
sprite 模块提供了⼀个 spritecollide() 函数,⽤于检测某个精灵是否与指定组中的其他精灵发⽣碰撞。
spritecollide(sprite, group, dokill, collided = None)
第⼀个参数指定被检测的精灵
第⼆个参数指定⼀个组,由 sprite.Group() ⽣成
第三个参数设置是否从组中删除检测到碰撞的精灵
第四个参数设置⼀个回调函数,⽤于定制特殊的检测⽅法。如果该参数忽略,那么默认是检测精灵之间的 rect 是否产⽣重叠。
注意:
实现圆形的碰撞检测,我们还需要指定 spritecollide() 函数的最后⼀个参数。
sprite 模块中正好有⼀个 collide_circle() 函数⽤于检测两个圆之间是否发⽣碰撞...
这个函数需要你的精灵对象中必须有⼀个 radius(半径)属性才⾏。
1 importpygame
2 importsys
3 from pygame.locals import *
4 from random import *
5
6 #⾯向对象的编程⽅法,定义⼀个球的类型
7 classBall(pygame.sprite.Sprite):8 def __init__(self, image, position, speed, bg_size):9 #初始化动画精灵
10 pygame.sprite.Sprite.__init__(self)11
12 self.image =pygame.image.load(image).convert_alpha() =_rect()14 #将⼩球放在指定位置
left, p =position16 self.speed =speed17 self.width, self.height = bg_size[0], bg_size[1]18 self.radius = width / 2
19
20 #定义⼀个移动的⽅法
21 defmove(self): =ve(self.speed)23 #如果⼩球的左侧出了边界,那么将⼩球左侧的位置改为右侧的边界
24 #这样便实现了从左边进⼊,右边出来的效果
25 ight <0:left =self.width27 left >self.width:ight =029 bottom
<0:op =self.height31 op >self.height:bottom =033
34
35 defmain():36 pygame.init()37
合闸脱扣器
38 ball_image = 'ball.png'
39 bg_image = 'background.png'
40 running =True41
42 #根据背景图⽚指定游戏界⾯尺⼨
43 bg_size = width, height = 1024, 500
44 screen =pygame.display.set_mode(bg_size)45 pygame.display.set_caption('Collision Spheres')46
47 background =pygame.image.load(bg_image).convert_alpha()48
49 #⽤来存放⼩球对象的列表
50 balls =[]51 group =pygame.sprite.Group()52
53 #创建6个位置随机,速度随机的⼩球
54 BALL_NUM = 6
55 for i inrange(BALL_NUM):56 position = randint(0, width - 70), randint(0, height - 70)57 speed = [randint(1, 6), randint(1, 6)]58 ball =Ball(ball_image, position, speed, bg_size)59 whilepygame.sprite.spritecollide(ball, group, False,
llide_circle):left, p = randint(0, width - 70), randint(0, height - 70)61
balls.append(ball)62 group.add(ball)63
64 clock =pygame.time.Clock()65
66 whilerunning:67 for event ():68 pe ==QUIT:it()70
71 screen.blit(background, (0, 0))72
73 for each inballs:ve()75 screen.blit(each.image, )76
旋转连接77 for each ingroup:ve(each)79
80 ifpygame.sprite.spritecollide(each, group, False, llide_circle):81 each.speed[0] = -each.speed[0]82 each.speed[1] = -each.speed[1]83
84 group.add(each)85箱型钢
86 pygame.display.flip()87 clock.tick(60)88
89
90 if __name__ == '__main__':91 main()
View Code

本文发布于:2024-09-23 18:17:52,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/204760.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:碰撞检测   精灵   指定
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议