我今天刚刚开始学习pygame,并遇到了一些碰撞问题。当船撞到小行星大部分时间它都不会做任何事情,但是同时发生了19次碰撞和很多声音效果。
from pygame import *
import random as rand
from colors import *
import os
pygame.mixer.pre_init(44100, 16, 2, 4096) #frequency, size, channels, buffersize
pygame.init() #turn all of pygame on.
fps = 60
window_size = window_width, window_height = 800, 600
pygame.mixer.music.load('music.wav')
pygame.mixer.music.play(-1)
explode = pygame.mixer.Sound("explode.wav")
class Player(pygame.sprite.Sprite):
#sprite for player
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("plane.png")
self.rect = self.image.get_rect()
self.setprop()
self.xspeed = 0
def setprop( self ):
self.rect = self.image.get_rect()
self.orgin_x = self.rect.centerx
self.orgin_y = self.rect.centery
def set_position(self, x, y):
self.rect.x = x - self.orgin_x
self.rect.y = y - self.orgin_y
def update(self):
self.xspeed = 0
keystate = pygame.key.get_pressed()
if keystate[pygame.K_LEFT]:
self.xspeed = -8
if keystate[pygame.K_RIGHT]:
self.xspeed = 8
self.rect.x += self.xspeed
if self.rect.right > window_width:
self.rect.right = window_width
if self.rect.left < 0:
self.rect.left = 0
class Mob(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("boulder.png")
#self.image.fill(red)
self.rect = self.image.get_rect()
self.rect.x = rand.randrange(window_width - self.rect.width)
self.rect.y = rand.randrange( -100, -40 )
self.speed = rand.randrange(6, 8)
self.sound = pygame.mixer.Sound("swoosh.wav")
def play_sound(self):
self.sound.play()
def update(self):
self.rect.y += self.speed
if self.rect.top > window_height + 10:
self.rect.x = rand.randrange(window_width - self.rect.width)
self.rect.y = rand.randrange( -100, -40 )
self.speed = rand.randrange(6, 8)
sprites = pygame.sprite.Group()
mobs = pygame.sprite.Group()
player = Player()
sprites.add(player)
for i in range(12):
m = Mob()
mobs.add(m)
player.set_position( window_width/2, window_height/2 +215 )
pygame.init()
pygame.mixer.init()
window = pygame.display.set_mode( window_size, pygame.RESIZABLE )
pygame.display.set_caption('Dodge the Boulders!')
clock = pygame.time.Clock()
explode = pygame.mixer.Sound("explode.wav")
running = True
while ( running ):
for event in pygame.event.get():
if( event.type == pygame.QUIT ):
running = False
if ( pygame.sprite.collide_rect(m, player) ):
explode.play()
print('collide')
clock.tick( fps )
window.fill(black)
sprites.update()
sprites.draw(window)
mobs.update()
mobs.draw(window)
pygame.display.update()
pygame.display.quit()
pygame.quit()
这是我用于碰撞的部分(在我的游戏循环中)
if ( pygame.sprite.collide_rect(m, player) ):
explode.play()
print('collide')
我在其他文件中使用这种碰撞方法,它似乎有效,我不知道这里的问题是什么。我唯一能想到的是我没有在某处更新它但我找不到任何东西。除了播放声音(和打印冲突)之外,我不希望发生任何其他事情
答案 0 :(得分:3)
您的游戏圈发现碰撞 - &gt; 播放声音。循环快速。
了解问题?
你可以尝试制作一个全局变量,并在发生碰撞时将其设置为True
以避免多个声音。
示例:强>
crash = False // at global scope
if (pygame.sprite.collide_rect(m, player) and not crash):
explode.play()
print('collide')
crash = True
如果您的游戏在崩溃后继续游戏,请确保在需要时将其重置为False
。
答案 1 :(得分:0)
稍前想出来但决定在这里发帖。
所以这个
hits = pygame.sprite.spritecollide(player, mobs, False)
if hits:
running = False
首先是精灵,然后是一个组。 (布尔是dokill)。它基本上只能以这种方式进行测试。
然而,这可以针对小组测试小组:
hits = pygame.sprite.groupcollide(mobs, bullets, True, True)
if hits:
pygame.mixer.Sound.play(zap)
答案 2 :(得分:0)
你可以使用# A list of mobs that have collided with the player.
# Set dokill to True to remove the collided sprites.
collided_mobs = pygame.sprite.spritecollide(player, mobs, True)
# Do something for every collided mob.
for mob_sprite in collided_mobs:
sound.play()
mobs.add(Mob()) # Add a new mob to replace the collided.
并杀死相互碰撞的暴徒。然后播放声音并为每个碰撞的暴徒添加一个新的暴徒。
{{1}}