2016-07-16 40 views
0

INFO: Ich arbeite gerade an einem Spiel und möchte die Idee eines Startmenüs nach unten ziehen, bevor es weitergeht, da dies mit weiteren Teilen meines Spiels helfen wird Design. Grundsätzlich möchte ich es so, wenn ich START GAME drücke, wird das Spiel beginnen, wenn ich HELP drücke, wird es eine Hilfeseite zeigen und wenn ich QUIT drücke, wird das Spiel beendet. Bis jetzt ist das Spiel beendet, wenn QUIT gedrückt wird, was ziemlich einfach war, aber ich bin mit dem Starten des Spiels festgefahren.Pygame, Spiel stoppt, wenn die Maus sich bewegt

DAS PROBLEM: Wenn ich Start-Spiel drücke, wird der Player Sprite sowie die Uhr angezeigt. Die Uhr funktioniert genauso gut wie die Frames, bis die Maus bewegt wird.

DER 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() 

Jede Hilfe sehr geschätzt wird und ich würde gerne Ihre Feed-back :)

Antwort

0

Ich habe festgestellt, das Problem jetzt zu sehen. Das Problem liegt in der Spieleschleife.

In ** tu Zeug 1 ** Sie überprüfen kein Ereignis aus der Ereignisschleife, so dass es funktioniert. Aber in ** do stuff 2 ** versuchst du, nach einem Ereignis zu suchen CLOCKTICK, das du definierst alle 1000 ms (jede Sekunde).

Die Ereignis Variable nur Referenz das letzte Ereignis nach der Ereignisschleife, was bedeutet, dass, wenn irgendein Ereignis (wie die Maus bewegen oder eine Taste drücken) kommt es für dieses Ereignis prüfen könnte anstelle des CLOCKTICK. Wenn keine Ereignisse auftreten, wird die Ereignisvariable immer noch das vorherige Ereignis sein. Deshalb tickt Ihre Uhr so ​​schnell, anstatt jede Sekunde.

Eine Lösung wäre eine Ereignisschleife für jeden Status.

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 **