2016-07-16 11 views
0

INFO:私は現在ゲームに取り組んでいます。私がしたいと思うゲームのさらなる部分に役立つように、移動を開始する前にスタートメニューを知りたい設計。基本的に私はSTART GAMEを押すとゲームが始まります。HELPを押すとヘルプページが表示され、QUITを押すとゲームが終了します。これまでのところ、QUITが押されたときにゲームは終了しましたが、それはかなりシンプルでしたが、私はゲームを開始することに固執しています。ゲームが終わったときにゲームが止まる

問題: 私がスタートゲームを押すと、プレイヤースプライトと時計が表示されます。マウスを動かすまで、時計はフレームと同様に機能します。

CODE

import pygame, random, time 
pygame.init() 

#Screen 
SIZE = width, height = 1280, 720 #Make sure background image is same size 
SCREEN = pygame.display.set_mode(SIZE) 
pygame.display.set_caption("Cube") 

#Events 
done = False 
menu_on = True 

#Colors 
BLACK = 0, 0, 0 
WHITE = 255, 255, 255 

#Fonts 
FONT = pygame.font.SysFont("Trebuchet MS", 25) 
MENU_FONT = (FONT) 

#Info 
time = 0 
minute = 0 
hour = 0 
day = 0 
year = 0 
counter = 0 

blink_clock = 0 
blink = 0 

#Year 
YEARFONT = FONT.render("Year:{0:03}".format(year),1, BLACK) #zero-pad day to 3 digits 
YEARFONTR=YEARFONT.get_rect() 
YEARFONTR.center=(885, 20) 
#Day 
DAYFONT = FONT.render("Day:{0:03}".format(day),1, BLACK) #zero-pad day to 3 digits 
DAYFONTR=DAYFONT.get_rect() 
DAYFONTR.center=(985, 20) 
#Hour 
HOURFONT = FONT.render("Hour:{0:02}".format(hour),1, BLACK) #zero-pad hours to 2 digits 
HOURFONTR=HOURFONT.get_rect() 
HOURFONTR.center=(1085, 20) 
#Minute 
MINUTEFONT = FONT.render("Minute:{0:02}".format(minute),1, BLACK) #zero-pad minutes to 2 digits 
MINUTEFONTR=MINUTEFONT.get_rect() 
MINUTEFONTR.center=(1200, 20) 


#Characters 
def load_image(cube): 
    image = pygame.image.load(cube) 
    return image 

class Menu: 

    hovered = False 
    def __init__(self, text, pos): 
     self.text = text 
     self.pos = pos 
     self.set_rect() 
     self.draw() 
    def draw(self): 
     self.set_rend() 
     SCREEN.blit(self.rend, self.rect) 

    def set_rend(self): 
     self.rend = MENU_FONT.render(self.text, 1, self.get_color()) 

    def get_color(self): 
     if self.hovered: 
      return (255, 255, 255) 
     else: 
      return (100, 100, 100) 

    def set_rect(self): 
     self.set_rend() 
     self.rect = self.rend.get_rect() 
     self.rect.topleft = self.pos 

class Cube(pygame.sprite.Sprite): 
    def __init__(self): 
     super(Cube, self).__init__() 
     self.images = [] 
     self.images.append(load_image('Fine.png')) 

     self.index = 0 
     self.image = self.images[self.index] 
     self.rect = pygame.Rect(440, 180, 74, 160) 

    def update(self): 
     self.index += 1 
     if self.index >= len(self.images): 
      self.index = 0 
     self.image = self.images[self.index] 



class Blink(pygame.sprite.Sprite): 
    def __init__(self): 
     super(Blink, self).__init__() 
     self.images = [] 
     self.images.append(load_image('Blink.png')) 

     self.index = 0 
     self.image = self.images[self.index] 
     self.rect = pygame.Rect(440, 180, 74, 160) 

    def update(self): 
     self.index += 1 
     if self.index >= len(self.images): 
      self.index = 0 
     self.image = self.images[self.index] 

class Blank(pygame.sprite.Sprite): 
    def __init__(self): 
     super(Blank, self).__init__() 
     self.images = [] 
     self.images.append(load_image('Blank.png')) 

     self.index = 0 
     self.image = self.images[self.index] 
     self.rect = pygame.Rect(440, 180, 74, 160) 

    def update(self): 
     self.index += 1 
     if self.index >= len(self.images): 
      self.index = 0 
     self.image = self.images[self.index] 

allsprites = Cube() 
group = pygame.sprite.Group(allsprites) 
blink = Blink() 
blinking = pygame.sprite.Group(blink) 
blankcube = Blank() 
blankgroup = pygame.sprite.Group(blankcube) 

start_game = [Menu("START GAME", (140, 105))] 
help_ = [Menu("HELP", (140, 155))] 
quit_ = [Menu("QUIT", (140, 205))] 

#Game Speed 
clock = pygame.time.Clock() 
FPS = 60 
CLOCKTICK = pygame.USEREVENT+1 
pygame.time.set_timer(CLOCKTICK, 1000) 

game_start = False 

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

    if menu_on == True: 
     for Menu in help_: 
      if Menu.rect.collidepoint(pygame.mouse.get_pos()): 
       Menu.hovered = True 
      else: 
       Menu.hovered = False 
      Menu.draw() 
     for Menu in quit_: 
      if Menu.rect.collidepoint(pygame.mouse.get_pos()): 
       Menu.hovered = True 
       if event.type == pygame.MOUSEBUTTONDOWN: 
        done = True 
      else: 
       Menu.hovered = False 
      Menu.draw() 

     for Menu in start_game: 
      if Menu.rect.collidepoint(pygame.mouse.get_pos()): 
       Menu.hovered = True 
       if event.type == pygame.MOUSEBUTTONDOWN: 
        game_start = True 
      else: 
       Menu.hovered = False 
      Menu.draw() 

     group.update() 
     group.draw(SCREEN) 

     if event.type == CLOCKTICK: 
      blink_clock=blink_clock + 1 
      if blink_clock == 60: 
       blink_clock = 0 
      if blink_clock == 0: 
       blink = random.randint(0, 1) 
      if blink == 1: 
       blinking.update() 
       blinking.draw(SCREEN) 
       if blink_clock == 41: 
        blink = 0 

     blankgroup.update() 
     blankgroup.draw(SCREEN) 

    if game_start == True: 
     menu_on = False 
     if event.type == CLOCKTICK: 
      minute = minute + 1 
      if minute == 60: 
       hour = hour + 1 
       minute = 0 
      if hour == 24: 
       day = day + 1 
       hour = 0 
      if day == 365: 
       year = year + 1 
       day = 0 
     SCREEN.fill(WHITE) 
     MINUTEFONT = FONT.render("Minute:{0:02}".format(minute), 1, BLACK) 
     SCREEN.blit(MINUTEFONT, MINUTEFONTR) 

     HOURFONT = FONT.render("Hour:{0:02}".format(hour), 1, BLACK) 
     SCREEN.blit(HOURFONT, HOURFONTR) 

     DAYFONT = FONT.render("Day:{0:03}".format(day), 1, BLACK) 
     SCREEN.blit(DAYFONT, DAYFONTR) 

     YEARFONT = FONT.render("Year:{0:03}".format(year), 1, BLACK) 
     SCREEN.blit(YEARFONT, YEARFONTR) 

     group.update() 
     group.draw(SCREEN) 

     if event.type == CLOCKTICK: 
      blink_clock=blink_clock + 1 
      if blink_clock == 60: 
       blink_clock = 0 
      if blink_clock == 0: 
       blink = random.randint(0, 1) 
      if blink == 1: 
       blinking.update() 
       blinking.draw(SCREEN) 
       if blink_clock == 41: 
        blink = 0 

     blankgroup.update() 
     blankgroup.draw(SCREEN) 


    clock.tick(FPS) 
    pygame.display.flip() 

pygame.quit() 

すべてのヘルプは高く評価され、私は戻って:)

答えて

0

私は今、あなたの問題を発見したフィードを見てみたいです。問題はゲームのループにあります。

** **スタッフはイベントループからイベントをチェックしていないので、正常に動作します。しかし** **あなたがイベントを確認しようとしている** **あなたが1000 ms(毎秒)ごとに発生するように定義したCLOCKTICK

イベント可変意志のみ基準(例えば、マウスを移動するか、ボタンを押すなど)の任意のイベントが発生した場合、それはCLOCKTICKの代わりにそのイベントを確認するかもしれないことを意味するイベントループ後に最後のイベント、

また、イベントが発生しない場合、イベント変数はとなり、まだが前のイベントになります。だからこそ、あなたの時計は毎秒ではなく、すばやく目を離しています。

この問題を解決するには、各状態のイベントループを作成することです。

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

     ** the rest of the code ** 

    if game_start == True: 
     menu_on = False 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       done = True 
      elif event.type == CLOCKTICK: # Make sure this code is inside the event loop! 
       minute = minute + 1 
       if minute == 60: 
        hour = hour + 1 
        minute = 0 
       if hour == 24: 
        day = day + 1 
        hour = 0 
       if day == 365: 
        year = year + 1 
        day = 0 

     ** the rest of the code ** 
関連する問題