Pygame程序没有运行和sprite混乱

时间:2015-11-28 06:16:17

标签: python pygame collision

我正在尝试创建一个类似于“Bubble Trouble”的游戏,其中玩家会检测到从屏幕顶部掉落的蛋。我有几个问题。

  1. 无论我多少尝试绘制它们并让它们出现在y轴的某个点上,鸡蛋都不会出现在屏幕上
  2. 我不知道碰撞检测是否有效,因为
  3. 程序不会打开,没有错误消息。
  4. 请帮我找出解决这个问题的方法。我开始工作的时候非常兴奋,但经过几天的努力,我感到沮丧。提前谢谢。

    代码:

    import pygame, random
    import Tkinter
    from pygame.locals import *
    
    # CONSTANTS
    WWD = 1280  # Window width
    WHT = 720  # Window height
    BLACK =       (0,0,0) # Colors
    WHITE = (255,255,255)
    BACK = BLACK  # Background Color
    FORE = WHITE  # Foreground Color
    INT  = 40 # Time interval for game and key repeat
    BG = pygame.image.load("barn.png")
    BG = pygame.transform.scale(BG, (1280, 720))
    
    
    pygame.init()
    pygame.key.set_repeat(INT,INT) # pygame.init disables keyboard repetition. This reenables it with a delay and rep interval
    
    class Label:
        def __init__(self,surf,cx,cy,fsize,strng,fcolor,bcolor):
            self.screen = surf
            self.fc = fcolor
            self.bc = bcolor
            self.font = pygame.font.SysFont(None,fsize)
            self.cx = cx
            self.cy = cy
            self.str = strng
            self.vis = False # tells if the label is visible
    
        def draw(self):
            self.text = self.font.render(self.str,True,self.fc,self.bc)
            self.rect = self.text.get_rect()
            self.rect.centerx = self.cx
            self.rect.centery = self.cy
            self.screen.blit(self.text,self.rect)
            pygame.display.update([self.rect])
            self.vis = True
    
        def undraw(self):
            self.text.fill(self.bc)
            self.screen.blit(self.text,self.rect)
            pygame.display.update([self.rect])
            self.vis = False
    
    
    def OpeningScreen(Scr):
        Scr.blit(BG, (0, 0))
        pygame.display.update()
        L1 = Label(Display,WWD//2,WHT*3//8,WHT*3//50,"Use Arrow Keys to Begin",WHITE,BLACK)      #Creating the menus
        L1.draw()
        L2 = Label(Display,WWD//2,WHT*4//8,WHT*3//50,"Hit Q to Quit Anytime",WHITE,BLACK)        #Second menu option
        L2.draw()
    
    class Player:
    
        def __init__(self,Scr,cx,cy,speed,bcolor):
            self.screen = Scr
            self.surf = pygame.image.load('player.png').convert_alpha()
            self.surf = pygame.transform.scale(self.surf, (160, 200)).convert_alpha()
            self.rect = self.surf.get_rect()
            self.rect.centerx = cx
            self.rect.y = 510
            self.speed = 30
            self.bc = bcolor
    
        def draw(self):
            self.screen.blit(self.surf,self.rect).convert_alpha()
            pygame.display.update([self.rect])
    
        def undraw(self):
            surf = self.surf.copy()
            surf.fill(self.bc)
            self.screen.blit(surf,self.rect)
            pygame.display.update([self.rect])
    
        def move(self,mv):
            self.undraw()
            if mv == 'd' and self.rect.bottom < WHT:
                self.rect.top += self.speed
            if mv == 'u' and self.rect.top > 0:
                self.rect.top -= self.speed
            if mv == 'l' and self.rect.left > 0:
                self.rect.left -= self.speed
            if mv == 'r' and self.rect.right < WWD:
                self.rect.right += self.speed
            self.draw()
            pygame.display.update()
    
        def jump(self,top,left):
            self.undraw()
            self.rect.top = top
            self.rect.left = left
            self.draw()
            pygame.display.update()
    
    class EggDrop:
    
        def __init__(self,Scr):
    
            pygame.display.update()
            pygame.mixer.music.load('background.mid')
            pygame.mixer.music.play(-1,0.0)
            self.Mplay = True
            self.Player = Player(Scr,WWD//2,WHT//2,6,BLACK)
            Scr.blit(BG, (0, 0))
            self.Scr = Scr
    
        def toggleMusic(self):
            self.Mplay = not self.Mplay
            if self.Mplay:
                pygame.mixer.music.play(-1,0.0)
            else:
                pygame.mixer.music.stop()
    
        def togglePlayer(self):
            if self.Pvis:
                self.Player.undraw()
            else:
                self.Player.draw()
            self.Pvis = not self.Pvis
    
    def hatchGif(self):
        #files in order animated
        files = ["pics\hatch1.gif", "pics\hatch2.gif", "pics\hatch2.gif", "pics\hatch3.gif", "pics\hatch4.gif", "pics\hatch5.gif", "pics\hatch6.gif", "pics\hatch7.gif", "pics\hatch8.gif", "pics\hatch9.gif", "pics\hatch10.gif", "pics\hatch11.gif", "pics\hatch12.gif", "pics\hatch13.gif"]
        photos = [Tkinter.PhotoImage(file=x) for x in files]
        label = Tkinter.Label()
        label.photos = photos
        label.counter = 0
        def next_pic():
            label['image'] = label.photos[label.counter%len(label.photos)]
            label.after(25, next_pic) #25 = speed of animation
            label.counter += 1
        label.pack()
        next_pic()
    
    def splatGif(self):
        files = ["pics\splat1.gif", "pics\splat2.gif", "pics\splat2.gif", "pics\splat3.gif", "pics\splat4.gif", "pics\splat5.gif", "pics\splat6.gif", "pics\splat7.gif", "pics\splat8.gif"]
        photos = [Tkinter.PhotoImage(file=x) for x in files]
        label = Tkinter.Label()
        label.photos = photos
        label.counter = 0
        def next_pic():
            label['image'] = label.photos[label.counter%len(label.photos)]
            label.after(40, next_pic) #25 = speed of animation
            label.counter += 1
        label.pack()
        next_pic()
    
    def eggs(self):
        while self.Player.draw():
            self.eggsImage = pygame.image.load('hatch1.gif')
            self.eggsImage = pygame.transform.scale(self.eggsImage, (30, 40))
            self.screen.blit(self.eggsImage)
            pygame.display.update([self.eggsImage])
            self.eggsImage.centerx = cx
            self.eggsImage.y = 300
            self.speed = 30
    
    def detectCollisions(x1,y1,w1,h1,x2,y2,w2,h2):
        if (x2+w2>=x1>=x2 and y2+h2>=y1>=y2):
            return True
        elif (x2+w2>=x1+w1>=x2 and y2+h2>=y1>=y2):
            return True
        elif (x2+w2>=x1>=x2 and y2+h2>=y1+h1>=y2):
            return True
        elif (x2+w2>=x1+w1>=x2 and y2+h2>=y1+h1>=y2):
            return True
        else:
            return False
    
    class Sprite:
        def __init__(self,x,y,width,height):
            self.x=x
            self.y=y
            self.width=width
            self.height=height
    
        def render(self,collision):
            if (collision==True):
                hatchGif()
            else:
                pass
    
    Sprite1=Player
    Sprite2=eggs
    
    moveX,moveY=0,0
    
    gameLoop=True
    while gameLoop:
        STOP = False
        while not STOP:
            for event in pygame.event.get():
                if event.type==pygame.QUIT:
                    gameLoop=False
                    STOP = True
                if event.type==pygame.KEYDOWN:
                    if event.key==pygame.K_LEFT or event.key == ord('a'):
                        moveX = -4
                    if event.key==pygame.K_RIGHT or event.key == ord('d'):
                        moveX = 4
                    if event.key== K_SPACE:
                        detectCollisions()
                if event.type==pygame.KEYUP:
                    if event.key == ord('q'):
                        STOP = True
                    if event.key == K_ESCAPE:
                        STOP = True
                    if event.key == ord('x'):
                        top = random.randint(0, WHT - self.Player.rect.height)
                        left = random.randint(0, WWD - self.Player.rect.width)
                        self.Player.jump(top,left)
                    if event.key == ord('m'):
                        self.toggleMusic()
        pygame.mixer.music.stop()
        Sprite1.x+=moveX
        Sprite1.y+=moveY
        collisions=detectCollisions(Sprite1.x,Sprite1.y,Sprite1.width,Sprite1.height,Sprite2.x,Sprite2.y,Sprite2.width,Sprite2.height)
        Sprite1.render(collisions)
        Sprite2.render(False)
        pygame.display.flip()
    
    Display = pygame.display.set_mode((WWD,WHT),0,0)
    pygame.display.set_caption('Incubator 3000 V.1')
    
    
    OpeningScreen(Display)
    
    g = EggDrop(Display)
    g.run()
    
    pygame.quit()
    

0 个答案:

没有答案