Python 多个sprite碰撞检测

Python 多个sprite碰撞检测,python,python-3.x,pygame,Python,Python 3.x,Pygame,好的,所以我一直在想如何设置它,但无法使它正常工作。如果你熟悉的话,我正在尝试获得类似于游戏中移动日志的功能。到目前为止,我只对一个pygame.sprite.Group()进行了碰撞检测 导入pygame 导入操作系统 随机输入 os.environ['SDL\u VIDEO\u CENTERED']=“1” 宽度=480 高度=720 FPS=60 #移动对象间距设置第一行 实例计数=0 盒子宽度=30 间距=120 #目标速度 pos_objspeed=1 负速度=-1 黑色=(0,0,0

好的,所以我一直在想如何设置它,但无法使它正常工作。如果你熟悉的话,我正在尝试获得类似于游戏中移动日志的功能。到目前为止,我只对一个
pygame.sprite.Group()进行了碰撞检测

导入pygame
导入操作系统
随机输入
os.environ['SDL\u VIDEO\u CENTERED']=“1”
宽度=480
高度=720
FPS=60
#移动对象间距设置第一行
实例计数=0
盒子宽度=30
间距=120
#目标速度
pos_objspeed=1
负速度=-1
黑色=(0,0,0)
红色=(255,0,0)
绿色=(0,255,0)
pygame.init()
pygame.mixer.init()
screen=pygame.display.set_模式((宽度、高度))
clock=pygame.time.clock()
职业玩家(pygame.sprite.sprite):
定义初始化(自):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.image=pygame.Surface((30,30))
self.image.fill(绿色)
self.rect=self.image.get_rect()
self.rect.centerx=宽度/2
self.rect.bottom=高度-96
self.speedx=0
self.speeded=0
类movingbj_测试(pygame.sprite.sprite):
定义初始化(自):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.image=pygame.Surface((90,30))
self.image.fill(红色)
self.rect=self.image.get_rect()
self.rect.x=(实例计数*(间距+方框宽度))
#self.rect.x=random.randrange(宽度)
self.rect.bottom=384
self.speedx=pos_objspeed
def更新(自我):
self.rect.x+=self.speedx
如果self.rect.x>=480:
self.rect.x=-30
self.rect.bottom=384
self.speedx=pos_objspeed
类MovingObj_TestTwo(pygame.sprite.sprite):
定义初始化(自):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.image=pygame.Surface((90,30))
self.image.fill(红色)
self.rect=self.image.get_rect()
self.rect.x=(实例计数*(间距+方框宽度))
#self.rect.x=random.randrange(宽度)
self.rect.bottom=336
self.speedx=neg_objspeed
def更新(自我):
self.rect.x+=self.speedx
如果self.rect.x>=480:
self.rect.x=-30
self.rect.bottom=336
self.speedx=neg_objspeed
all_sprites=pygame.sprite.Group()
movingobj_l=pygame.sprite.Group()
movingobj_r=pygame.sprite.Group()
对于范围(3)中的i:
实例计数=i+1
obj1=MovingObj_测试()
所有精灵。添加(obj1)
移动对象添加(obj1)
对于范围(3)中的i:
实例计数=i+1
obj2=MovingObj_TestTwo()
所有精灵。添加(obj2)
移动对象添加(对象J2)
player=player()
所有精灵。添加(玩家)
运行=真
onLogLeft=False
onLogRight=False
地面SPD=48
运行时:
时钟滴答声(FPS)
hitsleft=pygame.sprite.spritecollide(player,movingobj_l,False,pygame.sprite.collide_rect)
对于《希斯勒夫》中的热门作品:
player.speedx=pos_objspeed
player.speedy=0
onLogLeft=True
如果len(hitsleft)==0:
onLogLeft=False
player.speedx=0
player.speedy=0
hitsright=pygame.sprite.spritecollide(玩家,移动对象,False,pygame.sprite.collide\rect)
对于hitsright中的hit:
player.speedx=neg_objspeed
player.speedy=0
onLogRight=True
如果len(hitsright)==0:
onLogRight=False
player.speedx=0
player.speedy=0
对于pygame.event.get()中的事件:
如果event.type==pygame.KEYDOWN:
如果event.key==pygame.K_左:
player.speedx=-groundSpd
如果event.key==pygame.K_RIGHT:
player.speedx=groundSpd
如果event.key==pygame.K_UP:
player.speedy=-groundSpd
如果event.key==pygame.K_向下:
player.speedy=groundSpd
如果event.type==pygame.KEYUP和onLogLeft==False和onLogRight==False:
如果event.key==pygame.K_左:
player.speedx=0
如果event.key==pygame.K_RIGHT:
player.speedx=0
如果event.key==pygame.K_UP:
player.speedy=0
如果event.key==pygame.K_向下:
player.speedy=0

如果onLogLeft==False和onLogRight==False和player.rect.bottom左右代码的行为不同,因为如果检测到与
hitsleft
的碰撞,则设置
player.speedx

但是如果与
hitsleft
发生碰撞,则不会与
hitsright
player发生碰撞。speedx
会立即重置:

如果len(hitsright)==0:
onLogRight=False
player.speedx=0
您必须根据这两个条件设置
player.speedx
(例如,在
if
-
elif
-
else
语句中):

运行时:
# [...]
hitsleft=pygame.sprite.spritecollide(player,movingobj_l,False,pygame.sprite.collide_rect)
onLogLeft=any(hitsleft)
hitsright=pygame.sprite.spritecollide(玩家,移动对象,False,pygame.sprite.collide\rect)
onLogRight=any(hitsright)
player.speedy=0
如果为onLogLeft:
player.speedx=pos_objspeed
elif onLogRight:
player.speedx=neg_objspeed
其他:
player.speedx=0
for hit in hitsleft:
   player.speedx = pos_objspeed