Проблема с игрой поверх экрана для игры Python с Pygame

У меня есть другое решение: это решение отлично работает, когда у вас есть только контент, который вы хотите показать при входе в систему. Определите правило, в котором вы проверяете, если вы вошли в систему, а не путь к белым спискам.

$urlRouterProvider.rule(function ($injector, $location) {
   var UserService = $injector.get('UserService');
   var path = $location.path(), normalized = path.toLowerCase();

   if (!UserService.isLoggedIn() && path.indexOf('login') === -1) {
     $location.path('/login/signin');
   }
});

В моем примере я спрашиваю, не входит ли я в систему, а текущий маршрут, который я хочу использовать, не является частью `/ login ', потому что мои маршруты в белом списке следующие

/login/signup // registering new user
/login/signin // login to app

, поэтому у меня есть мгновенный доступ к этим двум маршрутам, и каждый другой маршрут будет проверяться, если вы в сети.

Вот мой весь файл маршрутизации для модуля входа в систему

export default (
  $stateProvider,
  $locationProvider,
  $urlRouterProvider
) => {

  $stateProvider.state('login', {
    parent: 'app',
    url: '/login',
    abstract: true,
    template: '<ui-view></ui-view>'
  })

  $stateProvider.state('signin', {
    parent: 'login',
    url: '/signin',
    template: '<login-signin-directive></login-signin-directive>'
  });

  $stateProvider.state('lock', {
    parent: 'login',
    url: '/lock',
    template: '<login-lock-directive></login-lock-directive>'
  });

  $stateProvider.state('signup', {
    parent: 'login',
    url: '/signup',
    template: '<login-signup-directive></login-signup-directive>'
  });

  $urlRouterProvider.rule(function ($injector, $location) {
    var UserService = $injector.get('UserService');
    var path = $location.path();

    if (!UserService.isLoggedIn() && path.indexOf('login') === -1) {
         $location.path('/login/signin');
    }
  });

  $urlRouterProvider.otherwise('/error/not-found');
}

() => { /* code */ } является синтаксисом ES6, используйте вместо этого function() { /* code */ }

1
задан Naruto Abidal 30 March 2019 в 22:17
поделиться

2 ответа

Вам нужно поместить основной цикл в другой цикл, чтобы он снова запускался после выполнения функции game_over:

# main loop
while True:
    run = True
    while run:
        main()

    game_over()

Поскольку pygame.quit() не выходит из программы, вам потребуется вместо этого, чтобы обе петли были while run: и имели две run = True с, или использовали sys.exit(0) или raise SystemExit(0) после pygame.quit().

Вы также должны удалить return run из цикла for в функции game_over().

0
ответ дан wizzwizz4 30 March 2019 в 22:17
поделиться

У вас есть 2 функции main() и game_over(), каждая из которых имеет свой собственный цикл обработки событий и выполняет собственный рисунок.
Создайте 2 переменные состояния. Первое состояние (run) указывает на необходимость продолжения или прекращения игры.
Второе состояние gameover указывает, находится ли игра в состоянии «игра окончена» или «игра запущена».
В зависимости от состояния gameover, либо main(), либо game_over() должны вызываться непрерывно в главном цикле. Обе функции могут изменять состояния и должны возвращать текущие значения переменных состояния. Если gameover изменяется с True на False, переменные управления игрой должны быть установлены в их начальное состояние (конечно, вы можете написать функцию для этого и в своем коде): 110]

Функция завершения игры должна рисовать экран «окончена игра» и, конечно, pygame.display.update(). Функция оценивает изменения состояния и возвращает значения:

def game_over():

    screen.fill(LIGHTBLUE)
    draw_text("GAME OVER", 48, WHITE, screen_width/2, screen_height/4)
    draw_text("Score: " + str(score), 22, WHITE,  screen_width / 2, screen_height / 3)
    draw_text("Press SPACE to play again or ESC to exit", 22, WHITE, screen_width/2, screen_height / 4)
    pygame.display.update()
    fps_controller.tick(25)

    rungame = True 
    continuegame = False 
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            rungame  = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                continuegame = True
            if event.key == pygame.K_ESCAPE:
                rungame = False
    return rungame, not continuegame

Если змея сталкивается, то main возвращает измененное состояние:

def main():
    global update, direction, snake_pos, snake_speed, apple_spawn, apple_pos
    pygame.time.delay(60)

    rungame = True
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            rungame = False

    # [...]

    collision = False
    if snake_pos[0] < 0 or snake_pos[0] > screen_width-20:
        collision = True
    if snake_pos[1] < 0 or snake_pos[1] > screen_height-20:
        collision = True

    for block in snake_body[1:]:
        if snake_pos[0] == block[0] and snake_pos[1] == block[1]:
            collision = True

    score(scoreval)
    pygame.display.update()
    fps_controller.tick(25)

    return rungame, collision
0
ответ дан Rabbid76 30 March 2019 в 22:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: