def __init__(self, name, val, min_max, pos, window, dim=[150, 30]): self.name = name self.val = val self.min_v, self.max_v = min_max self.xpos, self.ypos = pos self.window = window self.width, self.height = dim self.hit = False #Slider background self.surf = pygame.surface.Surface((self.width, self.height)) self.surf.set_alpha(200) self.surf.fill((100, 100, 100)) pygame.draw.rect(self.surf, (255, 255, 255), [1, 1, self.width - 2, self.height - 2], 1) pygame.draw.rect(self.surf, (0, 0, 0), [5, self.height - 9, self.width - 10, 2], 0) pygame.draw.rect(self.surf, (255, 255, 255), [5, self.height - 10, self.width - 10, 4], 1) #Slider text self.FONT = Font('NotoSansMono-Regular.ttf', 10) self.txt_surf, self.txt_rect = self.FONT.render( self.name + f'{self.val:.4}', (255, 255, 255)) #Slider button self.button_surf = pygame.surface.Surface((20, 20)) self.button_rect = self.button_surf.get_rect() self.button_surf.fill((1, 1, 1)) self.button_surf.set_colorkey((1, 1, 1)) pygame.draw.circle(self.button_surf, (255, 255, 255), (10, 10), 3) pygame.draw.circle(self.button_surf, (0, 0, 0), (10, 10), 2)
def main(): parser = argparse.ArgumentParser(description='test font') parser.add_argument('-f', '--font_dir', type=str, required=True) parser.add_argument('-o', '--output_dir', type=str, required=True) args = parser.parse_args() files = filter((lambda x: x.lower().endswith('.ttf')), os.listdir(args.font_dir)) pygame.init() for file in files: try: font = Font(os.path.join(args.font_dir, file), size=24) font.strong = True font.oblique = True font.antialiased = True font.origin = True font.strength = 0.01 surface, _ = font.render(RENDER_TEXT, fgcolor=Color(255, 255, 255, 255), bgcolor=Color(0, 0, 0, 0)) img = pygame.surfarray.array3d(surface) img = np.transpose(img, [1, 0, 2]) # print(img.shape) # cv2.imshow('test', img) # cv2.waitKey() cv2.imwrite(os.path.join(args.output_dir, file + ".png"), img) # print(file, img.shape) except Exception: print(file, "Exception")
def render_inline_text(surface: Surface, text: str, size: int, text_color: Tuple[int, int, int], start_x: int = 0, end_x: int = None, start_y: int = 0, end_y: int = None): width, height = surface.get_size() end_x = end_x or width end_y = end_y or height font = Font(None, size) font.origin = True line_spacing = font.get_sized_height() + 2 x, y = start_x, line_spacing + start_y space = font.get_rect(' ') words = text.split(' ') # render word by word for word in words: bounds = font.get_rect(word) if x + bounds.width + bounds.x >= end_x: x, y = start_x, y + line_spacing if x + bounds.width + bounds.x >= end_x: raise ValueError(f"word too wide for the surface: {text}") if y + bounds.height - bounds.y >= end_y: raise ValueError(f"text to long for the surface: {text}") font.render_to(surface, (x, y), None, text_color) x += bounds.width + space.width return x, y
def render_multiline_text(surface: Surface, text: List[str], size: int, text_color: Tuple[int, int, int], start_x: int = 0, end_x: int = None, start_y: int = 0, end_y: int = None): font = Font(None, size) font.origin = True x, y = start_x, start_y for line in text: x, y = render_inline_text(surface, line, size, text_color, start_x, end_x, y, end_y) return x, y
class Score(object): def __init__(self, asset): self.score = 0 self.old_score = self.score self.collect = asset["effects"]["collects-effects"] self.font = Font(asset["fonts"]["CursedTimerUlil-Aznm"], 20) @property def getScore(self): return self.score def check(self): if self.score < 0: return True def add_score(self): self.score += 1 new_score = self.old_score + 10 if self.score == new_score: self.collect.play() self.old_score = self.score def rescore(self): self.score -= 1 def draw(self, screen): text, rect = self.font.render("Skor: " + str(self.score), (133, 230, 159)) screen.blit(text, rect)
class Score(object): def __init__(self, font_path): self.collect = Sound(COLLECT_BACKSOUND) self.font = Font(font_path, 24) self.score = 0 self.old_score = self.score def add_score(self): self.score += 1 new_score = self.old_score + 10 if self.score == new_score: self.collect.play() self.old_score = self.score def rescore(self): self.score -= 1 def check(self): if self.score < 0: return True else: return False def draw(self, screen): text_surface, rect = self.font.render("Score: " + str(self.score), (133, 230, 159)) screen.blit(text_surface, (10, 10))
def __init__(self, screen, rect, background): init() self.screen = screen self.rect = rect self.background = background self.font = Font(TITLE_FONT, 40) self.font_start = Font(PRESS_START_FONT, 15) self.font_author = Font(PRESS_START_FONT, 12) self.font_information = Font(INFORMATION_FONT, 8) self.gamelan_music = music.load(GAMELAN_BACKSOUND) self.click_sound = Sound(CLICK_BACKSOUND)
def _get_font(font, bold, italic) -> Font: if not font: if DEFAULT_FONT: font = DEFAULT_FONT else: font = SysFont('', 0, bold, italic) elif isinstance(font, str): font = SysFont(font, 0, bold, italic) else: font = Font(font, 0, 4) return font
def __init__(self, disk_images: List[str] = []): self.disk_images: List[str] = disk_images self.buffer: bytearray = bytearray([32 for _ in range(80 * 24)]) self.cursor: int = 0 self.esc_sequence: bytes = b'' pygame.init() pygame.display.set_caption('CP/M') pygame.key.set_repeat(1000, 100) self.screen: Surface = pygame.display.set_mode( (80 * 10 + 2 * self.margin, 24 * 20 + 2 * self.margin)) self.font: Font = Font('BmPlus_Rainbow100_re_80.otb', 24) self.blink_rate: int = 750
def word_wrap(self, text, size, text_color, margin): font = Font(None, size) font.origin = True words = text.split(' ') width, height = self.image.get_size() line_spacing = font.get_sized_height() + 2 x, y = 0, line_spacing + margin space = font.get_rect(' ') for word in words: bounds = font.get_rect(word) if x + bounds.width + bounds.x >= width: x, y = 0, y + line_spacing if x + bounds.width + bounds.x >= width: raise ValueError("word too wide for the surface") if y + bounds.height - bounds.y >= height: raise ValueError("text to long for the surface") font.render_to(self.image, (x, y), None, text_color) x += bounds.width + space.width return x, y
def font(cls, fontname, size, foreground, background=None, font_index=0, resolution=0, ucs4=False): font = Font(fontname, size, font_index, resolution, ucs4) return cls(font, foreground, background)
import sys import pygame.freetype from pygame import Surface from pygame.freetype import Font from pygame.locals import * import tween pygame.init() DISPLAY_SURF: Surface = pygame.display.set_mode((500, 400), 0, 32) pygame.display.set_caption("Best game") FPS = 60 clock = pygame.time.Clock() text: Font = Font("assets/fonts/Chunkfive/Chunkfive.otf", 32) textSurface, textRect = text.render("Hello there", Color(120, 0, 120)) textRect.center = (100, 100) tw = tween.Tween(textRect, 800) tw.set_attr("centery", 100, 200) tw.set_attr("centerx", 100, 200) tw.set_pingpong() tw.start() while True: delta = clock.tick_busy_loop(FPS) tw.update(delta) DISPLAY_SURF.fill(WHITE) DISPLAY_SURF.blit(textSurface, textRect)
from pygame.freetype import Font import pygame from math import sqrt pygame.freetype.init() WINDOW_WIDTH, WINDOW_HEIGHT = 1280, 800 FPS = 60 FONT = Font('fonts/slkscr.ttf') def rotate_center(surface, angle, pos): to_draw = pygame.transform.rotate(surface, angle) new_rect = to_draw.get_rect(center=surface.get_rect( topleft=(pos[0], pos[1])).center) return to_draw, new_rect def convert_to_prefix(number, decimal=True): if number >= 1e9: return f'{round(number/1e9, 2)}B' elif number >= 1e6: return f'{round(number/1e6, 2)}M' elif number >= 1e3: return f'{round(number/1e3, 2)}k' return float(number) if decimal else number def distance_two_points(x1, y1, x2, y2):
def __init__(self, asset): self.score = 0 self.old_score = self.score self.collect = asset["effects"]["collects-effects"] self.font = Font(asset["fonts"]["CursedTimerUlil-Aznm"], 20)
title_bar_rect = (0, 0, WIDTH, 30) mini_ship = shipsheet.get_image_advanced((0, 192, 32, 50), (20, 20)) mini_bomb = SpriteSheet(osp.join(IMAGES_FOLDER, "powerups", "bomb.png") ).get_image_advanced(size=(15, 25)) SOUNDS = {} for f in glob(osp.join(SOUNDS_FOLDER, "sound_tracks", "**")): sound = pg.mixer.Sound(f) sound.set_volume(0.3) SOUNDS[osp.basename(f).split('.')[0]] = sound # fonts font_file = osp.join(GAME_FOLDER, "fonts", "a_Concepto.ttf") aconcepto100 = Font(font_file, 100) aconcepto26 = Font(font_file, 26) aconcepto20 = Font(font_file, 20) aconcepto14 = Font(font_file, 14) # delete unused names del f, font_file, sound, info, Font # the game class Game: def __init__(self): with open("highscore.txt", 'r') as hsf: try: self.highscore = int(hsf.read())
class Slider(): """ Slider code lifted from https://www.dreamincode.net/forums/topic/401541-buttons-and-sliders-in-pygame/ """ def __init__(self, name, val, min_max, pos, window, dim=[150, 30]): self.name = name self.val = val self.min_v, self.max_v = min_max self.xpos, self.ypos = pos self.window = window self.width, self.height = dim self.hit = False #Slider background self.surf = pygame.surface.Surface((self.width, self.height)) self.surf.set_alpha(200) self.surf.fill((100, 100, 100)) pygame.draw.rect(self.surf, (255, 255, 255), [1, 1, self.width - 2, self.height - 2], 1) pygame.draw.rect(self.surf, (0, 0, 0), [5, self.height - 9, self.width - 10, 2], 0) pygame.draw.rect(self.surf, (255, 255, 255), [5, self.height - 10, self.width - 10, 4], 1) #Slider text self.FONT = Font('NotoSansMono-Regular.ttf', 10) self.txt_surf, self.txt_rect = self.FONT.render( self.name + f'{self.val:.4}', (255, 255, 255)) #Slider button self.button_surf = pygame.surface.Surface((20, 20)) self.button_rect = self.button_surf.get_rect() self.button_surf.fill((1, 1, 1)) self.button_surf.set_colorkey((1, 1, 1)) pygame.draw.circle(self.button_surf, (255, 255, 255), (10, 10), 3) pygame.draw.circle(self.button_surf, (0, 0, 0), (10, 10), 2) def draw(self): """ Draws the slider. """ surf = self.surf.copy() x = 5 + int((self.val - self.min_v) / (self.max_v - self.min_v) * (self.width - 10)) y = self.height - 8 self.button_rect = self.button_surf.get_rect(center=(x, y)) surf.blit(self.button_surf, self.button_rect) self.button_rect.move_ip(self.xpos, self.ypos) x, y = self.surf.get_rect().center self.txt_rect = self.txt_surf.get_rect(center=(x, y - 4)) surf.blit(self.txt_surf, self.txt_rect) self.window.blit(surf, (self.xpos, self.ypos)) def move(self): """ Moves the slider handle and updates text. """ self.txt_surf, _ = self.FONT.render(self.name + f'{self.val:.4}', (255, 255, 255)) self.val = ((pygame.mouse.get_pos()[0] - self.xpos - 5) / (self.width - 10) * (self.max_v - self.min_v)) + self.min_v self.val = np.clip(self.val, self.min_v, self.max_v)
class StartGame(object): def __init__(self, screen, rect, background): init() self.screen = screen self.rect = rect self.background = background self.font = Font(TITLE_FONT, 40) self.font_start = Font(PRESS_START_FONT, 15) self.font_author = Font(PRESS_START_FONT, 12) self.font_information = Font(INFORMATION_FONT, 8) self.gamelan_music = music.load(GAMELAN_BACKSOUND) self.click_sound = Sound(CLICK_BACKSOUND) def load_image(self, path, convert_alpha=False, convert=True): try: resource = PyGameImageLoad(path) except PyGameErrorException: print("duarrr") exit(0) if convert: return resource.convert() elif convert_alpha: return resource.convert_alpha() else: return resource def run(self): clock = Clock() music.play() text_surface, rect = self.font.render("Pocong Runner", (150, 51, 51)) author_surface, author_rect = self.font_author.render( "@billalxcode", (255, 255, 255)) author_rect.center = self.rect.center author_rect.bottom += 165 start_text_surface, start_rect = self.font_start.render( "Tekan enter untuk memulai...", (255, 255, 255)) info_surface, info_rect = self.font_information.render( "* Jika anda mengklaim pemilik dari font/gambar silahkan chat pembuat. Terima kasih telah mendukung saya.", (255, 255, 255)) info_rect.bottom += self.rect.height - 20 blink_rect = start_rect blink_rect.center = self.rect.center blink_rect.bottom += 150 while True: for event in get(): if event.type == QUIT: return True elif event.type == KEYDOWN: self.click_sound.play() if event.key == K_SPACE or event.key == 13: return False self.screen.blit(self.background, (0, 0)) self.screen.blit(author_surface, author_rect) self.screen.blit(text_surface.convert_alpha(), (self.rect.width / 2, 100)) self.screen.blit(start_text_surface, blink_rect) self.screen.blit(info_surface, info_rect) clock.tick(60) update()
def __init__(self, font_path): self.collect = Sound(COLLECT_BACKSOUND) self.font = Font(font_path, 24) self.score = 0 self.old_score = self.score
def set_default_font(font): global DEFAULT_FONT if not font: DEFAULT_FONT = None else: DEFAULT_FONT = Font(font, 0)
def introGame(screen, asset, data): #=== Background image ===# logs.info("Mengatur latar belakang...") bg = scale(asset["backgrounds"]["intro"], (config.getRect.size)) #=== Button play image ===# logs.info("Mengatur button...") btn_play = asset["other"]["btn-play2"] btn_play = scale( btn_play, (int(btn_play.get_width() / 2), btn_play.get_height() - 100)) btn_play_center = btn_play.get_rect() btn_play_center.center = config.getRect.center #=== button keluar image ===# btn_keluar = asset["other"]["btn-keluar2"] btn_keluar = scale( btn_keluar, (int(btn_keluar.get_width() / 2), btn_keluar.get_height() - 100)) btn_keluar_center = btn_keluar.get_rect() btn_keluar_center.center = config.getRect.center btn_keluar_center.bottom += 100 #=== Button settings image ===# btn_settings = asset["other"]["btn-settings2"] btn_settings = scale( btn_settings, (int(btn_settings.get_width() / 2), btn_settings.get_height() - 100)) btn_settings_center = btn_settings.get_rect() btn_settings_center.center = config.getRect.center btn_settings_center.bottom += 50 #=== Button credits image ===# btn_credits = asset["other"]["btn-credits"] btn_credits = scale(btn_credits, (100, 100)) btn_credits_center = btn_credits.get_rect() btn_credits_center.center = config.getRect.center btn_credits_center.bottom = config.getRect.height btn_credits_center.right = config.getRect.width btn_close = asset["other"]["btn-close"] btn_close = scale(btn_close, (100, 100)) btn_close_center = btn_close.get_rect() btn_close_center.center = config.getRect.center btn_close_center.bottom = config.getRect.height btn_close_center.right = config.getRect.width #=== Settings coint image ===# coint_image = asset["other"]["coint"] coint_image = scale(coint_image, (40, 40)) coint_image.set_colorkey("black") coint_rect = coint_image.get_rect() #=== Window credit image ===# win_credits = asset["other"]["credits2"] win_credits = scale(win_credits, (500, 500)) win_credits.set_colorkey("black") win_credits_center = win_credits.get_rect() win_credits_center.center = config.getRect.center #=== Font warning ===# logs.info("Mengatur teks peringatan") info = Font(asset["fonts"]["AboveDemoRegular-lJMd"], 10) info_text, info_rect = info.render( "*Jika anda mengklaim pemilik dari asset game ini, silahkan hubungi pembuat.", (255, 255, 255)) info_rect.bottom = config.getRect.height #=== Font coint ===# logs.info("Mengatur teks coint") id, coint, name = data font_coint = Font(asset["fonts"]["PressStart2P"], 20) coint_text, coint_text_rect = font_coint.render(str(coint), (255, 255, 255)) coint_text_rect.bottom = 28 coint_text_rect.right += 45 credit_window = False running = True while running: events = core.events() if events["type"]["quit"]: return False elif events["type"]["mousedown"]: if events["keys"]["button"] == 1: if not credit_window: if btn_play_center.collidepoint(get_pos()): asset["effects"]["click-effects"].play() return True elif btn_settings_center.collidepoint(get_pos()): asset["effects"]["click-effects"].play() credit_window = True elif btn_keluar_center.collidepoint(get_pos()): asset["effects"]["click-effects"].play() return False elif btn_credits_center.collidepoint(get_pos()): asset["effects"]["click-effects"].play() credit_window = True else: if btn_close_center.collidepoint(get_pos()): asset["effects"]["click-effects"].play() credit_window = False screen.blit(bg, (0, 0)) if credit_window: screen.blit(win_credits, win_credits_center) screen.blit(btn_close, btn_close_center) else: screen.blit(btn_play, btn_play_center) screen.blit(btn_keluar, btn_keluar_center) screen.blit(btn_settings, btn_settings_center) screen.blit(btn_credits, btn_credits_center) screen.blit(coint_image, coint_rect) screen.blit(coint_text, coint_text_rect) screen.blit(info_text, info_rect) update()