2017-12-04 4 views
0

Grundsätzlich möchte ich einen Button erstellen und schreiben Sie Text mit Pygame und ich gelange.Pygame - Probleme mit Button-Rendering

Aber die letzte Schaltfläche (namens LeaderboardButton) ändert das Bild nicht in "./image/mouseOnButton.png", wenn sich der Cursor auf der Schaltfläche befindet.

Ich frage mich wirklich, warum ist das passiert. Der Rest des Buttons ist in Ordnung.

import pygame 
from pygame.locals import * 
import sys 

FPS = 60 
clock = pygame.time.Clock() 
screen = pygame.display.set_mode((800, 700)) 
screen.fill((255, 255, 255)) 
pygame.font.init() 
pygame.init() 

class Button(): 
    def __init__(self, msg, font, x , y, w, h, color): 
     self.msg = msg 
     self.font = font 
     self.x = x 
     self.y = y 
     self.w = w 
     self.h = h 
     self.color = color 

    def createButton(self): 
     (mouseX, mouseY) = pygame.mouse.get_pos() 
     if((mouseX >= self.x and mouseY <= self.x + self.w) and (mouseY >= self.y and mouseY <= self.y + self.h)): 
      button = pygame.image.load("./image/mouseOnButton.png") 
     else: 
      button = pygame.image.load("./image/button.png") 
     screen.blit(button, (self.x, self.y)) 
     text = pygame.font.SysFont(self.font, 32) 
     textSurface = text.render(self.msg.encode("utf-8"), True, self.color) 
     screen.blit(textSurface, (self.x + self.w/len(self.msg), self.y + self.h/2)) 

while True: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      sys.exit() 
     if event.type == KEYDOWN: 
      if(event.key == pygame.K_F4 and pygame.KMOD_ALT): 
       sys.exit() 

    localButton = Button("Local Play", "./font/NanumSquareRoundEB.ttf", 325, 200, 150, 75, (255, 255, 255)).createButton() 
    socketButton = Button("Socket Play", "./font/NanumSquareRoundEB.ttf", 325, 325, 150, 75, (255, 255, 255)).createButton() 
    howtoButton = Button("How to Play", "./font/NanumSquareRoundEB.ttf", 325, 450, 150, 75, (255, 255, 255)).createButton() 
    leaderboardButton = Button("Leaderboard", "./font/NanumSquareRoundEB.ttf", 325, 575, 150, 75, (255, 255, 255)).createButton() 
    pygame.display.update() 
    clock.tick(FPS) 

Antwort

2

Das Problem wird durch einen Tippfehler in der zweiten Zeile Ihrer createButton Methode verursacht wurde (es wäre besser, pygame.Rect s zu nutzen und ihre Kollisionserkennungsverfahren):

if((mouseX >= self.x and mouseY <= self.x + self.w) and (mouseY >= self.y and mouseY <= self.y + self.h)): 
# Should be: 
if((mouseX >= self.x and mouseX <= self.x + self.w) and (mouseY >= self.y and mouseY <= self.y + self.h)): 

Ich schlage vor, Instanzen zu erstellen von Ihrem Button vor der While-Schleife und geben Sie ihnen eine draw und eine handle_event Methode, so dass Sie button.draw(screen) innerhalb der While-Schleife nur anrufen können. Ich habe die Schaltfläche im folgenden Beispiel bereits geändert. Beachten Sie, dass Sie Ihren Code vereinfachen können, indem Sie pygame.Rect s als Blit-Position und für die Kollisionserkennung verwenden. Sie können die Schaltflächen auch in eine Liste einfügen und sie zeichnen und die Ereignisse in einer for-Schleife behandeln, z. for button in button_list: button.draw(screen).

import sys 
import pygame 


pygame.init() 
FPS = 60 
clock = pygame.time.Clock() 
screen = pygame.display.set_mode((800, 700)) 


class Button(): 
    def __init__(self, msg, font, x, y, w, h, color): 
     self.msg = msg 
     self.color = color 
     self.font = pygame.font.SysFont(font, 32) 
     self.text_surf = self.font.render(self.msg, True, self.color) 
     self.image_normal = pygame.Surface((w, h)) 
     self.image_normal.fill(pygame.Color('dodgerblue1')) 
     self.image_hover = pygame.Surface((w, h)) 
     self.image_hover.fill(pygame.Color('lightskyblue')) 

     self.image = self.image_normal 
     self.rect = self.image.get_rect(topleft=(x, y)) 
     # To center the text rect. 
     self.text_rect = self.text_surf.get_rect(center=self.rect.center) 

    def handle_event(self, event): 
     if event.type == pygame.MOUSEMOTION: 
      if self.rect.collidepoint(event.pos): 
       self.image = self.image_hover 
      else: 
       self.image = self.image_normal 

    def draw(self, screen): 
     screen.blit(self.image, self.rect) 
     screen.blit(self.text_surf, self.text_rect) 


local_button = Button(
    "Local Play", "Comic Sans MS", 325, 200, 150, 75, (255, 255, 255)) 

while True: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pygame.quit() 
      sys.exit() 

     local_button.handle_event(event) 

    screen.fill((30, 30, 30)) 
    local_button.draw(screen) 

    pygame.display.update() 
    clock.tick(FPS) 
+0

Ich kann Ihren Code verstehen, aber ich weiß immer noch nicht, was das Problem war. Es ist wegen der Optimierung oder etwas? – SaGwa

+0

Oh, es scheint nur ein Tippfehler in der zweiten Zeile der 'createButton' Methode zu sein:' (mouseX> = self.x und mouseY <= self.x + self.w) '...' mouseY' sollte sein 'MausX'. – skrx

+0

Ich war so dumm ... danke für deine Freundlichkeit und zusätzliche Tipps! – SaGwa