cleaned up the game states to be a 2 bit system with game running and game ending states.
This commit is contained in:
parent
84a6e58ba3
commit
ad94b1b601
@ -421,23 +421,25 @@ timer_game_ending_started = False
|
|||||||
############################################
|
############################################
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
|
# default actions to be done every cycle
|
||||||
clear_screen()
|
clear_screen()
|
||||||
handle_events()
|
handle_events()
|
||||||
show_debug()
|
show_debug()
|
||||||
|
|
||||||
if game_running == False and game_ending == False:
|
if game_running == False and game_ending == False:
|
||||||
|
# one shot for changing the led colour
|
||||||
if game_just_started == True:
|
if game_just_started == True:
|
||||||
print("New game starting")
|
print("New game starting")
|
||||||
change_led_colour(10,140,10)
|
change_led_colour(10,140,10)
|
||||||
game_just_started = False
|
game_just_started = False
|
||||||
|
|
||||||
|
# reset all the surfaces to be empty
|
||||||
time_surface = 0
|
time_surface = 0
|
||||||
errors_surface = 0
|
errors_surface = 0
|
||||||
time_rectangle = 0
|
time_rectangle = 0
|
||||||
errors_rectangle = 0
|
errors_rectangle = 0
|
||||||
|
|
||||||
|
# fill all surfaces again to contain the proper text
|
||||||
header_surface = pygame_font_1.render('Dr' + u'ü' + 'cken Sie Start!', True, pygame_font_main_color)
|
header_surface = pygame_font_1.render('Dr' + u'ü' + 'cken Sie Start!', True, pygame_font_main_color)
|
||||||
header_rectangle = header_surface.get_rect()
|
header_rectangle = header_surface.get_rect()
|
||||||
header_rectangle.topleft = (560, 250)
|
header_rectangle.topleft = (560, 250)
|
||||||
@ -460,54 +462,67 @@ while True:
|
|||||||
|
|
||||||
pygame.draw.rect(screen,pygame_color_black, (500, 200, (screen_size_x-500*2), (screen_size_y-200*2)), 5)
|
pygame.draw.rect(screen,pygame_color_black, (500, 200, (screen_size_x-500*2), (screen_size_y-200*2)), 5)
|
||||||
|
|
||||||
|
# add headline, highscore headline, the 3 scores, as well as the logos to the screen
|
||||||
screen.blit(header_surface, header_rectangle)
|
screen.blit(header_surface, header_rectangle)
|
||||||
screen.blit(highscore_header_surface, highscore_header_rectangle)
|
screen.blit(highscore_header_surface, highscore_header_rectangle)
|
||||||
screen.blit(score1_surface, score1_rectangle)
|
screen.blit(score1_surface, score1_rectangle)
|
||||||
screen.blit(score2_surface, score2_rectangle)
|
screen.blit(score2_surface, score2_rectangle)
|
||||||
screen.blit(score3_surface, score3_rectangle)
|
screen.blit(score3_surface, score3_rectangle)
|
||||||
screen.blit(img_itlablogo_image, (screen_size_x-img_itlablogo_imagex-20, screen_size_y-img_itlablogo_imagey-20))
|
screen.blit(img_itlablogo_image, (screen_size_x-img_itlablogo_imagex-20, screen_size_y-img_itlablogo_imagey-20))
|
||||||
|
# TODO: Metallic Logo
|
||||||
|
|
||||||
|
# display everything
|
||||||
pygame.display.flip()
|
pygame.display.flip()
|
||||||
|
|
||||||
if GPIO.input(pin_start) == True and pin_start_inhibit == False and game_running == False and game_ending != True: #wait for the user to press start button
|
# event handling for if the start button is pushed
|
||||||
|
if GPIO.input(pin_start) == True and pin_start_inhibit == False: #wait for the user to press start button
|
||||||
print("start pin has been detected, starting game")
|
print("start pin has been detected, starting game")
|
||||||
|
|
||||||
|
# change game state to running and not ending
|
||||||
game_running = True
|
game_running = True
|
||||||
|
game_ending = False
|
||||||
|
|
||||||
# set an inhibitor bit to stop the contact from possibly vibrating and
|
# set an inhibitor bit to stop the contact from possibly vibrating and
|
||||||
# causing a stop of the game immediately after start
|
# causing a stop of the game immediately after start
|
||||||
pin_start_inhibit = True
|
pin_start_inhibit = True
|
||||||
timer_pin_start_inhibit_starttime = pygame.time.get_ticks()
|
timer_pin_start_inhibit_starttime = pygame.time.get_ticks()
|
||||||
|
|
||||||
|
# reset errors
|
||||||
errors = 0
|
errors = 0
|
||||||
error_added = False
|
error_added = False # for the 2 tick error counter system, see blow
|
||||||
|
|
||||||
|
# change the headline
|
||||||
header_surface = pygame_font_1.render('Spiel l' + u'ä' + 'uft!', True, pygame_font_main_color)
|
header_surface = pygame_font_1.render('Spiel l' + u'ä' + 'uft!', True, pygame_font_main_color)
|
||||||
|
|
||||||
|
# start the timer
|
||||||
start_time = int(time.time())
|
start_time = int(time.time())
|
||||||
|
|
||||||
# change led colour to blue
|
# change led colour to blue
|
||||||
change_led_colour(10,10,100)
|
change_led_colour(10,10,100)
|
||||||
|
|
||||||
if game_running == True: # game running
|
if game_running == True and game_ending == False:
|
||||||
print("Game running normally")
|
print("Game running normally")
|
||||||
|
|
||||||
# if the start pin is inhibited and at least 3 seconds have passed,
|
# if the start pin is inhibited and at least 3 seconds have passed,
|
||||||
# stop blocking the pin
|
# one shot: stop blocking the pin
|
||||||
if pin_start_inhibit == True:
|
if pin_start_inhibit == True:
|
||||||
if ((pygame.time.get_ticks()-timer_pin_start_inhibit_starttime)/1000) > 3:
|
if ((pygame.time.get_ticks()-timer_pin_start_inhibit_starttime)/1000) > 3:
|
||||||
pin_start_inhibit = False
|
pin_start_inhibit = False
|
||||||
|
|
||||||
|
# add errors if error pin is detected, only once per 2 ticks
|
||||||
|
# TODO: change system to be time based (only 1 error per 500ms or something)
|
||||||
if GPIO.input(pin_error) == True:
|
if GPIO.input(pin_error) == True:
|
||||||
if error_added == False:
|
if error_added == False:
|
||||||
errors += 1
|
errors += 1
|
||||||
int_time = int(time.time()) - start_time + errors * time_per_error
|
int_time = int(time.time()) - start_time + errors * time_per_error
|
||||||
error_added = True
|
error_added = True # for the 2 tick system
|
||||||
else:
|
else:
|
||||||
error_added = False
|
error_added = False # for the 2 tick system
|
||||||
|
|
||||||
|
# calculate the current time
|
||||||
int_time = int(time.time()) - start_time
|
int_time = int(time.time()) - start_time
|
||||||
|
|
||||||
|
# fill the surface with the current time and errors
|
||||||
time_surface = pygame_font_2.render('Zeit: ' + str(int_time) + 's', True, pygame_font_main_color)
|
time_surface = pygame_font_2.render('Zeit: ' + str(int_time) + 's', True, pygame_font_main_color)
|
||||||
time_rectangle = time_surface.get_rect()
|
time_rectangle = time_surface.get_rect()
|
||||||
time_rectangle.topleft = (640, 480)
|
time_rectangle.topleft = (640, 480)
|
||||||
@ -518,23 +533,30 @@ while True:
|
|||||||
|
|
||||||
clear_screen()
|
clear_screen()
|
||||||
|
|
||||||
|
# add errors, time and headline to the screen
|
||||||
screen.blit(errors_surface, errors_rectangle) #errors
|
screen.blit(errors_surface, errors_rectangle) #errors
|
||||||
screen.blit(time_surface, time_rectangle) #time
|
screen.blit(time_surface, time_rectangle) #time
|
||||||
screen.blit(header_surface, header_rectangle) #header
|
screen.blit(header_surface, header_rectangle) #header
|
||||||
|
|
||||||
|
# display everything
|
||||||
pygame.display.flip()
|
pygame.display.flip()
|
||||||
|
|
||||||
# if the start input is gone and the start pin isnt inhibited
|
# if another push of start is detected (i.e. the game is ending!)
|
||||||
|
if GPIO.input(pin_start) == True and pin_start_inhibit == False:
|
||||||
if game_running == True and GPIO.input(pin_start) == True and pin_start_inhibit == False and game_ending != True:
|
|
||||||
print("Game ended because start pin was detected again")
|
print("Game ended because start pin was detected again")
|
||||||
|
|
||||||
# change led colour to red
|
# change led colour to red
|
||||||
change_led_colour(100,10,10)
|
change_led_colour(100,10,10)
|
||||||
|
|
||||||
|
# reset the one shot latch for the end of game timer
|
||||||
timer_game_ending_started = False
|
timer_game_ending_started = False
|
||||||
game_ending = True
|
|
||||||
|
# change the state to not running and ending
|
||||||
game_running = False
|
game_running = False
|
||||||
|
game_ending = True
|
||||||
|
|
||||||
|
# set the start inhibitor to prevent an instant restart
|
||||||
|
# TODO: maybe unneeded due to the strict game state
|
||||||
pin_start_inhibit = True
|
pin_start_inhibit = True
|
||||||
|
|
||||||
if game_running == False and game_ending == True:
|
if game_running == False and game_ending == True:
|
||||||
@ -550,26 +572,45 @@ while True:
|
|||||||
timer_game_ending_timout = pygame.time.get_ticks()
|
timer_game_ending_timout = pygame.time.get_ticks()
|
||||||
timer_game_ending_started = True
|
timer_game_ending_started = True
|
||||||
|
|
||||||
|
|
||||||
clear_screen()
|
clear_screen()
|
||||||
|
|
||||||
|
# change the headline to game over
|
||||||
header_surface = pygame_font_1.render('Game over!', True, pygame_font_main_color)
|
header_surface = pygame_font_1.render('Game over!', True, pygame_font_main_color)
|
||||||
|
|
||||||
|
# add errors, time, and new headline to the screen
|
||||||
screen.blit(errors_surface, errors_rectangle) #errors
|
screen.blit(errors_surface, errors_rectangle) #errors
|
||||||
screen.blit(time_surface, time_rectangle) #time
|
screen.blit(time_surface, time_rectangle) #time
|
||||||
screen.blit(header_surface, header_rectangle) #header
|
screen.blit(header_surface, header_rectangle) #header
|
||||||
|
|
||||||
|
# display everything
|
||||||
pygame.display.flip()
|
pygame.display.flip()
|
||||||
|
|
||||||
|
# unneeded timer, replaced by tick based system
|
||||||
#time.sleep(5)
|
#time.sleep(5)
|
||||||
|
|
||||||
# nach dem spiel ist vor dem spiel
|
# if 5 seconds have passed since the game state changed to ending (see: timer_game_ending_timeout)
|
||||||
if ((pygame.time.get_ticks()-timer_game_ending_timout)/1000) > 5:
|
if ((pygame.time.get_ticks()-timer_game_ending_timout)/1000) > 5:
|
||||||
|
# reset game_just_started flag to enable the one shot led change in the first state
|
||||||
game_just_started = True
|
game_just_started = True
|
||||||
|
|
||||||
|
# change state
|
||||||
|
game_running = False
|
||||||
game_ending = False
|
game_ending = False
|
||||||
|
|
||||||
|
# reset highscore one shot
|
||||||
highscore_checked = False
|
highscore_checked = False
|
||||||
|
|
||||||
|
# reset timer started one shot
|
||||||
timer_game_ending_started = False
|
timer_game_ending_started = False
|
||||||
|
|
||||||
|
# unblock the start pin
|
||||||
pin_start_inhibit = False
|
pin_start_inhibit = False
|
||||||
|
|
||||||
|
if game_running == True and game_ending == True:
|
||||||
|
# something went horribly wrong...
|
||||||
|
# this state is never supposed to be reached
|
||||||
|
pass
|
||||||
|
|
||||||
pygame.display.update()
|
pygame.display.update()
|
||||||
pygame_clock.tick(pygame_fps)
|
pygame_clock.tick(pygame_fps)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user