У меня есть другое решение: это решение отлично работает, когда у вас есть только контент, который вы хотите показать при входе в систему. Определите правило, в котором вы проверяете, если вы вошли в систему, а не путь к белым спискам.
$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 */ }
Вам нужно поместить основной цикл в другой цикл, чтобы он снова запускался после выполнения функции 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()
.
У вас есть 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