79 lines
2.1 KiB
Python
79 lines
2.1 KiB
Python
import pyray as pr
|
|
|
|
|
|
class ScrollingText:
|
|
def __init__(
|
|
self,
|
|
text: str,
|
|
font_size: int,
|
|
speed: float = 40.0, # pixels per second
|
|
pause_time: float = 1.0, # seconds before scrolling
|
|
color=pr.WHITE,
|
|
):
|
|
self.font_size = font_size
|
|
self.speed = speed
|
|
self.pause_time = pause_time
|
|
self.color = color
|
|
self.text = None
|
|
self.set_text(text, font_size)
|
|
|
|
def set_text(self, text: str, font_size: int):
|
|
if text == self.text and font_size == self.font_size:
|
|
return
|
|
self.text = text
|
|
self.font_size = font_size
|
|
self.text_width = pr.measure_text(self.text, self.font_size)
|
|
self.reset()
|
|
|
|
def reset(self):
|
|
self.offset = 0.0
|
|
self.timer = 0.0
|
|
self.scrolling = False
|
|
|
|
def update(self, dt: float, size: pr.Vector2):
|
|
if self.text_width <= size.x:
|
|
return self.reset()
|
|
|
|
self.timer += dt
|
|
|
|
if not self.scrolling:
|
|
if self.timer >= self.pause_time:
|
|
self.scrolling = True
|
|
self.timer = 0.0
|
|
else:
|
|
self.offset += self.speed * dt
|
|
|
|
if self.offset >= self.text_width + self.font_size*2.5:
|
|
self.reset()
|
|
|
|
def draw(self, pos: pr.Vector2, size: pr.Vector2):
|
|
clip = pr.Rectangle(pos.x, pos.y, size.x, size.y)
|
|
pr.begin_scissor_mode(
|
|
int(clip.x),
|
|
int(clip.y),
|
|
int(clip.width),
|
|
int(clip.height),
|
|
)
|
|
|
|
y = pos.y + (size.y - self.font_size) / 2
|
|
|
|
pr.draw_text(
|
|
self.text,
|
|
int(pos.x - self.offset),
|
|
int(y),
|
|
self.font_size,
|
|
self.color,
|
|
)
|
|
|
|
# Second copy for seamless loop
|
|
if self.text_width > size.x:
|
|
pr.draw_text(
|
|
self.text,
|
|
int(pos.x - self.offset + self.text_width + self.font_size*2.5),
|
|
int(y),
|
|
self.font_size,
|
|
self.color,
|
|
)
|
|
|
|
pr.end_scissor_mode()
|