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) }