Anonymous1
Anonymous1

Reputation: 55

Resize proportionally to the screen

I have the problem with pygame. Specifically, I stuck on how to resize the text proportionally to the window (window is re-sizable and with picture).

Here is my code.

import pygame
from pygame.locals import *
import numpy as np
import matplotlib.pyplot as plt
import argparse
import threading, os, sys, time

pygame.init()
pygame.display.set_caption("AI Battlehip Game")
FPS = pygame.time.Clock()

red = (255,0,0)

screen = pygame.display.set_mode((1200,700), HWSURFACE|DOUBLEBUF|RESIZABLE)
add_screen = screen.copy()
back_end_image_set = pygame.image.load(r'/Users/User1/Desktop/Project work/images/backgroundimage1.jpg') 
screen.blit(pygame.transform.scale(back_end_image_set, (1200,700)), (0,0))
pygame.display.flip()


myFont = pygame.font.SysFont("monospace", 300)
label = myFont.render("Check 1", 40, (red))
add_screen.blit(pygame.transform.scale(label, (700, 500)), (0,0))

FPS.tick(60)

try:                                                   
    while True:
        pygame.event.pump()
        event = pygame.event.wait()
        if event.type == QUIT:
            pygame.display.quit()
        elif event.type == VIDEORESIZE:
            screen = pygame.display.set_mode(event.dict['size'], HWSURFACE|DOUBLEBUF|RESIZABLE)
            screen.blit(pygame.transform.scale(back_end_image_set, event.dict['size']), (0,0))
            pygame.display.flip()
except:
    raise

Any help will be fully appreciated.

Upvotes: 4

Views: 343

Answers (1)

Rabbid76
Rabbid76

Reputation: 210878

First store the original size of the surface:

original_size = (1200,700)
screen = pygame.display.set_mode(original_size, HWSURFACE|DOUBLEBUF|RESIZABLE)

Then you've 2 options.

Option 1:

Use pygame.font and render the text to a surface:

myFont = pygame.font.SysFont("monospace", 300)
label = myFont.render("Check 1", 40, (red))

Scale the text surface by the ratio of the new window size and original window size and blit it to the surface:

pygame.event.pump()
event = pygame.event.wait()
if event.type == QUIT:
    pygame.display.quit()
elif event.type == VIDEORESIZE:
    screen = pygame.display.set_mode(event.dict['size'], HWSURFACE|DOUBLEBUF|RESIZABLE)

    new_size = event.dict['size']
    screen.blit(pygame.transform.scale(back_end_image_set, new_size), (0,0))

    label_w = label.get_width() * new_size[0] // original_size[0]
    label_h = label.get_height() * new_size[1] // original_size[1]

    screen.blit(pygame.transform.scale(label, (label_w, label_h)), (0,0))
    pygame.display.flip()

Option 2:

Use pygame.freetype:

import pygame.freetype

myFont = pygame.freetype.SysFont('monospace', 30)

Calculate the scaled size of the text area and render it directly to the resized screen. Note the text is scaled by the ratio of the new window width and original window width. This implementation keeps the ration of the width and height of the text and doesn't stretch or squeeze the text:

pygame.event.pump()
event = pygame.event.wait()
if event.type == QUIT:
    pygame.display.quit()
elif event.type == VIDEORESIZE:
    screen = pygame.display.set_mode(event.dict['size'], HWSURFACE|DOUBLEBUF|RESIZABLE)

    new_size = event.dict['size']
    screen.blit(pygame.transform.scale(back_end_image_set, new_size), (0,0))

    myFont.render_to(screen, (0, 0), "Check 1", fgcolor=red, size = 300 * new_size[0] // original_size[0])
    pygame.display.flip()

Upvotes: 2

Related Questions