set_alpha python text pygame

python - set_alpha - el texto no aparece dinĂ¡micamente, pygame



pygame text (2)

Se supone que el código siguiente crea un botón verde que hace que aparezca un texto de puntuación. desafortunadamente el botón no hace nada, y la única forma en que logré que funcione es al poner la llamada de función para makeText en el ciclo while en lugar de hacerlo en la función clickButton, pero si lo hago ya no es dinámico. ¿Alguien puede explicar por qué el texto no aparece cuando presiono el botón y corrijo mi código para que se muestre?

import pygame import sys #game stuff pygame.init() screen = pygame.display.set_mode((640, 480),0,32) clock = pygame.time.Clock() #functions def makeText(title,text,posx,posy): font=pygame.font.Font(None,30) scoretext=font.render(str(title)+ ": " +str(text), 1,(0,0,0)) screen.blit(scoretext, (posx, posy)) def clickButton(name,x,y,width,height): if x + width > cur[0] > x and y + height > cur[1] > y: if click == (1,0,0): makeText("score",300,100,10) #objects button1 = pygame.Rect((0,0), (32,32)) while True: screen.fill((255,255,255)) screen.fill((55,155,0), button1) #update display pygame.display.update() clock.tick(60) #event handling for event in pygame.event.get(): if event.type == pygame.QUIT: quit() elif event.type == pygame.MOUSEBUTTONDOWN: cur = event.pos click = pygame.mouse.get_pressed() clickButton("button1",button1.left,button1.top,button1.width,button1.height)


El problema es que una vez que creó el texto, su ciclo principal continúa y llama a screen.fill , sobregirando el texto incluso antes de pygame.display.update() .

Puedes cambiarlo a:

... def clickButton(name,x,y,width,height): print x + width > cur[0] > x and y + height > cur[1] > y if x + width > cur[0] > x and y + height > cur[1] > y: if click == (1,0,0): makeText("score",300,100,10) #objects button1 = pygame.Rect((0,0), (32,32)) while True: screen.fill((255,255,255)) screen.fill((55,155,0), button1) #event handling for event in pygame.event.get(): if event.type == pygame.QUIT: quit() elif event.type == pygame.MOUSEBUTTONDOWN: cur = event.pos click = pygame.mouse.get_pressed() clickButton("button1",button1.left,button1.top,button1.width,button1.height) ...

entonces el texto se crea después de llenar la pantalla con el color de fondo y antes de pygame.display.update() , pero eso no resuelve el problema de que la pantalla se vuelva a llenar la siguiente iteración del ciclo while.

Entonces, la solución es hacer un seguimiento del hecho de que se presionó el botón, también conocido como un seguimiento de un estado .

Aquí hay un ejemplo de un enfoque diferente, que usa clases para los botones y un dict para el estado global (por lo que no necesita variables globales, que debe evitar la mayor parte del tiempo, porque puede ser muy confuso rápidamente si su juego comienza volviéndose más complejo).

Haga clic en el primer botón para mostrar u ocultar el puntaje, y haga clic en el segundo botón para cambiar el color de fondo y gane 100 puntos.

Vea qué fácil es crear nuevos botones; simplemente está agregando una función simple.

import pygame import sys import random pygame.init() screen = pygame.display.set_mode((640, 480),0,32) clock = pygame.time.Clock() # create font only once font = pygame.font.Font(None,30) # it''s always a good idea to cache all text surfaces, since calling ''Font.render'' is # an expensive function. You''ll start to notice once your game becomes more complex # and uses more text. Also, use python naming conventions text_cache = {} def make_text(title, text): key = "{title}: {text}".format(title=title, text=text) if not key in text_cache: text = font.render(key, 1,(0,0,0)) text_cache[key] = text return text else: return text_cache[key] # we use the ''Sprite'' class because that makes drawing easy class Button(pygame.sprite.Sprite): def __init__(self, rect, color, on_click): pygame.sprite.Sprite.__init__(self) self.rect = rect self.image = pygame.Surface((rect.w, rect.h)) self.image.fill(color) self.on_click = on_click # this happens when the first button is pressed def toggle_score_handler(state): state[''show_score''] = not state[''show_score''] # this happens when the second button is pressed def toggle_backcolor_handler(state): state[''backcolor''] = random.choice(pygame.color.THECOLORS.values()) state[''score''] += 100 # here we create the buttons and keep them in a ''Group'' buttons = pygame.sprite.Group(Button(pygame.Rect(30, 30, 32, 32), (55, 155 ,0), toggle_score_handler), Button(pygame.Rect(250, 250, 32, 32), (155, 0, 55), toggle_backcolor_handler)) # here''s our game state. In a real # game you probably have a custom class state = {''show_score'': False, ''score'': 0, ''backcolor'': pygame.color.Color(''White'')} while True: for event in pygame.event.get(): if event.type == pygame.QUIT: quit() # you can check for the first mouse button with ''event.button == 1'' elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1: # to check if the mouse is inside the button, you # can simple use the ''Rect.collidepoint'' function for button in (b for b in buttons if b.rect.collidepoint(event.pos)): button.on_click(state) screen.fill(state[''backcolor'']) # draw all buttons by simple calling ''Group.draw'' buttons.draw(screen) if state[''show_score'']: screen.blit(make_text("score", state[''score'']), (100, 30)) pygame.display.update() clock.tick(60)


Está comprobando el valor de "hacer clic" en la función clickButton, pero no veo clic definido en ningún lugar que clickButton tenga acceso a él. Quizás debería pasar el clic como un argumento en la función clickButton, que posiblemente haría que la condición if sea verdadera.