2016-05-07 19 views
0

私はボールやパワーアップや病気を撃つ大砲のように最終的にブロック/さまざまな機能を追加してしまうが、今の私も正しく..... インポートpygameのポンボールはパドルを通り抜けて壁に当たって、パドルにぶつかって反射する。

BLACK = (0,0,0) 
WHITE = (255,255,255) 
RED = (255,0,0) 
GOLD = (201,168,168) 
Call = pygame.sprite.Group(()) 
got = pygame.sprite.Group(()) 
SCR_WID, SCR_HEI = 640, 480 
backg = pygame.image.load("background.png") 


class Player(pygame.sprite.Sprite): 
     def __init__(self, name): 
       pygame.sprite.Sprite.__init__(self) 
       if name == "george": 
         self.x, self.y = 16, SCR_HEI/2 
       elif name =="frank": 
         self.x, self.y = SCR_WID-16, SCR_HEI/2 
       self.name = name 
       self.speed = 3 
       self.padWid, self.padHei = 8, 64 
       self.score = 0 
       self.scoreFont = pygame.font.Font("imagine_font.ttf", 64)   



     def scoring(self): 
       scoreBlit = self.scoreFont.render(str(self.score), 1, (255, 255, 255)) 
       if self.name == "george": 
         screen.blit(scoreBlit, (32, 16)) 
         if self.score == 10: 
           print ("player 1 wins!") 
           exit() 
       elif self.name == "frank":   
         screen.blit(scoreBlit, (SCR_HEI+92, 16)) 
         if self.score == 10: 
           print ("Player 2 wins!") 
           exit() 

     def movement(self): 

       keys = pygame.key.get_pressed() 
       if self.name == "george": 
         if keys[pygame.K_w]: 
           self.y -= self.speed 
         elif keys[pygame.K_s]: 
           self.y += self.speed 
       elif self.name == "frank": 
         if keys[pygame.K_UP]: 
           self.y -= self.speed 
         elif keys[pygame.K_DOWN]: 
           self.y += self.speed 

       if self.y <= 0: 
         self.y = 0 
       elif self.y >= SCR_HEI-64: 
         self.y = SCR_HEI-64 

     def draw(self): 
       pygame.draw.rect(screen, (255, 255, 255), (self.x, self.y, self.padWid, self.padHei)) 

ボールが敵のパドルを通過しているパドルを打つためにボールを取得傾けます。それは実際にそれを通過するわけではありませんがそれをブロックしますが、パドルを過ぎる。私はいろいろなやり方を試みてきましたが、私はこれに新しいし、苦労しています。

これは私がトラブルを引き起こしていると信じているクラスです。私はそのようなIDのようにパドルに当たっていないという方法でもエラーは発生しません。プレイヤーのパドルは正しく動作していない敵のものだけをうまく動作させます。

class Ball(pygame.sprite.Sprite): 
     image = pygame.image.load("bong.png") 
     def __init__(self): 
       pygame.sprite.Sprite.__init__(self) 
       self.rect = self.image.get_rect() 

       self.rect.x, self.rect.y = SCR_WID/2, SCR_HEI/2 
       self.speed_x = -3 
       self.speed_y = 3 
       self.size = 8 

     def movement(self): 
       self.rect.x += self.speed_x 
       self.rect.y += self.speed_y 


       if self.rect.y <= 0: 
         self.speed_y *= -1 
       elif self.rect.y >= SCR_HEI-self.size: 
         self.speed_y *= -1 

       if self.rect.x <= 0: 
         self.__init__() 
         enemy.score += 1 
       elif self.rect.x >= SCR_WID-self.size: 
         self.__init__() 
         self.speed_x = 3 
         player.score += 1 

       for n in range(-self.size, player.padHei): 
         if self.rect.y == player.y + n: 
           if self.rect.x <= player.x + player.padWid: 
             self.speed_x *= -1 
             break 
         n += 1 
       for n in range(-self.size, enemy.padHei): 
         if self.rect.y == enemy.y + n: 
           if self.rect.x >= enemy.x - enemy.padWid: 
             self.speed_x *= -1 
             break 

また、ボールが跳ね返るようにブロックに衝突を追加することも苦労しています。アイブはいくつかの方法で試してみたが、ボールがパドルを通過していたことに気付き、まずそれを修正しなければならなかった。これは私の次のステップです。どんな助けもありがとうございます。

class Block(pygame.sprite.Sprite): 
     image = pygame.image.load("brick.png") 


     def __init__(self): 
       pygame.sprite.Sprite.__init__(self) 
       self.rect = self.image.get_rect() 
       self.rect.x = 300 
       self.rect.y = 0 





SCR_WID, SCR_HEI = 640, 480 
screen = pygame.display.set_mode((SCR_WID, SCR_HEI)) 
pygame.display.set_caption("Pong") 
pygame.font.init() 
clock = pygame.time.Clock() 
FPS = 60 
pygame.init() 

def main(): 
    backgscale = pygame.transform.scale(backg,(SCR_WID, SCR_HEI)) 

    global player 
    player = Player("george") 

    global enemy 
    enemy = Player("frank") 

    block = Block() 
    got.add(block) 

    ball = Ball() 
    Call.add(ball) 

    while True: 

      for event in pygame.event.get(): 
        if event.type == pygame.QUIT: 
          print("Game exited by user") 
          exit() 

      screen.blit(backg,(0,0))     
      got.update() 
      Call.update() 
      backgscale = pygame.transform.scale(backg,(SCR_WID, SCR_HEI)) 
      got.draw(screen) 
      Call.draw(screen) 
      player.movement() 
      enemy.movement() 
      ball.movement() 

      player.draw() 
      player.scoring() 
      enemy.draw() 
      enemy.scoring() 





      pygame.display.flip() 
      clock.tick(FPS) 

main() 

私は間違っているかどうかを知りません。

私は私のように表面に画像を変更しなければならなかった...スプライトグループを作成し、それらに私はそれらを表示し、まだ移動するためにそれらを持っているためのより良い方法を知らない、そのように表示

+0

こんにちは、あなたの助けを借りてからあなたの投稿を欺くことはありません。それはそれの下に避難所を取った後に木を切り落とすようなものです。他の将来のユーザーが知識から得ることを許可してください。回答者は多くの努力をしていたでしょう。貴重な時間を無駄にしないでください。 –

答えて

1

を試してみましたイメージはありませんが、これは私のためにうまく動作します。

import pygame 
from pygame.locals import * 

SCR_WID, SCR_HEI = 640, 480 
screen = pygame.display.set_mode((SCR_WID, SCR_HEI)) 
pygame.display.set_caption("Pong") 
pygame.font.init() 
clock = pygame.time.Clock() 
FPS = 60 
pygame.init() 


BLACK = (0,0,0) 
WHITE = (255,255,255) 
RED = (255,0,0) 
GOLD = (201,168,168) 
Call = pygame.sprite.Group(()) 
got = pygame.sprite.Group(()) 
#SCR_WID, SCR_HEI = 640, 480 
backg = pygame.Surface((SCR_WID, SCR_HEI)) #pygame.image.load("background.png") 


class Player(pygame.sprite.Sprite): 
     def __init__(self, name): 
       pygame.sprite.Sprite.__init__(self) 
       if name == "george": 
         self.x, self.y = 16, SCR_HEI/2 
       elif name =="frank": 
         self.x, self.y = SCR_WID-16, SCR_HEI/2 
       self.name = name 
       self.speed = 3 
       self.padWid, self.padHei = 8, 64 
       self.score = 0 
       self.scoreFont = pygame.font.SysFont("Arial", 32) #imagine_font.ttf", 64)   



     def scoring(self): 
       scoreBlit = self.scoreFont.render(str(self.score), 1, (255, 255, 255)) 
       if self.name == "george": 
         screen.blit(scoreBlit, (32, 16)) 
         if self.score == 10: 
           print ("player 1 wins!") 
           exit() 
       elif self.name == "frank":   
         screen.blit(scoreBlit, (SCR_HEI+92, 16)) 
         if self.score == 10: 
           print ("Player 2 wins!") 
           exit() 

     def movement(self): 

       keys = pygame.key.get_pressed() 
       if self.name == "george": 
         if keys[pygame.K_w]: 
           self.y -= self.speed 
         elif keys[pygame.K_s]: 
           self.y += self.speed 
       elif self.name == "frank": 
         if keys[pygame.K_UP]: 
           self.y -= self.speed 
         elif keys[pygame.K_DOWN]: 
           self.y += self.speed 

       if self.y <= 0: 
         self.y = 0 
       elif self.y >= SCR_HEI-64: 
         self.y = SCR_HEI-64 

     def draw(self): 
       pygame.draw.rect(screen, (255, 255, 255), (self.x, self.y, self.padWid, self.padHei)) 

class Ball(pygame.sprite.Sprite): 
    image = pygame.Surface((8,8)) #pygame.image.load("bong.png") 
    image.fill((255,255,255)) 
    def __init__(self): 
      pygame.sprite.Sprite.__init__(self) 
      self.rect = self.image.get_rect() 

      self.rect.x, self.rect.y = SCR_WID/2, SCR_HEI/2 
      self.speed_x = -3 
      self.speed_y = 3 
      self.size = 8 

    def movement(self): 
      self.rect.x += self.speed_x 
      self.rect.y += self.speed_y 


      if self.rect.y <= 0: 
        self.speed_y *= -1 
      elif self.rect.y >= SCR_HEI-self.size: 
        self.speed_y *= -1 

      if self.rect.x <= 0: 
        self.__init__() 
        enemy.score += 1 
      elif self.rect.x >= SCR_WID-self.size: 
        self.__init__() 
        self.speed_x = 3 
        player.score += 1 

      for n in range(-self.size, player.padHei): 
        if self.rect.y == player.y + n: 
          if self.rect.x <= player.x + player.padWid: 
            self.speed_x *= -1 
            break 
        n += 1 
      for n in range(-self.size, enemy.padHei): 
        if self.rect.y == enemy.y + n: 
          if self.rect.x >= enemy.x - enemy.padWid: 
            self.speed_x *= -1 
            break 

    def draw(self, screen): 
     pygame.draw.rect(screen, (255,255,255), (self.rect.x, self.rect.y, self.size, self.size)) 

class Block(pygame.sprite.Sprite): 
     image = pygame.Surface((20,20)) #image.load("brick.png") 


     def __init__(self): 
       pygame.sprite.Sprite.__init__(self) 
       self.rect = self.image.get_rect() 
       self.rect.x = 300 
       self.rect.y = 0 






def main(): 
    backgscale = pygame.transform.scale(backg,(SCR_WID, SCR_HEI)) 

    global player 
    player = Player("george") 

    global enemy 
    enemy = Player("frank") 

    block = Block() 
    got.add(block) 

    ball = Ball() 
    Call.add(ball) 

    while True: 

      for event in pygame.event.get(): 
        if event.type == pygame.QUIT: 
          print("Game exited by user") 
          exit() 

      screen.blit(backg,(0,0))     
      got.update() 
      Call.update() 
      backgscale = pygame.transform.scale(backg,(SCR_WID, SCR_HEI)) 
      got.draw(screen) 
      Call.draw(screen) 
      player.movement() 
      enemy.movement() 
      ball.movement() 

      player.draw() 
      player.scoring() 
      enemy.draw() 
      enemy.scoring() 





      pygame.display.flip() 
      clock.tick(FPS) 

if __name__ == "__main__": 
    main() 
関連する問題