python-3.x - guia - qgis español
¿Cómo puedo hacer que este objeto se pueda hacer clic y luego cerrarlo para que se pueda representar un nuevo mapa? (2)
Estoy tratando de hacer que este sprite llamado Button
pueda hacer clic. Aparece después de que el jugador ha alcanzado la meta, y después de hacer clic en él, el sprite debe desaparecer para el nuevo mapa. También lo haré de modo que después de hacer clic en el sprite se cargue el nuevo nivel, pero por ahora vamos a mantener el hecho de hacer clic en el sprite y que algo suceda debido a eso.
Este es el código de interés:
class Button(pg.sprite.Sprite):
def __init__(self, game, x, y):
self.groups = game.all_sprites, game.buttons
pg.sprite.Sprite.__init__(self, self.groups)
self.game = game
self.image = pg.Surface((450, 335))
self.image = game.alert_img
self.rect = self.image.get_rect()
self.x = x
self.y = y
self._layer = 2
self.rect.x = x * TILESIZE
self.rect.y = y * TILESIZE
def events(self):
# catch all events here
for event in pg.event.get():
if event.type == pg.QUIT:
self.quit()
if event.type == pg.KEYDOWN:
if event.key == pg.K_ESCAPE:
self.quit()
if event.key == pg.K_LEFT:
self.player.move(dx=-1)
if event.key == pg.K_RIGHT:
self.player.move(dx=1)
if event.key == pg.K_UP:
self.player.move(dy=-1)
if event.key == pg.K_DOWN:
self.player.move(dy=1)
if event.type == pg.USEREVENT + 1:
self.text_object.kill()
self.text_object = Text((1760, 570), self.player.actions, self.font)
self.all_sprites.add(self.text_object)
Button(self, self.player.x -1.5, self.player.y - 2.4)
Eso sí, los eventos están en la clase principal, mientras que el botón de clase, bueno, claramente no lo es. Mi punto es def eventos no está en la clase de botón.
EDITAR Ambos indicadores funcionan a continuación, sin embargo skrx su respuesta es más adecuada para mi proyecto personal, donde mi solución podría ser más adecuada para usted, dependiendo de lo que está tratando de lograr. Aconsejo mirar a través de ambos.
Entonces, en lugar de hacer que el usuario haga clic en el sprite, en su lugar realicé una función llamada continue_game
en la cual el juego se detiene y espero que el usuario presione la barra espaciadora para que el juego continúe. No tengo código sustancial corriendo después del espacio se ejecuta, pero el kill elimina al sprite como yo quiero, asegurándome que hace lo que yo quiero.
def continue_game(self):
user_continue = False
while not user_continue:
for event in pg.event.get():
if event.type == pg.QUIT:
self.quit()
if event.type == pg.KEYDOWN:
if event.key == pg.K_ESCAPE:
self.quit()
if event.key == pg.K_SPACE:
self.button.kill()
user_continue = True
El evento de uso anteriormente mencionado ahora se ve así:
if event.type == pg.USEREVENT + 1:
self.text_object.kill()
self.text_object = Text((1760, 570), self.player.actions, self.font)
self.all_sprites.add(self.text_object)
self.button = Button(self, self.player.x -1.5, self.player.y - 2.4)
self.draw()
self.continue_game()
Le daría a la clase Game
un self.button = None
y asignaría la instancia del botón cuando el usuario alcance el objetivo. Para comprobar si el mouse colisiona con el botón, puede usar event.pos
del evento pg.MOUSEBUTTONDOWN
y aplicar la cámara. Tuve que darle a la clase Camera
un método de apply_mouse
, porque event.pos
es solo una tupla y necesitaba la posición negativa de la cámara.
# In the `Game` class.
def events(self):
for event in pg.event.get():
if event.type == pg.QUIT:
self.quit()
elif event.type == pg.MOUSEBUTTONDOWN:
if self.button is not None:
mouse = self.camera.apply_mouse(event.pos)
if self.button.rect.collidepoint(mouse):
print(''Clicked!'')
# Remove button from sprite groups and
# set self.button to None again.
button.kill()
self.button = None
# KEYDOWN events omitted.
elif event.type == pg.USEREVENT + 1:
self.text_object.kill()
self.text_object = Text((1760, 570), self.player.actions, self.font)
self.all_sprites.add(self.text_object)
# Check `if self.button is None` so that we don''t add
# several buttons to the groups.
if self.button is None:
self.button = Button(self, 1060, 670)
class Button(pg.sprite.Sprite):
def __init__(self, game, x, y):
self.groups = game.all_sprites, game.buttons
pg.sprite.Sprite.__init__(self, self.groups)
self.image = pg.Surface((450, 335))
self.image.fill((0, 40, 200))
self.rect = self.image.get_rect(topleft=(x, y))
self._layer = 6
class Camera:
# I just added this method to the Camera class.
def apply_mouse(self, pos):
return (pos[0]-self.camera.x, pos[1]-self.camera.y)