окно пигмея не появляется - PullRequest
0 голосов
/ 18 января 2020

Итак, я добавил функцию меню в свой код, но с тех пор, как я ее добавил, окно Pygame не открывается, а pycharm (я использую softwarre) даже не отображает никаких ошибок. Не уверен почему? Спасибо. Подводя итог - после того, как я добавил меню в код, окно, в котором должна отображаться игра, перестало появляться

import pygame
import time

# initialize pygame and music player
pygame.mixer.pre_init(44100, - 16, 2, 4096)
pygame.init()

screen = pygame.display.set_mode((500, 480))  # set screen dimensions

pygame.display.set_caption("Star Keeper")  # state name for game

# set color values
black = (0, 0, 0)
white = (255, 255, 255)
red = (255, 0, 0)
dark_blue = (0, 0, 128)
dark_red = (128, 0, 0)
dark_pink = (139, 10, 80)

# create lists with images of character walking left and right
rightDirection = [pygame.image.load('R1.png'), pygame.image.load('R2.png'), pygame.image.load('R3.png'),
                  pygame.image.load('R4.png'), pygame.image.load('R5.png'), pygame.image.load('R6.png'),
                  pygame.image.load('R7.png'), pygame.image.load('R8.png'), pygame.image.load('R9.png')]
leftDirection = [pygame.image.load('L1.png'), pygame.image.load('L2.png'), pygame.image.load('L3.png'),
                 pygame.image.load('L4.png'), pygame.image.load('L5.png'), pygame.image.load('L6.png'),
                 pygame.image.load('L7.png'), pygame.image.load('L8.png'), pygame.image.load('L9.png')]
# import images
background = pygame.image.load('background.png')
backgroundX = 0
backgroundX2 = background.get_width()
homeScreen = pygame.image.load('home_screen.png')
obstacle = pygame.image.load('obstacle.png')
obstacleX = 0
obstacleX2 = obstacle.get_width()
instructions = pygame.image.load('instructions.png')

# frame rate
clock = pygame.time.Clock()

# background music

pygame.mixer.music.load("background_music.mp3")
pygame.mixer.music.set_volume(.5)
pygame.mixer.music.play(-1)



# create class for character (object)


font = pygame.font.Font(None, 75)  # font for home screen
instructionsFont = pygame.font.Font(None, 30)  # font for instructions page

# NEW!!! home screen

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)

RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600


# === CLASSES === (CamelCaseNames)


class player(object):
    def __init__(self, x, y, width, height):  # initialize attributes
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.left = True
        self.right = True
        self.isJump = False
        self.stepCount = 0
        self.jumpCount = 10
        self.standing = True

    def draw(self, screen):
        if self.stepCount + 1 >= 27:  # 9 sprites, with 3 frames - above 27 goes out of range
            self.stepCount = 0

        if not self.standing:
            if self.left:
                screen.blit(leftDirection[self.stepCount // 5], (self.x, self.y), )
                self.stepCount += 1
            elif self.right:
                screen.blit(rightDirection[self.stepCount // 5], (self.x, self.y), )
                self.stepCount += 1
        else:
            if self.right:
                screen.blit(rightDirection[0], (self.x, self.y))  # using index, include right faced photo
            else:
                screen.blit(leftDirection[0], (self.x, self.y))


# use procedure for game window rather than using it within loop
def redrawGameWindow():
    # background images for right to left moving screen
    screen.blit(background, (backgroundX, 0))
    screen.blit(background, (backgroundX2, 0))
    man.draw(screen)
    screen.blit(obstacle, (obstacleX, 400))
    screen.blit(obstacle, (obstacleX2, 400))
    pygame.display.update()



class enlargement(object):
    def __init__(self, x, y, radius, color, facing):
        self.x = x
        self.y = y
        self.radius = radius
        self.color = color
        self.facing = facing

    def draw(self, screen):
        pygame.draw.circle(screen, self.color, (self.x, self.y), self.radius, 1)


class page():

    def __init__(self, screen, config):

        self.screen = screen
        self.config = config

        self.screen_rect = screen.get_rect()

        self.clock = pygame.time.Clock()
        self.right = False

        self.widgets = []

        self.create_objects()

    def quit(self):

        pass

    # --- objects ---

    def create_objects(self):

        '''
        self.player = player()
        '''

        '''
        btn = Button(...)
        self.widgets.append(btn)
        '''

    # --- functions ---

    def handle_event(self, event):

        '''
        self.player.handle_event(event)
        '''

        '''
        for widget in self.widgets:
            widget.handle_event(event)
        '''

    def update(self, ):

        '''
        self.player.update()
        '''

        '''
        for widget in self.widgets:
            widget.update()
        '''

    def draw(self, surface):

        # surface.fill(BLACK)

        '''
        self.player.draw(surface)
        '''

        '''
        for widget in self.widgets:
            widget.draw(surface)
        '''

        # pygame.display.update()

    def exit(self):
        self.right = False

    # --- mainloop --- (don't change it)

    def mainloop(self):

        run = True
        while run:
            clock.tick(30)
            pygame.display.update()
            redrawGameWindow()  # call procedure

            backgroundX -= 1.4  # Move both background images back
            backgroundX2 -= 1.4
            obstacleX -= 1.4
            obstacleX2 -= 1.4

            if backgroundX < background.get_width() * -1:  # If our background is at the -width then reset its position
                backgroundX = background.get_width()

            if backgroundX2 < background.get_width() * -1:
                backgroundX2 = background.get_width()

            if obstacleX < obstacle.get_width() * -10:
                obstacleX = obstacle.get_width

            if obstacleX2 < obstacle.get_width() * -10:
                obstacleX2 = obstacle.get_width()

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    run = False
                    pygame.quit()
                    quit()

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    run = False
            keys = pygame.key.get_pressed()
            if keys[pygame.K_LEFT]:
                man.left = True
                man.right = False
                man.standing = False  # false, because man is walking
            # verify that character is within window parameters
            elif keys[pygame.K_RIGHT]:
                man.right = True
                man.left = False
                man.standing = False  # false, because man is walking
            else:
                man.standing = True
                man.stepCount = 0

            if not man.isJump:
                if keys[pygame.K_SPACE]:
                    man.isJump = True  # when jumping, man shouldn't move directly left or right
                    man.right = False
                    man.left = False
                    man.stepCount = 0
            else:
                if man.jumpCount >= -10:
                    neg = 1
                    if man.jumpCount < 0:
                        neg = -1
                    man.y -= (man.jumpCount ** 2) * .5 * neg  # to jump use parabola
                    man.jumpCount -= 1
                else:
                    man.isJump = False
                    man.jumpCount = 10

            for event in pygame.event.get():

                # --- global events ---

                if event.type == pygame.QUIT:
                    self.is_running = False
                elif event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_ESCAPE:
                        self.is_running = False

                # --- objects events ---

                self.handle_event(event)

            # --- updates ---

            self.update()

            # --- draws ---

            self.screen.fill(BLACK)

            self.draw(self.screen)

            pygame.display.update()

            # --- FPS ---

            self.clock.tick(25)

        # --- the end ---

        self.quit()


class Intropage(page):

    def create_objects(self):
        self.font = pygame.font.Font(None, 40)
        self.text = self.font.render("INTRO page (Press ESC or Click Mouse)", True, BLACK)
        self.text_rect = self.text.get_rect(center=self.screen_rect.center)

    def draw(self, surface):
        surface.fill(dark_pink)
        surface.blit(self.text, self.text_rect)

    def handle_event(self, event):
        # close on mouse click
        if event.type == pygame.MOUSEBUTTONDOWN:
            # self.is_running = False
            self.exit()


class Menupage(page):

    def create_objects(self):
        self.font = pygame.font.Font(None, 40)
        self.text = self.font.render("MENU page (Press ESC)", True, BLACK)
        self.text_rect = self.text.get_rect(center=self.screen_rect.center)
        self.text_rect.top = 10

        self.page_game = Gamepage(self.screen, self.config)
        self.page_options = Optionspage(self.screen, self.config)

        self.button1 = button_create("GAME", (300, 200, 200, 50), GREEN, BLUE, self.page_game.mainloop)
        self.button2 = button_create("OPTIONS", (300, 300, 200, 50), GREEN, BLUE, self.page_options.mainloop)
        self.button3 = button_create("EXIT", (300, 400, 200, 50), GREEN, BLUE, self.exit)

    def draw(self, surface):
        surface.fill(dark_pink)
        surface.blit(self.text, self.text_rect)

        button_draw(surface, self.button1)
        button_draw(surface, self.button2)
        button_draw(surface, self.button3)

    def handle_event(self, event):
        button_check(self.button1, event)
        button_check(self.button2, event)
        button_check(self.button3, event)


class Optionspage(page):

    def create_objects(self):
        self.font = pygame.font.Font(None, 40)
        self.text = self.font.render("OPTIONS page (Press ESC)", True, BLACK)
        self.text_rect = self.text.get_rect(center=self.screen_rect.center)

    def draw(self, surface):
        surface.fill(RED)
        surface.blit(self.text, self.text_rect)


class Exitpage(page):

    def create_objects(self):
        self.font = pygame.font.Font(None, 40)
        self.text = self.font.render("EXIT page (Press ESC or Click Mouse)", True, BLACK)
        self.text_rect = self.text.get_rect(center=self.screen_rect.center)

    def draw(self, surface):
        surface.fill(GREEN)
        surface.blit(self.text, self.text_rect)

    def handle_event(self, event):
        # close on mouse click
        if event.type == pygame.MOUSEBUTTONDOWN:
            # self.is_running = False
            self.exit()


class Gamepage(page):

    def create_objects(self):
        self.font = pygame.font.Font(None, 40)
        self.text = self.font.render("GAME page (Press ESC)", True, BLACK)
        self.text_rect = self.text.get_rect(center=self.screen_rect.center)

        self.player = player(self.screen, self.config)

    def draw(self, surface):
        surface.fill(BLUE)
        surface.blit(self.text, self.text_rect)
        self.player.draw(surface)

    def update(self):
        self.player.update()


# === FUNCTIONS === (lower_case_names)
# TODO: create class Button()

def button_create(text, rect, inactive_color, active_color, action):
    font = pygame.font.Font(None, 40)

    button_rect = pygame.Rect(rect)

    text = font.render(text, True, BLACK)
    text_rect = text.get_rect(center=button_rect.center)

    return [text, text_rect, button_rect, inactive_color, active_color, action, False]


def button_check(info, event):
    text, text_rect, rect, inactive_color, active_color, action, hover = info

    if event.type == pygame.MOUSEMOTION:
        # hover = True/False
        info[-1] = rect.collidepoint(event.pos)

    elif event.type == pygame.MOUSEBUTTONDOWN:
        if hover and action:
            action()


def button_draw(screen, info):
    text, text_rect, rect, inactive_color, active_color, action, hover = info

    if hover:
        color = active_color
    else:
        color = inactive_color

    pygame.draw.rect(screen, color, rect)
    screen.blit(text, text_rect)


# === MAIN === (lower_case_names)

class App():

    def __init__(self):
        pygame.init()

        screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))

        config = {}

        page = Intropage(screen, config)
        page.mainloop()

        page = Menupage(screen, config)
        page.mainloop()

        page = Exitpage(screen, config)
        page.mainloop()



    # def run(self):



###NEW UP


pygame.quit()
...