Python 如何使用groupcollide?
所以我一直想知道如何使用pygame groupcollide。我现在完全被难住了。因为我使用的是collide_rect,这很好。但是对于groupcollide,我似乎不知道如何调用该组中项目的属性。我不能做碰撞矩形,因为会有很多子弹Python 如何使用groupcollide?,python,pygame,Python,Pygame,所以我一直想知道如何使用pygame groupcollide。我现在完全被难住了。因为我使用的是collide_rect,这很好。但是对于groupcollide,我似乎不知道如何调用该组中项目的属性。我不能做碰撞矩形,因为会有很多子弹 def check_blast_collisions(player,bullet): hits = pg.sprite.groupcollide(player,bullet,False,True) for hit in hits:
def check_blast_collisions(player,bullet):
hits = pg.sprite.groupcollide(player,bullet,False,True)
for hit in hits:
print (hits)
if hit.vx == 20:
player.vx += 40
elif hit.vx == -20:
player.vx += -40
下面是我尝试使用groupcollide的一个片段。
在我完成这个功能后,子弹甚至都没有出现。(子弹应该被称为爆炸,但我在这个函数中忘记了。)
将pygame导入为pg
#背景
描述=“击退竞技场”
分辨率=1600900
宽度=分辨率[0]
高度=分辨率[1]
FPS=60
运动员\跳跃\高度=30
玩家\最大\坠落\速度=30
玩家下降速度增加=2
玩家_寿命=5
射击冷却时间=500
#初始化pygame
第init页()
pg.mixer.init()
pg.font.init
屏幕=pg.display.set_模式(分辨率)
pg.display.set_标题(标题)
时钟=pg.time.clock()
#精灵
课堂讲台(第三页:雪碧、雪碧):
定义初始值(自、x、y、宽度、高度、r、g、b):
精灵精灵。精灵。精灵初始(自我)
self.image=pg.Surface((宽度、高度))
自映像填充((r,g,b))
self.rect=self.image.get_rect()
self.rect.center=(x,y)
职业玩家(第三页精灵):
定义初始(self,r,g,b,x,y):
精灵精灵。精灵。精灵初始(自我)
self.image=pg.Surface((40100))
自映像填充((r,g,b))
self.rect=self.image.get_rect()
self.rect.center=(x,y)
self.startx=x
self.starty=y
self.vx=0
self.vy=5
self.vy\u max=玩家\u max\u坠落\u速度
self.vy\u增加=玩家\u下降\u速度\u增加
self.lifes=玩家生命
self.last_shot=0
self.face_right=错误
self.faceting_left=False
def更新(自我):
self.rect.x+=self.vx
self.rect.y+=self.vy
如果self.vy>=self.vy\u max:
self.vy=self.vy\u max
self.vy_增加=0
如果self.vy=高度:
self.rect.x=self.startx
self.rect.y=self.starty
self.lifes-=1
如果self.lifes=宽度:
self.rect.right=宽度
self.vx=0
如果self.rect.left=main_platform.rect.top:
self.vy-=玩家\跳跃\高度
如果self.rect.bottom>=高度:
self.vy-=玩家\跳跃\高度
def喷射(自):
如果pg.time.get_ticks()-self.last_shot>=射击冷却时间:
如果self.faceting_left==真:
返回“左射”
elif self.faceting_right==真:
返回“右击”
其他:
返回“cd未完成”
班级爆炸(第三页精灵):
定义初始(自我、玩家、方向):
精灵精灵。精灵。精灵初始(自我)
self.image=pg.Surface((20,10))
self.image.fill((0255255))
self.rect=self.image.get_rect()
self.rect.center=(player.rect.center)
方向
如果self.direction==0:
self.vx=-20
elif self.direction==1:
self.vx=20
def更新(自我):
self.rect.x+=self.vx
如果self.rect.right<0:
self.kill()
如果self.rect.left>宽度:
self.kill()
#功能
def检查碰撞(玩家、平台):
hits=pg.sprite.collide_rect(玩家、平台)
如果点击:
如果命中率和player.vy>0:
player.rect.bottom=platform.rect.top
player.vy=0
def检查爆炸碰撞(玩家、子弹):
hits=pg.sprite.groupcollide(玩家、子弹、假、真)
点击率:
打印(点击数)
如果hit.vx==20:
player.vx+=40
elif hit.vx==-20:
player.vx+=-40
font=pg.font.font('font/Roboto-Light.ttf',30)
所有精灵=pg.sprite.Group()
玩家=pg.sprite.Group()
平台=pg.sprite.Group()
blasts=pg.sprite.Group()
主平台=平台(宽度/26501000100,0200,0)
玩家_1=玩家(0,0255,宽度/2+-100200)
游戏者2=游戏者(255,0,0,宽度/2+100200)
平台。添加(主平台)
玩家。添加(玩家1)
玩家。添加(玩家2)
所有精灵。添加(玩家1)
所有精灵。添加(玩家2)
所有精灵。添加(主平台)
菜单=真
运行=真
运行时:
#检查车窗是否关闭
对于pg.event.get()中的事件:
如果event.type==pg.KEYDOWN:
如果event.key==pg.K_w:
玩家_1.跳跃()
如果event.key==pg.K_a:
玩家_1.vx=-10
玩家1.面向左=正确
玩家1.面向右=错误
elif event.key==pg.K_d:
玩家_1.vx=10
玩家1.面向右=正确
玩家1.面向左=错误
如果event.key==pg.K_UP:
玩家_2.跳跃()
如果event.key==pg.K_左:
玩家_2.vx=-10
玩家2.面向左=正确
玩家2.面向右=错误
elif event.key==pg.K_RIGHT:
播放器_2.vx=10
玩家2.面向右=正确
玩家2.面向左=错误
如果event.key==pg.K_j:
如果玩家_1.shoot()=“shoot_left”:
b=爆炸(玩家1,0)
所有精灵。添加(b)
添加(b)
elif player_1.shoot()=“向右射击”:
b=爆炸(玩家_1,1)
所有精灵。添加(b)
添加(b)
如果event.key==pg.K_KP1:
如果玩家2.shoot()=“shoot_left”:
b=爆炸(玩家2,0)
所有精灵。添加(b)
添加(b)
elif player_2.shoot()=“shoot”
import pygame as pg
#settings
CAPTION = "Knockback Arena"
resolution = 1600,900
WIDTH = resolution[0]
HEIGHT = resolution[1]
FPS = 60
player_jump_height = 30
player_max_fall_speed = 30
player_fall_speed_increase = 2
player_lives = 5
shoot_cooldown = 500
#initialize pygame
pg.init()
pg.mixer.init()
pg.font.init
screen = pg.display.set_mode(resolution)
pg.display.set_caption(CAPTION)
clock = pg.time.Clock()
#sprites
class Platform(pg.sprite.Sprite):
def __init__(self,x,y,width,height,r,g,b):
pg.sprite.Sprite.__init__(self)
self.image = pg.Surface((width,height))
self.image.fill((r,g,b))
self.rect = self.image.get_rect()
self.rect.center = (x,y)
class Player(pg.sprite.Sprite):
def __init__(self,r,g,b,x,y):
pg.sprite.Sprite.__init__(self)
self.image = pg.Surface((40, 100))
self.image.fill((r,g,b))
self.rect = self.image.get_rect()
self.rect.center = (x, y)
self.startx = x
self.starty = y
self.vx = 0
self.vy = 5
self.vy_max = player_max_fall_speed
self.vy_increase = player_fall_speed_increase
self.lives = player_lives
self.last_shot = 0
self.facing_right = False
self.facing_left = False
def update(self):
self.rect.x += self.vx
self.rect.y += self.vy
if self.vy >= self.vy_max:
self.vy = self.vy_max
self.vy_increase = 0
if self.vy < self.vy_max:
self.vy_increase = player_fall_speed_increase
if self.rect.bottom < HEIGHT:
self.vy += self.vy_increase
if self.rect.top >= HEIGHT:
self.rect.x = self.startx
self.rect.y = self.starty
self.lives -= 1
if self.lives <= 0:
self.kill()
if self.rect.right >= WIDTH:
self.rect.right = WIDTH
self.vx = 0
if self.rect.left <= 0:
self.rect.left = 0
self.vx = 0
def jump(self):
if self.rect.bottom >= main_platform.rect.top:
self.vy -= player_jump_height
if self.rect.bottom >= HEIGHT:
self.vy -= player_jump_height
def shoot(self):
if pg.time.get_ticks() - self.last_shot >= shoot_cooldown:
if self.facing_left == True:
return "shoot_left"
elif self.facing_right == True:
return "shoot_right"
else:
return "cd_not_done"
class Blast(pg.sprite.Sprite):
def __init__(self,player,direction):
pg.sprite.Sprite.__init__(self)
self.image = pg.Surface((20,10))
self.image.fill((0,255,255))
self.rect = self.image.get_rect()
self.rect.center = (player.rect.center)
self.direction = direction
if self.direction == 0:
self.vx = -20
elif self.direction == 1:
self.vx = 20
def update(self):
self.rect.x += self.vx
if self.rect.right < 0:
self.kill()
if self.rect.left > WIDTH:
self.kill()
#functions
def check_for_collisions(player,platform):
hits = pg.sprite.collide_rect(player,platform)
if hits:
if hits and player.vy > 0:
player.rect.bottom = platform.rect.top
player.vy = 0
def check_blast_collisions(player,bullet):
hits = pg.sprite.groupcollide(player,bullet,False,True)
for hit in hits:
print (hits)
if hit.vx == 20:
player.vx += 40
elif hit.vx == -20:
player.vx += -40
font = pg.font.Font('font/Roboto-Light.ttf', 30)
all_sprites = pg.sprite.Group()
players = pg.sprite.Group()
platforms = pg.sprite.Group()
blasts = pg.sprite.Group()
main_platform = Platform(WIDTH/2,650,1000,100,0,200,0)
player_1 = Player(0,0,255,WIDTH/2 + -100,200)
player_2 = Player(255,0,0,WIDTH/2 + 100,200)
platforms.add(main_platform)
players.add(player_1)
players.add(player_2)
all_sprites.add(player_1)
all_sprites.add(player_2)
all_sprites.add(main_platform)
menu = True
run = True
while run:
#check for closing window
for event in pg.event.get():
if event.type == pg.KEYDOWN:
if event.key == pg.K_w:
player_1.jump()
if event.key == pg.K_a:
player_1.vx = -10
player_1.facing_left = True
player_1.facing_right = False
elif event.key == pg.K_d:
player_1.vx = 10
player_1.facing_right = True
player_1.facing_left = False
if event.key == pg.K_UP:
player_2.jump()
if event.key == pg.K_LEFT:
player_2.vx = -10
player_2.facing_left = True
player_2.facing_right = False
elif event.key == pg.K_RIGHT:
player_2.vx = 10
player_2.facing_right = True
player_2.facing_left = False
if event.key == pg.K_j:
if player_1.shoot() == "shoot_left":
b = Blast(player_1,0)
all_sprites.add(b)
blasts.add(b)
elif player_1.shoot() == "shoot_right":
b = Blast(player_1,1)
all_sprites.add(b)
blasts.add(b)
if event.key == pg.K_KP1:
if player_2.shoot() == "shoot_left":
b = Blast(player_2,0)
all_sprites.add(b)
blasts.add(b)
elif player_2.shoot() == "shoot_right":
b = Blast(player_2,1)
all_sprites.add(b)
blasts.add(b)
elif event.type == pg.KEYUP:
if event.key == pg.K_a:
player_1.vx = 0
if event.key == pg.K_d:
player_1.vx = 0
if event.key == pg.K_LEFT:
player_2.vx = 0
if event.key == pg.K_RIGHT:
player_2.vx = 0
if event.type == pg.QUIT:
pg.quit()
exit()
#update all sprites
all_sprites.update()
check_for_collisions(player_1,main_platform)
check_for_collisions(player_2,main_platform)
check_blast_collisions(players,blasts)
#draw sprites
screen.fill((255,255,255))
all_sprites.draw(screen)
#draw other stuff
p1lives = font.render(str(player_1.lives), False, (0,0,255))
screen.blit(p1lives,(20,50))
p2lives = font.render(str(player_2.lives), False, (255,0,0))
screen.blit(p2lives,(1580,50))
clock.tick(FPS)
pg.display.flip()