2016-11-30 4 views
0

2つのスプライトが衝突するたびにスコアが1ずつ増加するゲームを作成しています。今すぐスコアは0として表示され、衝突が発生すると39に増加します(時には27になります)。数の変化により秒単位で増加すると考えられます。ここにいくつかの他の回答を読むと、私はそれが最も可能性が高い私は、forループに位置PythonのPyGameスコアカウンタが1でなく、秒単位でインクリメントする

t = f.render("Score = " + str(score), False, black) 
screen.blit(t, (0,0)) 

を持っている場所の問題で実感しました。しかし、私は別の場所に置いてみると、スコアは画面上にまったく表示されません。ここ

はスコア

class Tub(Sprite): 
    def __init__(self): 
     Sprite.__init__(self) 
     self.image = image.load("tub.bmp").convert_alpha() 
     self.image = transform.scale(self.image, (100, 100)) 
     self.rect = self.image.get_rect() 
     self.rect.x = width/2 
     self.rect.y = height - 100  
    def movement(self): 
     keys = pygame.key.get_pressed() 
     dist = 5 
     if keys [pygame.K_LEFT]: 
      self.rect.x -= dist 
     if keys [pygame.K_RIGHT]: 
      self.rect.x += dist 
    def hit(self, target): 
     return self.rect.colliderect(target) 

class Singlescoop_pink(Sprite): 
    def __init__(self): 
     Sprite.__init__(self) 
     self.image = image.load("singlescoop_pink.bmp").convert_alpha() 
     self.image = transform.scale(self.image, (100, 100)) 
     self.rect = self.image.get_rect() 
     self.rect.x = random.randint(0, width-100) #random x position, minus 100 so image does not go off screen 
     self.rect.y = -600 #start off screen so starting point to fall down is not visible 
    def movement(self): 
     self.rect.y += 5 
     if self.rect.y > height: 
      self.kill() 


tub = Tub() 
sspink = Singlescoop_pink() 
sprites = pygame.sprite.RenderPlain(tub, sspink) 
score = 0 

def game_loop(): 

    gameExit = False 
    while not gameExit: 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       quit() 
       sys.exit() 

     if tub.hit(sspink): 
      sspink.kill() 
      global score 
      score += 1 

     tub.movement() 
     sspink.movement() 
     screen.fill(white) 
     t = f.render("Score = " + str(score), False, black) 
     screen.blit(t, (0,0)) 
     sprites.update() 
     sprites.draw(screen) 
     display.update() 
     clock.tick(60) 

game_loop() 
+2

私は前にいくつかのゲームプログラミングをやったが、私が使用しpygameのダウンロードをhaventは以前はどのようにして衝突を処理しているのか分かりませんが、秒を増やすこととは関係ありませんが、複数のフレームでスプライトが接触している可能性があります。ゲームが60 fpsで実行されている場合、メインゲームループは毎秒60回実行されるため、複数のフレームでスプライトが接触している可能性があります。 – RichSmith

+0

それはまさに問題でした。ありがとうございました! – Zanne

答えて

2

ファーストを作成する私のコードの一部であり、あなただけのupdateにごmovement機能の名前を変更することができ、そして、彼らはsprites.update()によって呼び出されることに注意してください。

Spritekillを呼び出すと、魔法のようにゲームから削除されないことを理解する必要があります。すべてのスプライトグループから削除されます。 sspink.kill()に電話をかけますが、オブジェクトはまだsspink変数に存在します。

sspink.movement()を呼び出したので、それはまだ移動します(メインループの繰り返しごとに他のスプライトと衝突します)。スプライトグループ(sprites.draw(screen))で描画を処理し、sspinkがこのグループから削除されたため、画面に描画されません。何をすべきことは以下の通りです

落ちてくるブロックのための新しいスプライトグループを作成します。

blocks = pygame.sprite.RenderPlain(sspink) 

をその後、代わりに衝突をチェックするtub.hit(sspink)を呼び出す(実際には、単に削除hit機能)、pygameののpygame.sprite.spritecollide機能を使用します。

global score 
score += len(pygame.sprite.spritecollide(tub, blocks, True)) 

この関数は、コリスのためにチェックしますイオンがtubblocksグループのスプライトの間にあり、衝突があればそのグループのスプライトを殺してから、tubと衝突したスプライトを返します。

私たちは、衝突したブロックの数をカウントしています(現時点では、最大で1つですが、将来的なものにしましょう)。

spritecollideはスプライトを強制終了するため、blocksグループには存在しないため、衝突が1回だけチェックされます。また、彼らはもはやspritesグループに属していないので、更新されず、画面に表示されません。実際に

我々が最初にこのように私たちのグループを構築する場合、あなたは、もはや(私たちはそれを抽象化)のすべてでsspinkを必要としない:

blocks = pygame.sprite.RenderPlain(Singlescoop_pink()) 
sprites = pygame.sprite.RenderPlain(tub, *blocks) 
+0

非常に詳細な説明や他のPyGameのヒントをありがとうございました。これは私の得点の問題を修正しました。ありがとうございました!! – Zanne

関連する問題