2017-02-26 4 views
0

だから私はPyGameでゲームを作ってきましたが、問題が発生しました。私はゲームのループで何かが起こると、スコアが上がり、そのフォント関数を呼び出すスコアカウンターを作っています。しかし、スコアが上がったときに呼び出されるだけなので、それは1つのフレームだということです。では、どのようにフレームごとに固執するのですか?Pygameのテキストの点滅

#Importation 
import pygame 
import time 
from random import randint 


#Initialization 
pygame.mixer.pre_init(44100,16,2,4096) 
pygame.init() 

display_width = 800 
display_height = 600 

black = (0,0,0) 
white = (255, 255, 255) 
orange = (255, 122, 55) 
slow_yellow = (255, 203, 82) 
medium_orange = (255, 119, 0) 
fast_red = (255, 102, 82) 
bk_orange = (255, 228, 196) 

gameDisplay = pygame.display.set_mode((display_width, display_height)) 
pygame.display.set_caption('Dodger Man') 
clock = pygame.time.Clock() 

score = 0 

#MUSIC 
pygame.mixer.music.load('coastin_converted.wav') 
pygame.mixer.music.set_volume(.3) 
pygame.mixer.music.play(-1) 

#Man Sprite 
manImg = pygame.image.load('tutorialcharacter.png') 
man_width = 64 
man_height = 64 

#Wall Sprites 
wall_LImg = pygame.image.load('wall.png') 

def wall_L(wall_LX, wall_LY): 
    gameDisplay.blit(wall_LImg, (wall_LX, wall_LY)) 


wall_RImg = pygame.image.load('wall.png') 

def wall_R(wall_RX, wall_RY): 
    gameDisplay.blit(wall_RImg, (wall_RX, wall_RY)) 


#Functions 
def man(x,y): 
    gameDisplay.blit(manImg,(x,y)) 

#OBSTACLES 
def obs(obsx, obsy, obsw, obsh, obscolor): 
    pygame.draw.rect(gameDisplay, obscolor, [obsx, obsy, obsw, obsh]) 

def obs_2(obsx_2, obsy_2, obsw_2, obsh_2, obscolor_2): 
    pygame.draw.rect(gameDisplay, obscolor_2, [obsx_2, obsy_2, obsw_2, obsh_2]) 

def obs_3(obsx_3, obsy_3, obsw_3, obsh_3, obscolor_3): 
    pygame.draw.rect(gameDisplay, obscolor_3, [obsx_3, obsy_3, obsw_3, obsh_3]) 


##Messages 

def font_func(font_size, font_msg, font_color): 
    font = pygame.font.SysFont("freesansbold.tff", font_size) 
    text = font.render(font_msg, True, font_color) 

##Death 
def death(): 
    pygame.mixer.music.load('death.wav') 
    pygame.mixer.music.set_volume(.3) 
    pygame.mixer.music.play(1) 
    font_func(115, "YOU\'RE DEAD", orange) 
    window.blit(font_msg, (display_width/2), 70) 
    x = (display_width * 0.40) 
    y = (display_height * 0.8) 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      end_game() 
     else: 
      pass 
    time.sleep(.5) 
    pygame.mixer.music.load('coastin_converted.wav') 
    pygame.mixer.music.set_volume(.3) 
    pygame.mixer.music.play(-1) 
    game_loop(False) 


#Game Loop 
def game_loop(gameExit): 
    global score 

    x = (display_width * 0.40) 
    y = (display_height * 0.8) 

    wall_LX = 0 
    wall_LY = 0 

    wall_RX = display_width - 64 
    wall_RY = 0 

    #Obstacles 
    obs_startx = randint(64, display_width - 64) 
    obs_starty = -800 
    obs_speed = 10 
    obs_width = 75 
    obs_height = 75 

    obs_startx_2 = randint(64, display_width - 64) 
    obs_starty_2 = -300 
    obs_speed_2 = 12 
    obs_width_2 = 75 
    obs_height_2 = 75 

    obs_startx_3 = randint(64, display_width - 64) 
    obs_starty_3 = -1000 
    obs_speed_3 = 15 
    obs_width_3 = 75 
    obs_height_3 = 75 

    #Movement variables 
    x_change = 0 
    y_change = 0 

    #Event Loop 
    while gameExit != True: 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       gameExit = True 
       end_game() 

      #Movement 
      if event.type == pygame.KEYDOWN:      
       if event.key == pygame.K_LEFT: 
        x_change = -10 
       if event.key == pygame.K_RIGHT: 
        x_change = 10 
       if event.key == pygame.K_UP: 
        y_change = -10 
       if event.key == pygame.K_DOWN: 
        y_change = 10 

      #Non-Movement 
      if event.type == pygame.KEYUP: 
       if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT: 
        x_change = 0 

       if event.key == pygame.K_UP or event.key == pygame.K_DOWN: 
        y_change = 0 

     #Logic 
     x += x_change 
     y += y_change 

     gameDisplay.fill(bk_orange) 
     wall_L(wall_LX, wall_LY) 
     wall_R(wall_RX, wall_RY) 

     ##Blocks 
     obs(obs_startx, obs_starty, obs_width, obs_height, slow_yellow) 
     obs_starty += obs_speed 

     obs_2(obs_startx_2, obs_starty_2, obs_width_2, obs_height_2, medium_orange) 
     obs_starty_2 += obs_speed_2 

     obs_3(obs_startx_3, obs_starty_3, obs_width_3, obs_height_3, fast_red) 
     obs_starty_3 += obs_speed_3 

     man(x,y) 

     if x >= display_width - man_width or x <= 0: 
      death() 

     if y >= display_height - man_height or y <= 0: 
      y_change = 0 

     if obs_starty > display_height: 
      obs_starty = 0 - obs_height 
      obs_startx = randint(64, display_width - 64) 
      score += 1 
      font_func(70, ("SCORE:", str(score)), orange) 
      gameDisplay.blit(font_msg, (display_width/2), 70) 

     if obs_starty > 400: 
      if obs_starty_2 > display_height: 
       score += 2 
       font_func(70, ("SCORE:", str(score)), orange) 
       gameDisplay.blit(font_msg, (display_width/2), 70) 
      obs_starty_2 = 0 - obs_height_2 
      obs_startx_2 = randint(64, display_width - 64) 

     if obs_starty_2 > 500: 
      if obs_starty_3 > display_height: 
       score += 3 
       font_func(70, ("SCORE:", str(score)), orange) 
       gameDisplay.blit(font_msg, (display_width/2), 70) 
      obs_starty_3 = 0 - obs_height_3 
      obs_startx_3 = randint(64, display_width - 64) 

     if y <= obs_starty + obs_height: 
      if x > obs_startx and x < obs_startx + obs_width or x + man_width > obs_startx and x + man_width < obs_startx + obs_width: 
       if y + man_height < obs_starty: 
        pass 
       else: 
        score = 0 
        death() 

     if y <= obs_starty_2 + obs_height_2: 
      if x > obs_startx_2 and x < obs_startx_2 + obs_width_2 or x + man_width > obs_startx_2 and x + man_width < obs_startx_2 + obs_width_2: 
       if y + man_height < obs_starty_2: 
        pass 
       else: 
        score = 0 
        death() 
     if y <= obs_starty_3 + obs_height_3: 
      if x > obs_startx_3 and x < obs_startx_3 + obs_width_3 or x + man_width > obs_startx_3 and x + man_width < obs_startx_3 + obs_width_3: 
       if y + man_height < obs_starty_3: 
        pass 
       else: 
        score = 0 
        death() 

     #Updates 
     pygame.display.flip() 
     clock.tick(60) 

#Terminate program 
def end_game(): 
    pygame.quit() 
    quit() 
game_loop(False) 
+1

関数が単なる1行であれば関数ではないはずです。それはより多くのスペースを必要とし、他の人のために理解することをより困難にする。私は関数 'blit'を知っているので、' gameDisplay.blit(manImg、(x、y)) 'が何をするのか分かりますが、' man(x、y) 'が何を見ていないかはわかりません。また、別のパラメータをとる同じ関数( 'pygame.draw.rect'など)を経由するループを作成するのではなく、異なる名前を持つ関数を処理するループを作成するのが非常に難しくなります。 –

答えて

3

if font_msgを作成してblitしないでください。すべてのフレームをレンダリングします。

# Some global font objects that you can reuse in the while loop. 
FONT = pygame.font.SysFont('freesansbold.tff', 32) 
FONT_BIG = pygame.font.SysFont('freesansbold.tff', 70) 

    while not gameExit: 
     # In the drawing phase draw this every frame. 
     font_msg = FONT.render('SCORE: {}'.format(score), True, orange) 
     gameDisplay.blit(font_msg, (display_width//2, 70))