簡體   English   中英

pygame.rect.colliderect()無法正常工作

[英]pygame.rect.colliderect() won't work

我需要手動檢查一個圖像是否碰到另一個。 我似乎無法獲得結果……請這讓我發瘋了!!! 我已經嘗試了2天,但無法正常工作。

我沒有包含其他一些代碼,例如Menu()。main(),但它工作得很好。 我不明白為什么僵屍在播放器上時它不會返回true。

class Game():

    def setup(self):
        global tiles
        for files in os.listdir(os.curdir):
            if files.endswith(".png") and files != "Player.png" and files != "Zombie.png":
                tilees.append(files)
                numtil = tilees.count(files)
                print("a " + str(numtil))

        fli = pygame.image.load(files).convert_alpha()

        i = 0

        while i <= 1000:
            tiles.append(fli)
            i = i + 1

        global TileLen
        TileLen = tiles.count(fli)

        Game().Game()

    def Game(self):
        global zomx, zomy, zombie, MMS, step, zombieRect
        zombieRect = []
        zomx = []
        zomy = []
        zombie = []
        step = 0
        HP = 15
        Map = pygame.image.load("BG.png").convert()
        Map = pygame.transform.scale(Map, (pygame.display.list_modes()[0]))

        person = pygame.image.load("Player.png").convert()
        person = pygame.transform.scale(person, (30, 30))

        dagger = pygame.image.load("Dagger.png").convert_alpha()
        dagger = pygame.transform.scale(dagger, (13, 13))

        screen.blit(Map, (0, 0))
        perx = 800
        pery = 700

        ai().zombieadd(MMS)

        screen.blit(person, (perx, pery))
        screen.blit(dagger, (perx+20, pery-5))

        global thething

        thething = 0
        for crap in zombie:

            screen.blit(zombie[thething], (zomx[thething], zomy[thething]))
            print(thething)
            thething = thething + 1

        pygame.display.flip()

        awesome = 1
        fttt = 0
        ff = 0
        ofx = 0
        ofy = 0

        while 1:
            print(perx, pery)
            for event in pygame.event.get():
                if event.type == QUIT:
                    pygame.quit()
                    sys.exit()
                elif event.type == KEYDOWN:
                    if event.key == K_w:
                        pery = pery - 5
                        if fttt != 1:
                            if awesome == 4:
                                dagger = pygame.transform.rotate(dagger, 270)
                                person = pygame.transform.rotate(person, 270)
                            elif awesome == 3:
                                dagger = pygame.transform.rotate(dagger, 90)
                                person = pygame.transform.rotate(person, 90)
                            elif awesome == 2:
                                dagger = pygame.transform.rotate(dagger, 180)
                                person = pygame.transform.rotate(person, 180)
                            person = pygame.transform.rotate(person, 0)
                            dagger = pygame.transform.rotate(dagger, 0)
                        awesome = 1
                        fttt = 1

                    elif event.key == K_s:
                        pery = pery + 5
                        if fttt != 2:
                            if awesome == 4:
                                dagger = pygame.transform.rotate(dagger, 270)
                                person = pygame.transform.rotate(person, 270)
                            elif awesome == 3:
                                dagger = pygame.transform.rotate(dagger, 90)
                                person = pygame.transform.rotate(person, 90)
                            person = pygame.transform.rotate(person, 180)
                            dagger = pygame.transform.rotate(dagger, 180)
                        awesome = 2
                        fttt = 2

                    elif event.key == K_a:
                        perx = perx - 5
                        if fttt != 3:
                            if awesome == 2:
                                dagger = pygame.transform.rotate(dagger, 180)
                                person = pygame.transform.rotate(person, 180)
                            elif awesome == 4:
                                dagger = pygame.transform.rotate(dagger, 270)
                                person = pygame.transform.rotate(person, 270)
                            person = pygame.transform.rotate(person, 270)
                            dagger = pygame.transform.rotate(dagger, 270)
                        awesome = 3
                        fttt = 3

                    elif event.key == K_d:
                        perx = perx + 5
                        if fttt != 4:
                            if awesome == 2:
                                dagger = pygame.transform.rotate(dagger, 180)
                                person = pygame.transform.rotate(person, 180)
                            elif awesome == 3:
                                dagger = pygame.transform.rotate(dagger, 90)
                                person = pygame.transform.rotate(person, 90)
                            person = pygame.transform.rotate(person, 90)
                            dagger = pygame.transform.rotate(dagger, 90)
                        awesome = 4
                        fttt = 4

                    elif event.key == K_e:
                        if awesome == 1:
                            while ofx >= -6:
                                ofx = ofx - 1
                                screen.blit(dagger, (perx+20, pery-5+ofx))
                                pygame.time.delay(1)
                                pygame.display.update()
                            if ofx <= -6:
                                ofx = 0
                        elif awesome == 2:
                            while ofx >= -6:
                                ofx = ofx - 1
                                screen.blit(dagger, (perx-5, pery+25-ofx))
                                pygame.time.delay(1)
                                pygame.display.update()
                            if ofx <= -6:
                                ofx = 0
                        if awesome == 3:
                            while ofx >= -6:
                                ofx = ofx - 1
                                screen.blit(dagger, (perx-5+ofx, pery-5))
                                pygame.time.delay(1)
                                pygame.display.update()
                            if ofx <= -6:
                                ofx = 0
                        if awesome == 4:
                            while ofx >= -6:
                                ofx = ofx - 1
                                screen.blit(dagger, (perx+20-ofx, pery+25))
                                pygame.time.delay(1)
                                pygame.display.update()
                            if ofx <= -6:
                                ofx = 0



            screen.blit(Map, (0, 0))
            screen.blit(person, (perx, pery))
            if awesome == 1:
                screen.blit(dagger, (perx+20, pery-5))
            elif awesome == 2:
                screen.blit(dagger, (perx-5, pery+25))
            elif awesome == 3:
                screen.blit(dagger, (perx-5, pery-5))
            else:
                screen.blit(dagger, (perx+20, pery+25))

            text = "Health: "+str(HP)
            font = pygame.font.Font(None, 32)
            ttex = font.render(text, True, (255, 0, 0))
            screen.blit(ttex, (30, 30))


            thecrap = 0
            while thecrap < thething:
                print(thecrap)
                screen.blit(zombie[thecrap], (zomx[thecrap], zomy[thecrap]))
                if perx >= zomx[thecrap]:
                    loop = 0
                    while loop <= 5:
                        zomx[thecrap] = zomx[thecrap] + .09
                        loop = loop + 1

                if pery >= zomy[thecrap]:
                    loop = 0
                    while loop <= 5:
                        zomy[thecrap] = zomy[thecrap] + .09
                        loop = loop + 1
                if perx <= zomx[thecrap]:
                    loop = 0
                    while loop <= 5:
                        zomx[thecrap] = zomx[thecrap] - .09
                        loop = loop + 1
                if pery <= zomy[thecrap]:
                    loop = 0
                    while loop <= 5:
                        zomy[thecrap] = zomy[thecrap] - .09
                        loop = loop + 1
                if person.get_rect().contains(pygame.Rect(zomx[thecrap], zomy[thecrap], 30, 30)):
                    HP = HP - .5
                thecrap = thecrap + 1
            thecrap = 0
            pygame.display.update()

            if HP <= 0:
                print("Game over! Sorry!")
                while 1:
                    abss = font.render("Sorry, but you lost! Press any key to continue...", True, (255, 255, 255))
                    pygame.display.update()
                    screen.blit(abss, (90, 90))

                    for event in pygame.event.get():
                        Menu().main()

class ai():

    def zombieadd(self, Num):
        global zomx, zomy, zombie, zombieRect
        zombieRect = []
        zombie = []
        global step

        step = 0
        print(Num)

        while Num > step:
            global zomx, zomy, zombie
            print(step)
            zomx.append(random.randint(0, 600))
            zomy.append(random.randint(0, 600))
            zombieI = pygame.image.load("Zombie.png").convert()
            zombie.append(zombieI)
            zombie[step] = pygame.transform.scale(zombie[step], (30, 30))
            print(zomx[step], zomy[step])
            zombieRect.append(zombie[step].get_rect())

            step = step + 1

        Num = 0

        return 0


Menu().main()

class Game():

    def setup(self):
        global tiles
        for files in os.listdir(os.curdir):
            if files.endswith(".png") and files != "Player.png" and files != "Zombie.png":
                tilees.append(files)
                numtil = tilees.count(files)
                print("a " + str(numtil))

        fli = pygame.image.load(files).convert_alpha()

        i = 0

        while i <= 1000:
            tiles.append(fli)
            i = i + 1

        global TileLen
        TileLen = tiles.count(fli)

        Game().Game()

    def Game(self):
        global zomx, zomy, zombie, MMS, step, zombieRect
        zombieRect = []
        zomx = []
        zomy = []
        zombie = []
        step = 0
        HP = 15
        Map = pygame.image.load("BG.png").convert()
        Map = pygame.transform.scale(Map, (pygame.display.list_modes()[0]))

        person = pygame.image.load("Player.png").convert()
        person = pygame.transform.scale(person, (30, 30))

        dagger = pygame.image.load("Dagger.png").convert_alpha()
        dagger = pygame.transform.scale(dagger, (13, 13))

        screen.blit(Map, (0, 0))
        perx = 800
        pery = 700

        ai().zombieadd(MMS)

        screen.blit(person, (perx, pery))
        screen.blit(dagger, (perx+20, pery-5))

        global thething

        thething = 0
        for crap in zombie:

            screen.blit(zombie[thething], (zomx[thething], zomy[thething]))
            print(thething)
            thething = thething + 1

        pygame.display.flip()

        awesome = 1
        fttt = 0
        ff = 0
        ofx = 0
        ofy = 0

        while 1:
            print(perx, pery)
            for event in pygame.event.get():
                if event.type == QUIT:
                    pygame.quit()
                    sys.exit()
                elif event.type == KEYDOWN:
                    if event.key == K_w:
                        pery = pery - 5
                        if fttt != 1:
                            if awesome == 4:
                                dagger = pygame.transform.rotate(dagger, 270)
                                person = pygame.transform.rotate(person, 270)
                            elif awesome == 3:
                                dagger = pygame.transform.rotate(dagger, 90)
                                person = pygame.transform.rotate(person, 90)
                            elif awesome == 2:
                                dagger = pygame.transform.rotate(dagger, 180)
                                person = pygame.transform.rotate(person, 180)
                            person = pygame.transform.rotate(person, 0)
                            dagger = pygame.transform.rotate(dagger, 0)
                        awesome = 1
                        fttt = 1

                    elif event.key == K_s:
                        pery = pery + 5
                        if fttt != 2:
                            if awesome == 4:
                                dagger = pygame.transform.rotate(dagger, 270)
                                person = pygame.transform.rotate(person, 270)
                            elif awesome == 3:
                                dagger = pygame.transform.rotate(dagger, 90)
                                person = pygame.transform.rotate(person, 90)
                            person = pygame.transform.rotate(person, 180)
                            dagger = pygame.transform.rotate(dagger, 180)
                        awesome = 2
                        fttt = 2

                    elif event.key == K_a:
                        perx = perx - 5
                        if fttt != 3:
                            if awesome == 2:
                                dagger = pygame.transform.rotate(dagger, 180)
                                person = pygame.transform.rotate(person, 180)
                            elif awesome == 4:
                                dagger = pygame.transform.rotate(dagger, 270)
                                person = pygame.transform.rotate(person, 270)
                            person = pygame.transform.rotate(person, 270)
                            dagger = pygame.transform.rotate(dagger, 270)
                        awesome = 3
                        fttt = 3

                    elif event.key == K_d:
                        perx = perx + 5
                        if fttt != 4:
                            if awesome == 2:
                                dagger = pygame.transform.rotate(dagger, 180)
                                person = pygame.transform.rotate(person, 180)
                            elif awesome == 3:
                                dagger = pygame.transform.rotate(dagger, 90)
                                person = pygame.transform.rotate(person, 90)
                            person = pygame.transform.rotate(person, 90)
                            dagger = pygame.transform.rotate(dagger, 90)
                        awesome = 4
                        fttt = 4

                    elif event.key == K_e:
                        if awesome == 1:
                            while ofx >= -6:
                                ofx = ofx - 1
                                screen.blit(dagger, (perx+20, pery-5+ofx))
                                pygame.time.delay(1)
                                pygame.display.update()
                            if ofx <= -6:
                                ofx = 0
                        elif awesome == 2:
                            while ofx >= -6:
                                ofx = ofx - 1
                                screen.blit(dagger, (perx-5, pery+25-ofx))
                                pygame.time.delay(1)
                                pygame.display.update()
                            if ofx <= -6:
                                ofx = 0
                        if awesome == 3:
                            while ofx >= -6:
                                ofx = ofx - 1
                                screen.blit(dagger, (perx-5+ofx, pery-5))
                                pygame.time.delay(1)
                                pygame.display.update()
                            if ofx <= -6:
                                ofx = 0
                        if awesome == 4:
                            while ofx >= -6:
                                ofx = ofx - 1
                                screen.blit(dagger, (perx+20-ofx, pery+25))
                                pygame.time.delay(1)
                                pygame.display.update()
                            if ofx <= -6:
                                ofx = 0



            screen.blit(Map, (0, 0))
            screen.blit(person, (perx, pery))
            if awesome == 1:
                screen.blit(dagger, (perx+20, pery-5))
            elif awesome == 2:
                screen.blit(dagger, (perx-5, pery+25))
            elif awesome == 3:
                screen.blit(dagger, (perx-5, pery-5))
            else:
                screen.blit(dagger, (perx+20, pery+25))

            text = "Health: "+str(HP)
            font = pygame.font.Font(None, 32)
            ttex = font.render(text, True, (255, 0, 0))
            screen.blit(ttex, (30, 30))


            thecrap = 0
            while thecrap < thething:
                print(thecrap)
                screen.blit(zombie[thecrap], (zomx[thecrap], zomy[thecrap]))
                if perx >= zomx[thecrap]:
                    loop = 0
                    while loop <= 5:
                        zomx[thecrap] = zomx[thecrap] + .09
                        loop = loop + 1

                if pery >= zomy[thecrap]:
                    loop = 0
                    while loop <= 5:
                        zomy[thecrap] = zomy[thecrap] + .09
                        loop = loop + 1
                if perx <= zomx[thecrap]:
                    loop = 0
                    while loop <= 5:
                        zomx[thecrap] = zomx[thecrap] - .09
                        loop = loop + 1
                if pery <= zomy[thecrap]:
                    loop = 0
                    while loop <= 5:
                        zomy[thecrap] = zomy[thecrap] - .09
                        loop = loop + 1
                if person.get_rect().contains(zombieRect)):
                    HP = HP - .5
                thecrap = thecrap + 1
            thecrap = 0
            pygame.display.update()

            if HP <= 0:
                print("Game over! Sorry!")
                while 1:
                    abss = font.render("Sorry, but you lost! Press any key to continue...", True, (255, 255, 255))
                    pygame.display.update()
                    screen.blit(abss, (90, 90))

                    for event in pygame.event.get():
                        Menu().main()

class ai():

    def zombieadd(self, Num):
        global zomx, zomy, zombie, zombieRect
        zombieRect = []
        zombie = []
        global step

        step = 0
        print(Num)

        while Num > step:
            global zomx, zomy, zombie
            print(step)
            zomx.append(random.randint(0, 600))
            zomy.append(random.randint(0, 600))
            zombieI = pygame.image.load("Zombie.png").convert()
            zombie.append(zombieI)
            zombie[step] = pygame.transform.scale(zombie[step], (30, 30))
            print(zomx[step], zomy[step])
            zombieRect.append(zombie[step].get_rect())

            step = step + 1

        Num = 0

        return 0


Menu().main()

您需要做很多事情。

PyGame的Sprite類針對各種游戲功能進行了優化,您似乎並沒有使用它。

但是,如果您只想處理Rect,則必須考慮要比較哪些Rect。 圖像是pygame.Surface對象-進行get_rect調用后,您將獲得它們的尺寸,但不一定是它們的坐標 從任何Surface對象的get_rect()調用返回的Rect的rect.x和rect.y分別為(0,0)。

幸運的是,get_rect()調用允許您傳遞參數。 因此,無論您使用什么方法來跟蹤角色的x和y坐標,都可以在get_rect()調用期間使用關鍵字將其pygame.Rectpygame.Rect對象,以正確反映其坐標。

例如-這不是直接基於您的代碼,因此如果在第一次通過時就炸毀了,那不是我的錯... :)

zombieRect = zombie_image.get_rect(topleft=(zombieX, zombieY))

...然后將其用於與Player rect或任何想要將其碰到的Rect進行比較-使用類似的get_rect(topleft=(x, y))技術-您可能會開始看到結果。

說了這么多,我強烈敦促您將事物與PyGame對象合並到類中。 如果我沒記錯的話,PyGame的大部分內容都是用C編寫的,如果我沒記錯的話,它的一部分是用FORTRAN和ASM編寫的(請不要讓我同時使用這兩個lang,我可能會記錯),所以只要將內容放在適當的類中,就可以會讓您的生活更輕松。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM