250 lines
8.3 KiB
Python
250 lines
8.3 KiB
Python
import arcade
|
||
import assets
|
||
|
||
class Character:
|
||
def __init__(self, visible, codepoint=None, width=None, y_offset=None, display=None):
|
||
self.visible = visible
|
||
if visible:
|
||
self.codepoint = codepoint # A szöveg atlaszba való index
|
||
self.width = width # A karakter szélessége
|
||
self.y_offset = y_offset # A karakter függőleges csúsztatása
|
||
else:
|
||
self.display = display # Egy függvény amely akkor fut le amikor a speciális karaktert megjelenítik
|
||
|
||
class TextRenderer:
|
||
def __init__(self, x, y, width=None, center=False):
|
||
self.sprites = []
|
||
self.base_x = x
|
||
self.base_y = y
|
||
self.width = width
|
||
self.center = center
|
||
self.text = ""
|
||
self.textptr = 0
|
||
self.x = x
|
||
self.y = y
|
||
|
||
def reset(self, text):
|
||
self.text = text
|
||
self.textptr = 0
|
||
self.sprites = []
|
||
self.x = self.base_x
|
||
self.y = self.base_y
|
||
|
||
def amend(self, text):
|
||
self.text = self.text + text
|
||
|
||
def type_tick(self):
|
||
if self.textptr >= len(self.text):
|
||
return True
|
||
|
||
try:
|
||
char = texttable[self.text[self.textptr]]
|
||
except:
|
||
char = texttable['?']
|
||
|
||
if char.visible:
|
||
c = char.codepoint
|
||
texture = assets.sprites["font"].get_texture(arcade.LBWH((c % 16) * 16, (c // 16) * 12, char.width, 12))
|
||
|
||
if self.width and self.x >= self.base_x + self.width:
|
||
self.y -= 13
|
||
self.x = self.base_x
|
||
|
||
self.sprites.append([
|
||
texture,
|
||
arcade.LBWH(
|
||
self.x,
|
||
self.y + char.y_offset,
|
||
char.width,
|
||
12
|
||
),
|
||
char.width
|
||
])
|
||
|
||
self.x += char.width
|
||
else:
|
||
try:
|
||
char.display(self)
|
||
except e:
|
||
print(f"Hiba: kivétel egy display függvényben: {e}")
|
||
|
||
self.textptr += 1
|
||
|
||
if self.textptr >= len(self.text):
|
||
return True
|
||
else:
|
||
return False
|
||
|
||
def type_all(self):
|
||
while not self.type_tick():
|
||
pass
|
||
|
||
def move(self, x, y):
|
||
for s in self.sprites:
|
||
s[1] = s[1].move(x, y)
|
||
|
||
def backtrack(self, n):
|
||
if n > 0:
|
||
self.sprites = self.sprites[:-n]
|
||
|
||
# !!! ChatGPT !!!
|
||
def render(self, discoloration=(255,255,255)):
|
||
offsets = []
|
||
sprite_idx = 0
|
||
for line in self.text.split('\n'):
|
||
line_len = len(line)
|
||
line_sprites = self.sprites[sprite_idx : sprite_idx + line_len]
|
||
line_width = sum(s[2] for s in line_sprites)
|
||
line_offset = -(line_width // 2) if self.center else 0
|
||
offsets.extend([line_offset] * len(line_sprites))
|
||
sprite_idx += line_len
|
||
|
||
for s, offset in zip(self.sprites, offsets):
|
||
arcade.draw_texture_rect(
|
||
s[0],
|
||
s[1].move(offset, 0),
|
||
pixelated=True,
|
||
color=arcade.types.Color(*discoloration)
|
||
)
|
||
|
||
# !!! ChatGPT vége !!!
|
||
# a \n display függvénye
|
||
def newline(self):
|
||
self.y -= 13
|
||
self.x = self.base_x
|
||
|
||
# A szövegtábla tartalmazza az össtes karakter tulajdonságait
|
||
texttable = {
|
||
# Szóköz
|
||
' ': Character(True, 0 , 4, 0 ),
|
||
|
||
# Írásjelek
|
||
'!': Character(True, 33 , 3, 0 ),
|
||
'"': Character(True, 34 , 4, 0 ),
|
||
'#': Character(True, 35 , 9, 0 ),
|
||
'$': Character(True, 36 , 9, 0 ),
|
||
'%': Character(True, 37 ,10, 0 ),
|
||
'&': Character(True, 38 , 8, 0 ),
|
||
'\'': Character(True, 39 , 3, 0 ),
|
||
'(': Character(True, 40 , 4, -1),
|
||
')': Character(True, 41 , 4, -1),
|
||
'*': Character(True, 42 , 4, 0 ),
|
||
'+': Character(True, 43 , 6, 0 ),
|
||
',': Character(True, 44 , 3, -2),
|
||
'-': Character(True, 45 , 4, 0 ),
|
||
'.': Character(True, 46 , 2, 0 ),
|
||
'/': Character(True, 47 , 5, 0 ),
|
||
':': Character(True, 58 , 2, 0 ),
|
||
';': Character(True, 59 , 3, -2),
|
||
'<': Character(True, 60 , 7, 0 ),
|
||
'=': Character(True, 61 , 6, 0 ),
|
||
'>': Character(True, 62 , 7, 0 ),
|
||
'?': Character(True, 63 , 5, 0 ),
|
||
'▪': Character(True, 64 , 3, 0 ),
|
||
'[': Character(True, 91 , 3, -1),
|
||
'♩': Character(True, 92 , 6, 0 ),
|
||
']': Character(True, 93 , 3, -1),
|
||
'“': Character(True, 124, 5, 0 ),
|
||
'”': Character(True, 123, 5, 0 ),
|
||
'●': Character(True, 125, 6, 0 ),
|
||
'~': Character(True, 126, 7, 0 ),
|
||
|
||
# Számjegyek
|
||
'0': Character(True, 48 , 5, 0 ),
|
||
'1': Character(True, 49 , 3, 0 ),
|
||
'2': Character(True, 50 , 5, 0 ),
|
||
'3': Character(True, 51 , 5, 0 ),
|
||
'4': Character(True, 52 , 5, 0 ),
|
||
'5': Character(True, 53 , 5, 0 ),
|
||
'6': Character(True, 54 , 5, 0 ),
|
||
'7': Character(True, 55 , 5, 0 ),
|
||
'8': Character(True, 56 , 5, 0 ),
|
||
'9': Character(True, 57 , 5, 0 ),
|
||
|
||
# Nagy betűk
|
||
'A': Character(True, 65 , 7, 0 ),
|
||
'B': Character(True, 66 , 6, 0 ),
|
||
'C': Character(True, 67 , 6, 0 ),
|
||
'D': Character(True, 68 , 6, 0 ),
|
||
'E': Character(True, 69 , 5, 0 ),
|
||
'F': Character(True, 70 , 5, 0 ),
|
||
'G': Character(True, 71 , 7, 0 ),
|
||
'H': Character(True, 72 , 6, 0 ),
|
||
'I': Character(True, 73 , 2, 0 ),
|
||
'J': Character(True, 74 , 5, 0 ),
|
||
'K': Character(True, 75 , 6, 0 ),
|
||
'L': Character(True, 76 , 5, 0 ),
|
||
'M': Character(True, 77 , 8, 0 ),
|
||
'N': Character(True, 78 , 6, 0 ),
|
||
'O': Character(True, 79 , 6, 0 ),
|
||
'P': Character(True, 80 , 6, 0 ),
|
||
'Q': Character(True, 81 , 6, 0 ),
|
||
'R': Character(True, 82 , 6, 0 ),
|
||
'S': Character(True, 83 , 6, 0 ),
|
||
'T': Character(True, 84 , 6, 0 ),
|
||
'U': Character(True, 85 , 6, 0 ),
|
||
'V': Character(True, 86 , 7, 0 ),
|
||
'W': Character(True, 87 , 8, 0 ),
|
||
'X': Character(True, 88 , 6, 0 ),
|
||
'Y': Character(True, 89 , 6, 0 ),
|
||
'Z': Character(True, 90 , 5, 0 ),
|
||
|
||
# Kis betűk
|
||
'a': Character(True, 97 , 5, 0 ),
|
||
'b': Character(True, 98 , 5, 0 ),
|
||
'c': Character(True, 99 , 5, 0 ),
|
||
'd': Character(True, 100, 5, 0 ),
|
||
'e': Character(True, 101, 5, 0 ),
|
||
'f': Character(True, 102, 4, 0 ),
|
||
'g': Character(True, 103, 5, -3),
|
||
'h': Character(True, 104, 5, 0 ),
|
||
'i': Character(True, 105, 2, 0 ),
|
||
'j': Character(True, 106, 3, -3),
|
||
'k': Character(True, 107, 5, 0 ),
|
||
'l': Character(True, 108, 2, 0 ),
|
||
'm': Character(True, 109, 8, 0 ),
|
||
'n': Character(True, 110, 5, 0 ),
|
||
'o': Character(True, 111, 5, 0 ),
|
||
'p': Character(True, 112, 5, -3),
|
||
'q': Character(True, 113, 5, -3),
|
||
'r': Character(True, 114, 4, 0 ),
|
||
's': Character(True, 115, 5, 0 ),
|
||
't': Character(True, 116, 4, 0 ),
|
||
'u': Character(True, 117, 4, 0 ),
|
||
'v': Character(True, 118, 6, 0 ),
|
||
'w': Character(True, 119, 8, 0 ),
|
||
'x': Character(True, 120, 5, 0 ),
|
||
'y': Character(True, 121, 5, -3),
|
||
'z': Character(True, 122, 5, 0 ),
|
||
|
||
# Magyar ékezetes betűk
|
||
'Á': Character(True, 1 , 7, 0 ),
|
||
'á': Character(True, 2 , 5, 0 ),
|
||
'É': Character(True, 3 , 5, 0 ),
|
||
'é': Character(True, 4 , 5, 0 ),
|
||
'Í': Character(True, 5 , 3, 0 ),
|
||
'í': Character(True, 6 , 3, 0 ),
|
||
'Ó': Character(True, 7 , 6, 0 ),
|
||
'ó': Character(True, 8 , 5, 0 ),
|
||
'Ö': Character(True, 9 , 6, 0 ),
|
||
'ö': Character(True, 10 , 5, 0 ),
|
||
'Ő': Character(True, 11 , 6, 0 ),
|
||
'ő': Character(True, 12 , 5, 0 ),
|
||
'Ú': Character(True, 13 , 6, 0 ),
|
||
'ú': Character(True, 14 , 5, 0 ),
|
||
'Ü': Character(True, 15 , 6, 0 ),
|
||
'ü': Character(True, 16 , 5, 0 ),
|
||
'Ű': Character(True, 17 , 6, 0 ),
|
||
'ű': Character(True, 18 , 5, 0 ),
|
||
|
||
# Görög betűk
|
||
'α': Character(True, 94 , 6, 0),
|
||
'β': Character(True, 95 , 5, 0),
|
||
'γ': Character(True, 96 , 7, 0),
|
||
'Ω': Character(True, 127, 6, 0),
|
||
|
||
# Speciális karakterek
|
||
'\n': Character(False, 0, 0, 0, display=newline)
|
||
}
|
||
|