【问题标题】:Pygame how do I create duplicates of a sprite class then put them in a group?Pygame如何创建精灵类的副本然后将它们放在一个组中?
【发布时间】:2015-04-23 01:28:17
【问题描述】:

您好,我正在尝试随机生成 Pipes 类的副本,然后将它们显示到屏幕上。我设置了一个随机数生成器,它有 1/3 的机会得到 1。如果得到 1,我制作了另一个随机数生成器来选择 0 和 600(我的屏幕宽度)之间的一个数字作为 x 坐标的新精灵。然后我使用随机的 x 坐标和预定义的 y 坐标在屏幕上显示该精灵。

            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)

然后在我的游戏循环中,我调用了 Pipes 绘制函数,该函数随机生成新实例并绘制和更新 allPipes 组,但精灵的图像出现在屏幕上,但当新的出现时消失,这让我相信它实际上并不是每次都创建一个新的 Pipes 实例。有人可以帮忙吗?

            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)

【问题讨论】:

  • 请验证代码中的缩进是否正确,并删除代码中所有前导空格以使其更具可读性。如果这里的代码与您的代码完全一样,请查看:for sprite in allPipes: 之后的行不会在循环中执行,因为它没有缩进。
  • 在管道的更新方法中添加 new_instance(self.spanx) 但我认为您实际上并没有在任何地方定义 new_instance

标签: python class random pygame sprite


【解决方案1】:

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

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2022-11-13
    • 1970-01-01
    相关资源
    最近更新 更多