2015-04-23 77 views
1

你好,我试图随机产生我的Pipes类的副本,然后将它们显示到屏幕上。我设置了一个随机数生成器,有1/3的机会得到1,如果它得到1,我让另一个随机数生成器选择一个0到600之间的数字(我的屏幕宽度)作为x坐标新的精灵。然后使用随机x坐标和预定义的y坐标将该精灵显示到屏幕上。Pygame如何创建Sprite类的重复项然后将它们放入组中?

  class Pipes(pygame.sprite.Sprite): 
        def __init__(self, x): 
          pygame.sprite.Sprite.__init__(self) 
          self.img = pygame.image.load('C:\\Users\\Ben\\Documents\\sprite.png').convert() 
          self.imx = 0 
          self.imgy = 375 
          self.setDisplay = pygame.display.get_surface() 

        def playerRect(self): 
          self.x = self.imgx 
          self.y = self.imgy 
          self.rect = pygame.draw.rect(setDisplay, pygame.Color(0, 0, 255), pygame.Rect(self.x, self.y, 32, 32)) 

        def draw(self): 
          self.setDisplay.blit(self.img) 
        def update(self): 
         self.spawn = random.randint(0, 3) 
         if self.spawn == 1: 
          self.spawnx = random.randint(0, 600) 
          setDisplay.blit(self.img, [self.spawnx, 375]) 
          allPipes.add(new_instance(self.spawnx)) 

然后我制作了一组叫做allPipes的小精灵,它们将容纳Pipe的新实例并为Pipe构造一个构造函数。

  allPipes = pygame.sprite.Group() 
      pipe = Pipes(0) 

然后在我的gameloop我叫管道画出函数随机派生的新实例,并绘制和更新allPipes组,但对于精灵的图像出现在屏幕上,但随后当新的出现,这使得dissapear我相信它实际上并不是每次都会制作一个新的Pipes实例。可以somone请帮忙吗?

  def gameLoop(): 



       imgx = 10 
       imgy = 10 
       lead_x_change = 0 
       lead_y_change = 0 
       move_variable = 100 
       jumpcounter = 0 


       while True: 





        for event in pygame.event.get(): 
         #print (event) 

         if event.type == QUIT: 
          pygame.quit() 
          sys.exit() 


         elif event.type == timer_event: 
           trail 
           allPipes = pygame.sprite.RenderPlain(()) 
           player.playerRect() 
           #setDisplay.blit(background.img, [0, 0]) 
           setDisplay.blit(background.img2, [0, 0]) 
           setDisplay.blit(player.img, [player.imgx, player.imgy]) 
           #setDisplay.blit(background.img, [0, 0]) 
           setDisplay.blit(ground.img, [ground.imgx, ground.imgy]) 
           pipe.update() 
           allPipes.draw(setDisplay) 
           for sprite in allPipes: 
           sprite.update() 

这是全码:

  import pygame 
      import sys 
      from pygame.locals import * 
      import random 
      #creates a clock to count framerate 
      clock = pygame.time.Clock() 
      #starts the program 
      pygame.init() 
      isFalling = True 
      allPipes = pygame.sprite.Group() 

      #creates a window of 800x600 
      setDisplay = pygame.display.set_mode((800, 600)) 
      pygame.display.set_caption('Menu') 
      #loads image for sprite 
      img = pygame.image.load('C:\\Users\\Ben\\Documents\\sprite.png') 
      allPipes = pygame.sprite.Group() 

      #player class 
      class Player(pygame.sprite.Sprite): 
        def __init__(self): 
          pygame.sprite.Sprite.__init__(self) 
          self.img = pygame.image.load('C:\\Users\\Ben\\Documents\\sprite.png').convert() 
          self.imgx = 0 
          self.imgy = 375 
          self.setDisplay = pygame.display.get_surface() 

        def playerRect(self): 
          self.x = self.imgx 
          self.y = self.imgy 
          self.rect = pygame.draw.rect(setDisplay, pygame.Color(0, 0, 255), pygame.Rect(self.x, self.y, 32, 32)) 

        def draw(self): 
          self.setDisplay.blit(self.img) 

        def load(self, filename): 
          self.img = pygame.image.load('C:\\Users\\Ben\\Documents\\sprite.png').convert_alpha()    


      class Trail(pygame.sprite.Sprite): 
        def __init__(self): 
          pygame.sprite.Sprite.__init__(self) 
          self.x = player.imgx - 1 
          self.y = player.imgy - 1 
          self.rect = pygame.draw.rect(setDisplay, pygame.Color(0, 0, 255), pygame.Rect(self.x, self.y, 10, 10)) 

          self.setDisplay = pygame.display.get_surface() 
        def trailrect(self): 
          self.x = player.imgx - 1 
          self.y = player.imgy - 1 
          self.rect = pygame.draw.rect(setDisplay, pygame.Color(0, 0, 255), pygame.Rect(self.x, self.y, 10, 10)) 
        def draw(self): 
          self.setDisplay.blit(self.img) 
          trail.trailrect() 


      class Background(pygame.sprite.Sprite): 
        def __init__(self): 
          pygame.sprite.Sprite.__init__(self) 
          self.img = pygame.image.load('C:\\Users\\Ben\\Documents\\background.png').convert() 
          self.img2 = pygame.image.load('C:\\Users\\Ben\\Documents\\trees1.png').convert() 
          self.treesx = 0 
          self.treesy = 70 
          self.treesrect = pygame.draw.rect(setDisplay, pygame.Color(0, 0, 255),pygame.Rect(self.treesx, self.treesy, 376, 100)) 
        def draw(self): 
          self.setDisplay.blit(self.img) 
          self.setDisplay.blit(self.img2) 

        def load(self, filename): 
          self.img = pygame.image.load('C:\\Users\\Ben\\Documents\\background.png').convert_alpha() 
          self.img2 = pygame.image.load('C:\\Users\\Ben\\Documents\\trees1.png').convert_alpha() 
      class Ground(pygame.sprite.Sprite): 
        def __init__(self): 
          pygame.sprite.Sprite.__init__(self) 
          self.img = pygame.image.load('C:\\Users\\Ben\\Documents\\ground.png').convert() 
          self.imgx = 0 
          self.imgy = 400 
          self.setDisplay = pygame.display.get_surface() 
          self.x = self.imgx 
          self.y = self.imgy 
          self.rect = pygame.draw.rect(setDisplay, pygame.Color(0, 0, 255), pygame.Rect(self.x, self.y, 800, 200)) 

        def draw(self): 
          self.setDisplay.blit(self.img) 

        def load(self, filename): 
          self.img = pygame.image.load('C:\\Users\\Ben\\Documents\\sprite.png').convert_alpha()    
      class Pipes(pygame.sprite.Sprite): 
        def __init__(self, x): 
          pygame.sprite.Sprite.__init__(self) 
          self.img = pygame.image.load('C:\\Users\\Ben\\Documents\\sprite.png').convert() 
          self.imx = 0 
          self.imgy = 375 
          self.setDisplay = pygame.display.get_surface() 

        def playerRect(self): 
          self.x = self.imgx 
          self.y = self.imgy 
          self.rect = pygame.draw.rect(setDisplay, pygame.Color(0, 0, 255), pygame.Rect(self.x, self.y, 32, 32)) 

        def draw(self): 
          self.setDisplay.blit(self.img) 
        def update(self): 
         self.spawn = random.randint(0, 3) 
         if self.spawn == 1: 
          self.spawnx = random.randint(0, 600) 
          setDisplay.blit(self.img, [self.spawnx, 375]) 
          allPipes.add(new_instance(self.spawnx)) 

      player = Player()    
      background = Background() 
      ground = Ground() 
      trail = Trail() 
      timer_event = pygame.USEREVENT + 1 
      pygame.time.set_timer(timer_event, 250) 
      trail.trailrect() 
      pipe = Pipes(0) 
      def gameLoop(): 



       imgx = 10 
       imgy = 10 
       lead_x_change = 0 
       lead_y_change = 0 
       move_variable = 100 
       jumpcounter = 0 


       while True: 





        for event in pygame.event.get(): 
         #print (event) 

         if event.type == QUIT: 
          pygame.quit() 
          sys.exit() 


         elif event.type == timer_event: 
           trail 
           allPipes = pygame.sprite.RenderPlain(()) 
           player.playerRect() 
           #setDisplay.blit(background.img, [0, 0]) 
           setDisplay.blit(background.img2, [0, 0]) 
           setDisplay.blit(player.img, [player.imgx, player.imgy]) 
           #setDisplay.blit(background.img, [0, 0]) 
           setDisplay.blit(ground.img, [ground.imgx, ground.imgy]) 
           pipe.update() 
           allPipes.draw(setDisplay) 
           for sprite in allPipes: 
           sprite.update() 






           #rect = pygame.draw.rect(setDisplay, pygame.Color(0, 0, 255), pygame.Rect(player.x, player.y, 32, 32)) 
           player.imgy += 30 


           isFalling = False 
           groundColliding = False 
           if isFalling == True: 
             player.imgy += 0 

           if player.rect.colliderect(ground.rect): 
               print("collided") 
               isFalling = False 
               groundColliding = True 
               player.imgy = 370 
               jumpcounter = 0 











           if player.rect.colliderect(background.treesrect): 
             print("c") 



           keys = pygame.key.get_pressed() 
           if keys[K_LEFT]: 
            player.imgx -= 20 
           if keys[K_RIGHT]: 
            player.imgx += 20 
           if keys[K_UP]: 
            if jumpcounter < 2: 
              player.imgy -= 50 
              isFalling = True 
              jumpcounter += 1 








           print(player.x, player.y) 
           print (isFalling, groundColliding) 
        pygame.display.flip() 
        #pygame.display.update() 
        clock.tick(70) 

      gameLoop() 
      #start (0, 71) 
      #length (376, 71) 
      #width (0, 168) 
+0

请确认您的代码的缩进是正确的,并删除在代码中所有前导空格,以使其更具可读性。如果这里的代码和你的代码完全一样,那么看看下面的代码:'for sprite in allPipes:'之后的行不在循环中执行,因为它没有缩进。 – Mailerdaimon

+0

在Pipes的更新方法中添加'new_instance(self.spanx)',但我不认为你实际上在任何地方定义了new_instance –

回答

0

有很多缩进错误。 试试这个:

import pygame 
import sys 
from pygame.locals import * 
import random 
#creates a clock to count framerate 
clock = pygame.time.Clock() 
#starts the program 
pygame.init() 
isFalling = True 
allPipes = pygame.sprite.Group() 

#creates a window of 800x600 
setDisplay = pygame.display.set_mode((800, 600)) 
pygame.display.set_caption('Menu') 
#loads image for sprite 
img = pygame.image.load('C:\\Users\\Ben\\Documents\\sprite.png') 
allPipes = pygame.sprite.Group() 

#player class 
class Player(pygame.sprite.Sprite): 
     def __init__(self): 
       pygame.sprite.Sprite.__init__(self) 
       self.img = pygame.image.load('C:\\Users\\Ben\\Documents\\sprite.png').convert() 
       self.imgx = 0 
       self.imgy = 375 
       self.setDisplay = pygame.display.get_surface() 

     def playerRect(self): 
       self.x = self.imgx 
       self.y = self.imgy 
       self.rect = pygame.draw.rect(setDisplay, pygame.Color(0, 0, 255), pygame.Rect(self.x, self.y, 32, 32)) 

     def draw(self): 
       self.setDisplay.blit(self.img) 

     def load(self, filename): 
       self.img = pygame.image.load('C:\\Users\\Ben\\Documents\\sprite.png').convert_alpha()    


class Trail(pygame.sprite.Sprite): 
     def __init__(self): 
       pygame.sprite.Sprite.__init__(self) 
       self.x = player.imgx - 1 
       self.y = player.imgy - 1 
       self.rect = pygame.draw.rect(setDisplay, pygame.Color(0, 0, 255), pygame.Rect(self.x, self.y, 10, 10)) 

       self.setDisplay = pygame.display.get_surface() 
     def trailrect(self): 
       self.x = player.imgx - 1 
       self.y = player.imgy - 1 
       self.rect = pygame.draw.rect(setDisplay, pygame.Color(0, 0, 255), pygame.Rect(self.x, self.y, 10, 10)) 
     def draw(self): 
       self.setDisplay.blit(self.img) 
       trail.trailrect() 


class Background(pygame.sprite.Sprite): 
     def __init__(self): 
       pygame.sprite.Sprite.__init__(self) 
       self.img = pygame.image.load('C:\\Users\\Ben\\Documents\\background.png').convert() 
       self.img2 = pygame.image.load('C:\\Users\\Ben\\Documents\\trees1.png').convert() 
       self.treesx = 0 
       self.treesy = 70 
       self.treesrect = pygame.draw.rect(setDisplay, pygame.Color(0, 0, 255),pygame.Rect(self.treesx, self.treesy, 376, 100)) 
     def draw(self): 
       self.setDisplay.blit(self.img) 
       self.setDisplay.blit(self.img2) 

     def load(self, filename): 
       self.img = pygame.image.load('C:\\Users\\Ben\\Documents\\background.png').convert_alpha() 
       self.img2 = pygame.image.load('C:\\Users\\Ben\\Documents\\trees1.png').convert_alpha() 
class Ground(pygame.sprite.Sprite): 
     def __init__(self): 
       pygame.sprite.Sprite.__init__(self) 
       self.img = pygame.image.load('C:\\Users\\Ben\\Documents\\ground.png').convert() 
       self.imgx = 0 
       self.imgy = 400 
       self.setDisplay = pygame.display.get_surface() 
       self.x = self.imgx 
       self.y = self.imgy 
       self.rect = pygame.draw.rect(setDisplay, pygame.Color(0, 0, 255), pygame.Rect(self.x, self.y, 800, 200)) 

     def draw(self): 
       self.setDisplay.blit(self.img) 

     def load(self, filename): 
       self.img = pygame.image.load('C:\\Users\\Ben\\Documents\\sprite.png').convert_alpha()    
class Pipes(pygame.sprite.Sprite): 
     def __init__(self, x): 
       pygame.sprite.Sprite.__init__(self) 
       self.img = pygame.image.load('C:\\Users\\Ben\\Documents\\sprite.png').convert() 
       self.imx = 0 
       self.imgy = 375 
       self.setDisplay = pygame.display.get_surface() 

     def playerRect(self): 
       self.x = self.imgx 
       self.y = self.imgy 
       self.rect = pygame.draw.rect(setDisplay, pygame.Color(0, 0, 255), pygame.Rect(self.x, self.y, 32, 32)) 

     def draw(self): 
       self.setDisplay.blit(self.img) 
     def update(self): 
      self.spawn = random.randint(0, 3) 
      if self.spawn == 1: 
       self.spawnx = random.randint(0, 600) 
       setDisplay.blit(self.img, [self.spawnx, 375]) 
       allPipes.add(new_instance(self.spawnx)) 

player = Player()    
background = Background() 
ground = Ground() 
trail = Trail() 
timer_event = pygame.USEREVENT + 1 
pygame.time.set_timer(timer_event, 250) 
trail.trailrect() 
pipe = Pipes(0) 
def gameLoop(): 



    imgx = 10 
    imgy = 10 
    lead_x_change = 0 
    lead_y_change = 0 
    move_variable = 100 
    jumpcounter = 0 


    while True: 





     for event in pygame.event.get(): 
      #print (event) 

      if event.type == QUIT: 
       pygame.quit() 
       sys.exit() 


      elif event.type == timer_event: 
        trail 
        allPipes = pygame.sprite.RenderPlain(()) 
        player.playerRect() 
        #setDisplay.blit(background.img, [0, 0]) 
        setDisplay.blit(background.img2, [0, 0]) 
        setDisplay.blit(player.img, [player.imgx, player.imgy]) 
        #setDisplay.blit(background.img, [0, 0]) 
        setDisplay.blit(ground.img, [ground.imgx, ground.imgy]) 
        pipe.update() 
        allPipes.draw(setDisplay) 
        for sprite in allPipes: 
         sprite.update() 






        #rect = pygame.draw.rect(setDisplay, pygame.Color(0, 0, 255), pygame.Rect(player.x, player.y, 32, 32)) 
        player.imgy += 30 


        isFalling = False 
        groundColliding = False 
        if isFalling == True: 
          player.imgy += 0 

        if player.rect.colliderect(ground.rect): 
            print("collided") 
            isFalling = False 
            groundColliding = True 
            player.imgy = 370 
            jumpcounter = 0 











        if player.rect.colliderect(background.treesrect): 
          print("c") 



        keys = pygame.key.get_pressed() 
        if keys[K_LEFT]: 
         player.imgx -= 20 
        if keys[K_RIGHT]: 
         player.imgx += 20 
        if keys[K_UP]: 
         if jumpcounter < 2: 
           player.imgy -= 50 
           isFalling = True 
           jumpcounter += 1 








        print(player.x, player.y) 
        print (isFalling, groundColliding) 
     pygame.display.flip() 
     #pygame.display.update() 
     clock.tick(70) 

gameLoop() 
#start (0, 71) 
#length (376, 71) 
#width (0, 168) 
相关问题