2017-07-16 5 views
1

今日はPygameの学習を始めましたが、いくつかの問題が衝突しています。船がほとんどの時間小惑星に当たると、何もしませんが、19回の衝突と多くの音響効果が一気に起こります。ここでPygameの衝突は一度に19回起こっています - Python 3.x

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') 

I「は、私は他のファイルに衝突するこの方法を使用してきたし、働いているように見えました問題が何であるかわからない私が考えることができる唯一のことは、私はどこかでそれを更新していないが、私は何も見つけることができなかったということです。 >を果たしている - 私はあなたのゲームループが衝突を見

+0

ゲームループで衝突が発生する - >サウンドが再生されます。ループは高速です。問題を理解する? – sudo

+0

コードが多すぎます... –

+0

@sudoどうすれば修正できますか? –

答えて

0

あなただけspritecollideを使用して衝突暴徒を殺すことができます。次に、サウンドを再生し、衝突したすべての暴徒に新しい暴徒を追加します。

# 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. 
3

音(と印刷の衝突を)演奏以外に発生する何かをしたくありません。ループは、ファストです。

問題を理解していますか?

グローバル変数を作成して、複数のサウンドを避けるために衝突が発生したときにTrueに設定することができます。

例:

crash = False // at global scope 

if (pygame.sprite.collide_rect(m, player) and not crash): 
    explode.play() 
    print('collide') 
    crash = True 

ちょうどあなたのゲームがクラッシュした後に続けば、必要なときFalseにリセットしてください。

+0

これはうまくいかないようです。同じ問題が発生します。スクリプトのプリントは、私がMobオブジェクトに衝突する約3分の1にしか衝突しません。 –

0

少し前に考えてみましたが、ここに投稿することに決めました。

ので、この

hits = pygame.sprite.spritecollide(player, mobs, False) 
if hits:  
    running = False 

は、最初のスプライトを取り、その後、グループになります。 (booleanはdokillです)。基本的にはこの方法でのみテストできます。

しかし、これはグループに対してグループをテストすることができます。

hits = pygame.sprite.groupcollide(mobs, bullets, True, True) 
if hits: 
    pygame.mixer.Sound.play(zap) 
関連する問題