|
发表于 2023-7-28 10:01:51
|
显示全部楼层
先说我的思路和改动
我把main.py里的disappear_message移到Message类里,并通过text.setter修饰的text函数触发,相应的,我删掉了main.py里所有对disappear_message的调用
接着我对disappear_message的逻辑进行了修改。我猜测你想要的是在文字条更新时不要删除文字,所以我将sleep(delay)改成循环来实现,我设置了self.timer变量,在text.setter被触发时,通过重置timer来实现中断delete_message线程,或者说重启delete_message线程的效果
这是改动后的Message类:
- class Message(pygame.sprite.Sprite):
- def __init__(self, text, pos):
- pygame.sprite.Sprite.__init__(self)
- self._text = text
- self.running = True
- self.flush(pos)
- self.timer = 50
- @property
- def text(self):
- return self._text
- @text.setter
- def text(self, text):
- pos = self.rect.topright
- self._text = text
- self.flush(pos)
- if self.timer == 50:
- Thread(target=self.disappear_message).start()
- else:
- self.timer = 50
- def flush(self, pos):
- self.image = Config.font.render(self._text, False, (255, 255, 255))
- self.rect = self.image.get_rect()
- self.rect.topright = pos
- def disappear_message(self, delay: number = 1, interval: number = 0.09):
- timer_interval = delay / self.timer
- while self.timer >= 0:
- sleep(timer_interval)
- self.timer -= 1
- while self.text and self.running:
- self.text = self.text[:-1]
- sleep(interval)
复制代码
有两个小问题,第一个,移到Message类后,delete_message访问不到running,我把running同步到了Message类里:
- if event.type == pygame.QUIT:
- running = False
- message.running = False
复制代码
第二个,我注意到你的delete_message有两个参数delay和interval,你可能想要在之后自定义等待的时间和文字消失的时间间隔,但我的版本里没有实现这个,所以可能对后续开发有点阻碍。我暂时也没想出能怎么解决,就先这样吧 |
|