Мой мини-проект запускается только при закрытом окне - PullRequest
0 голосов
/ 08 февраля 2019

Я пишу мини-игру на Python для проекта колледжа.Это на ранней стадии, но у меня проблема с бегом.Когда я запускаю файл .py, появляется черное окно.Когда я нажимаю кнопку «X», чтобы закрыть окно, ТОЛЬКО ТОГДА мой фон появляется на секунду, а затем окно закрывается.В двух словах моя игра запускается только когда я закрываю окно.

import pygame
import matplotlib.pyplot as plt
import matplotlib.colors as colors
import numpy

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
BLUE = (50, 50, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
player_speed = 10


class Player(pygame.sprite.Sprite):
    change_x = 0
    change_y = 0

    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface([10, 10])
        self.image.fill(WHITE)
        self.rect = self.image.get_rect()
        self.rect.y = y
        self.rect.x = x
        self.change_x = 0
        self.change_y = 0
        #self.walls = None

    def changespeed(self, x, y):
        self.change_x += x
        self.change_y += y

    def move(self, walls):
        self.rect.x += self.change_x
        block_hit_list = pygame.sprite.spritecollide(self, walls, False)
        for block in block_hit_list:
            if self.change_x > 0:
                self.rect.right = block.rect.left
            else:
                self.rect.left = block.rect.right
        self.rect.y += self.change_y
        block_hit_list = pygame.sprite.spritecollide(self, walls, False)
        for block in block_hit_list:
            if self.change_y > 0:
                self.rect.bottom = block.rect.top
            else:
                self.rect.top = block.rect.bottom


class Wall(pygame.sprite.Sprite):
    def __init__(self, x, y, width, height):
        super().__init__()
        self.image = pygame.Surface([width, height])
        self.image.set_alpha(0)
        self.image.fill([255, 255, 255])
        self.rect = self.image.get_rect()
        self.rect.y = y
        self.rect.x = x


class Level(object):
    wall_list = None
    enemy_sprites = None

    def __init__(self):
        self.wall_list = pygame.sprite.Group()
        self.enemy_sprites = pygame.sprite.Group()


class Level1(Level):
    def __init__(self):
        super().__init__()
        walls = [........]                 
        for item in walls:
            wall = Wall(item[0], item[1], item[2], item[3])
            self.wall_list.add(wall)


class Level2(Level):
    def __init__(self):
        super().__init__()
        walls = [.....]
        for item in walls:
            wall = Wall(item[0], item[1], item[2], item[3])
            self.wall_list.add(wall)


def main():
    pygame.init()
    screen = pygame.display.set_mode([1000, 800])
    pygame.display.set_caption('GAME')
    player = Player(100, 100)
    movingsprites = pygame.sprite.Group()
    movingsprites.add(player)

    levels = []
    level = Level1()
    levels.append(level)
    level = Level2()
    levels.append(level)
    current_level_no = 0
    current_level = levels[current_level_no]

    clock = pygame.time.Clock()
    done = False

    while not done:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                done = True

            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    player.changespeed(-player_speed, 0)
                elif event.key == pygame.K_RIGHT:
                    player.changespeed(player_speed, 0)
                elif event.key == pygame.K_UP:
                    player.changespeed(0, -player_speed)
                elif event.key == pygame.K_DOWN:
                    player.changespeed(0, player_speed)

            elif event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT:
                    player.changespeed(player_speed, 0)
                elif event.key == pygame.K_RIGHT:
                    player.changespeed(-player_speed, 0)
                elif event.key == pygame.K_UP:
                    player.changespeed(0, player_speed)
                elif event.key == pygame.K_DOWN:
                    player.changespeed(0, -player_speed)

        player.move(current_level.wall_list)

    if player.rect.x > 900 and player.rect.y < 100:
        if current_level_no == 0:
            current_level_no = 1
            current_level = levels[current_level_no]
            player.rect.x = 50
            player.rect.y = 450
        elif current_level_no == 1:
            current_level_no = 2
            current_level = levels[current_level_no]
            player.rect.x = 790
        else:
            current_level_no = 0
            current_level = levels[current_level_no]
            player.rect.x = 790

    '''if player.rect.x > 1000:
        if current_level_no == 0:
            current_level_no = 1
            current_level = levels[current_level_no]
            player.rect.x = 0
        elif current_level_no == 1:
            current_level_no = 2
            current_level = levels[current_level_no]
            player.rect.x = 0
        else:
            current_level_no = 0
            current_level = levels[current_level_no]
            player.rect.x = 0'''

    if current_level_no == 0:
        background_image1 = pygame.image.load("level1background.jpg").convert()
        screen.blit(background_image1, [0, 0])
    else:
        background_image2 = pygame.image.load("level2background.jpg").convert()
        screen.blit(background_image2, [0, 0])

    movingsprites.draw(screen)
    current_level.wall_list.draw(screen)
    pygame.display.flip()
    clock.tick(60)


pygame.quit()
if __name__ == "__main__":
    main()

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Помимо синтаксических ошибок walls = [....], в основном проблема заключается в основном цикле.

Большая проблема заключается в том, что конец цикла while not done не включает последние два кодовых блока, посколькуошибки отступа.Весь код после строки if player.rect.x > 900 and player.rect.y < 100: не был частью цикла, потому что он был с отступом в 1 уровень слева.Исправление этого в основном исправило все.

def main():
    pygame.init()
    screen = pygame.display.set_mode([1000, 800])
    pygame.display.set_caption('GAME')
    player = Player(100, 100)
    movingsprites = pygame.sprite.Group()
    movingsprites.add(player)

    levels = []
    level = Level1()
    levels.append(level)
    level = Level2()
    levels.append(level)
    current_level_no = 0
    current_level = levels[current_level_no]
    background_image1 = pygame.image.load("level1background.jpg").convert()
    background_image2 = pygame.image.load("level2background.jpg").convert()

    clock = pygame.time.Clock()
    done = False

    while not done:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                done = True

            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    player.changespeed(-player_speed, 0)
                elif event.key == pygame.K_RIGHT:
                    player.changespeed(player_speed, 0)
                elif event.key == pygame.K_UP:
                    player.changespeed(0, -player_speed)
                elif event.key == pygame.K_DOWN:
                    player.changespeed(0, player_speed)

            elif event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT:
                    player.changespeed(player_speed, 0)
                elif event.key == pygame.K_RIGHT:
                    player.changespeed(-player_speed, 0)
                elif event.key == pygame.K_UP:
                    player.changespeed(0, player_speed)
                elif event.key == pygame.K_DOWN:
                    player.changespeed(0, -player_speed)

        player.move(current_level.wall_list)

        if player.rect.x > 900 and player.rect.y < 100:
            if current_level_no == 0:
                current_level_no = 1
                current_level = levels[current_level_no]
                player.rect.x = 50
                player.rect.y = 450
            elif current_level_no == 1:
                current_level_no = 2
                current_level = levels[current_level_no]
                player.rect.x = 790
            else:
                current_level_no = 0
                current_level = levels[current_level_no]
                player.rect.x = 790

        if current_level_no == 0:
            screen.blit(background_image1, [0, 0])
        else:
            screen.blit(background_image2, [0, 0])

        movingsprites.draw(screen)
        current_level.wall_list.draw(screen)
        pygame.display.update()
        pygame.display.flip()
        clock.tick(60)


if __name__ == "__main__":
    main()
    pygame.quit()

Также я переместил строку pygame.quit() в конец программы.

0 голосов
/ 13 февраля 2019

Спасибо всем.Я сожалею о большом ненужном коде, но я действительно не знаю, что было не так.

Я делаю свой код, вместо этого мое «while», НО: после того, как я помещаю команды в цикл while и выполняю командукод работает правильно, «игрок» движется очень медленно и «точка в точку».До этого «ход игрока» был очень нормальным и плавным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...