Pygame Sprites随机消失

时间:2013-10-11 16:50:14

标签: python pygame sprite

我做了这个游戏,它的工作原理!嗯,它偶尔会起作用。出于某些原因,有时候气体精灵或者红色精灵只会毫无理由地消失......

以下是代码:

"""
Player Car
"""

import pygame, random
pygame.init()

screen = pygame.display.set_mode((640, 480))

class RedCar(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("red.png")
        self.image = pygame.transform.scale(self.image,(50,75))
        self.rect = self.image.get_rect()

        if not pygame.mixer:
            print("problem with sound")
        else:
            pygame.mixer.init()
            self.sndYay = pygame.mixer.Sound("yay.ogg")
            self.sndThunder = pygame.mixer.Sound("thunder.ogg")

    def update(self):
        mousex, mousey = pygame.mouse.get_pos()
        self.rect.center = (mousex, 430)

class GasCan(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("gas.png")
        self.image = pygame.transform.scale(self.image,(50, 50))
        self.image = self.image.convert_alpha()
        self.rect = self.image.get_rect()
        self.reset()

        self.dy = 5

    def update(self):
        self.rect.centery += self.dy
        if self.rect.top > screen.get_height():
            self.reset()

    def reset(self):
        self.rect.top = 0
        self.rect.centerx = random.randrange(0, screen.get_width())

class YellowCar(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("yellow.png")
        self.image = pygame.transform.scale(self.image,(50, 75))
        self.rect = self.image.get_rect()

    def update(self):
        self.rect.centery += self.dy
        #self.rect.centery += random.randrange(5, 20)
        if self.rect.top > screen.get_height():
            self.reset()

    def reset(self):
        self.rect.bottom = 0
        self.rect.centerx = random.randrange(190, screen.get_width())
        self.dy = random.randrange(10, 30)

class Bush(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("bush.png")
        self.image = pygame.transform.scale(self.image,(50, 50))
        self.rect = self.image.get_rect()

    def update(self):
        self.rect.centery += 10
        if self.rect.top > screen.get_height():
            self.reset()

    def reset(self):
        self.rect.bottom = 0
        self.rect.centerx = random.randrange(0, 150)

class Road(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("road.png")
        #self.image = pygame.transform.scale(self.image,(640, 480))
        self.rect = self.image.get_rect()
        self.dy = 10
        self.reset()

    def update(self):
        self.rect.bottom += self.dy
        if self.rect.top >= 0:
            self.reset()

    def reset(self):
        self.rect.bottom = screen.get_height()

class Scoreboard(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.lives = 11
        self.score = 0
        self.level = 0
        self.font = pygame.font.SysFont("None", 50)

    def update(self):
        self.text = "Car: %d, score: %d, level: %d" % (self.lives, self.score, self.level)
        self.image = self.font.render(self.text, 1, (255, 255, 0))
        self.rect = self.image.get_rect()

def Game():
    pygame.display.set_caption("Car")

   # level =
    background = pygame.Surface(screen.get_size())
    background.fill((0, 0, 0))
    screen.blit(background, (0, 0))
    redCar = RedCar()
    gas = GasCan()
    yellowCar1 = YellowCar()
    yellowCar2 = YellowCar()
    yellowCar3 = YellowCar()
    yellowCar4 = YellowCar()
    yellowCar5 = YellowCar()
    bush1 = Bush()
    bush2 = Bush()
    bush3 = Bush()
    road = Road()
    scoreboard = Scoreboard()

    goodSprites = pygame.sprite.Group(gas, road, redCar)
    scoreSprite = pygame.sprite.Group(scoreboard)
    badSprites = pygame.sprite.Group(yellowCar1, yellowCar2, yellowCar3, yellowCar4, bush1, bush2, bush3)

    clock = pygame.time.Clock()
    keepGoing = True
    while keepGoing:
        clock.tick(30)
        pygame.mouse.set_visible(False)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                keepGoing = False

      #  if scoreboard.score < 500:
      #      badSprites = pygame.sprite.Group(yellowCar1, yellowCar2, yellowCar3, bush1)
      #      scoreboard.level = 1
      #  elif scoreboard.score < 1000:
      #      badSprites.add(yellowCar4)
      #      badSprites.add(bush2)
      #      scoreboard.level = 2
      #  elif scoreboard.score < 1500:
      #      badSprites.add(yellowCar5)
      #      badSprites.add(bush3)
      #      scoreboard.level = 3

        if redCar.rect.colliderect(gas.rect):
            redCar.sndYay.play()
            gas.reset()
            scoreboard.score += 100

        if scoreboard.score % 5 == 0:
            scoreboard.lives + 1

        hitCar = pygame.sprite.spritecollide(redCar, badSprites, False)

        if hitCar:
            redCar.sndThunder.play()
            scoreboard.lives -= 1
            if scoreboard.lives <= 0:
                keepGoing = False
            for theCar in hitCar:
                theCar.reset()

        goodSprites.clear(screen, background)
        badSprites.clear(screen, background)
        scoreSprite.clear(screen, background)

        goodSprites.update()
        badSprites.update()
        scoreSprite.update()

        goodSprites.draw(screen)
        badSprites.draw(screen)
        scoreSprite.draw(screen)

        pygame.display.flip()

    pygame.mouse.set_visible(True)
    return scoreboard.score

def instructions(score):
    redCar = RedCar()
    road = Road()

    allSprites = pygame.sprite.Group(road, redCar)
    insFont = pygame.font.SysFont(None, 30)

    instructions = (
    "Car Survival.     Last score: %d" % score ,
    "Instructions:  Drive your car,",
    "and avoid cars and bushes.",
    "",
    "Gain points by driving over the gas cans.",
    "",
    "good luck!",
    "",
    "click to start, escape to quit."
    )

    insLabels = []
    # Create a rendered list of instructions, ready for display
    for line in instructions:
        tempLabel = insFont.render(line, 1, (255, 0, 0))
        insLabels.append(tempLabel)

    keepGoing = True
    clock = pygame.time.Clock()
    pygame.mouse.set_visible(False)
    while keepGoing:
        clock.tick(30)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                keepGoing = False
                donePlaying = True

            # Check for a mouse click
            if event.type == pygame.MOUSEBUTTONDOWN:
                keepGoing = False
                donePlaying = False
            # .... or a quit
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    keepGoing = False
                    donePlaying = True

        allSprites.update()
        allSprites.draw(screen)

        # Display the instructions
        for i in range(len(insLabels)):
            screen.blit(insLabels[i], (50, 30*i))

        pygame.display.flip()

    pygame.mouse.set_visible(True)

    return donePlaying

def main():
    donePlaying = False
    score = 0
    while not donePlaying:
        donePlaying = instructions(score)
        if not donePlaying:
            score = Game()
    pygame.quit()

if __name__ == "__main__":
    main()

有时会出现redCar,但有时它不会出现。有人有任何线索吗?

0 个答案:

没有答案