Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: pygame teksti ongelma

a karppinen [31.08.2022 16:22:07]

#

Mistähän mahtaa johtua että pygame piirtää joskus tekstejä eri kohtiin? Siis eri tietokoneilla ja myös käyttöjärjestelmillä näyttää olevan eroja.

Eli jos säätää tekstit näkymään oikein esim linuxilla saattaa toisella koneella tekstit piirtyä taas hieman eri tavalla.

Resoluution ym vaihto ei vaikuta asiaan.

Vikaa on vaikea korjata koska jos kalibroin tekstit piirtymään oikeaan kohtaan piirtyy ne toisella koneella taas väärin.

Ja vika on nimenomaan teksteissä ei esimerkiksi kuvissa.

Ohjelmointiputkaan ei voi liittää kuvankaappausta mutta alhaalla koodinpätkä jossa vika esiintyy. Nuo kordinaatiston kirjaimet piirtyvät liian leveästi.

import pygame

#testiohjelma


pygame.init() #alustetaan pygame moduuli
naytto = pygame.display.set_mode((900, 700)) #luodaan ikkuna
pygame.display.set_caption("Laivanupotus") #nimetään ikkuna


def ruudukko(naytto):
    '''
    Pygamea hyödyntävä funktio joka piirtää ruudukon
    '''

    fontti = pygame.font.SysFont("arial", 32) #ladataan fontti
    kirjaimet = fontti.render(" a    b    c    d    e    f    g    h    i    j", True, (0, 0, 0))  #luodaan tekstiä vastaava kuva
    teksti = fontti.render("Pelaajan laivat", True, (0, 0, 0))  #luodaan tekstiä vastaava kuva
    teksti2 = fontti.render("Vihollisen laivat", True, (0, 0, 0))  #luodaan tekstiä vastaava kuva
    laatikko = 40 #laatikon koko

    for x in range(40, 440, laatikko): #mistä mihin ruudukko pirretään levyssuunnassa
        for y in range(40, 440, laatikko): #pystysuunnassa
            rect = pygame.Rect(x, y, laatikko, laatikko)
            pygame.draw.rect(naytto, (255,255,255), rect, 1)

    #piirretään toinen ruudukko
    for x in range(480, 880, laatikko): #mistä mihin ruudukko pirretään levyssuunnassa
        for y in range(40, 440, laatikko): #pystysuunnassa
            rect = pygame.Rect(x, y, laatikko, laatikko)
            pygame.draw.rect(naytto, (255,255,255), rect, 1)

    #########################
    #piirtää kordinaatiston
    naytto.blit(kirjaimet, (40, 0)) #piirtää kirjaimet
    for i in range(1,11): #piirtää numerot
        numero = fontti.render(str(i), True, (0,0,0))
        naytto.blit(numero, (5, i * 40)) #piirtää numerot

    #piirretään toisenkin ruudunkon ympärille kirjaimet ja numerot
    naytto.blit(kirjaimet, (480, 0)) #piirtää kirjaimet
    for i in range(1,11): #piirtää numerot
        numero = fontti.render(str(i), True, (0,0,0))
        naytto.blit(numero, (445, i * 40)) #piirtää numerot

    naytto.blit(teksti, (50, 450)) #piirtää teksti
    naytto.blit(teksti2, (480, 450)) #piirtää teksti2




while True: #pääsilmukka

    naytto.fill((77,136,255)) #asetetaan taustan väri
    ruudukko(naytto) #kutsuu funktiota
    pygame.display.flip() #päivittää näytön

Onko muilla ollut vastaavaa ongelmaa tai onko siihen olemassa mitään järkevää ratkaisua?

Grez [31.08.2022 16:43:13]

#

No mua ainakin hämää tää kohta:

a karppinen kirjoitti:

fontti = pygame.font.SysFont("arial", 32)

Mistä tiedät että koneella on arial -fontti?

Mistä tiedät että jokaisella koneella oleva "arial" niminen fontti on esimerkiksi leveydeltään sama?

No, ehkäpä toimitat tuon fontin pelin mukana, ja käyttäjä asentaa sen :hmm

Ja ihmettelen myös tätä:

a karppinen kirjoitti:

kirjaimet = fontti.render(" a    b    c    d    e    f    g    h    i    j", True, (0, 0, 0))

Eikö olisi helpompaa tulostaa kukin kirjain sopivaan kohti kuin tulostaa kirjaimia ja välilyöntejä ja toivoa että ne tuurilla osuu oikeisiin kohtiin?

a karppinen [31.08.2022 17:04:56]

#

Joo pitää varmaan alkaa laittamaan fonttitiedosto mukaan jos ei muu auta. Vai tuleekohan tuossa pygamen mukana joku fontti mitä se käyttää oletuksena.

jalski [31.08.2022 19:56:37]

#

Grez kirjoitti:

Eikö olisi helpompaa tulostaa kukin kirjain sopivaan kohti kuin tulostaa kirjaimia ja välilyöntejä ja toivoa että ne tuurilla osuu oikeisiin kohtiin?

Samaa mieltä tästä. Luulisi pygame:lla olevan mahdollista selvittää merkkijonon mitat halutulle fontille ja muodostaa tuosta suorakaide. Nyt, kun piirrät ruudukkoa niin olisi helppo keskittää tuo tekstin vaatima suorakaide ruudukon ruudun suorakaiteen kanssa ja piirtää teksti tuohon.

Tällöin teksti on aina oikeassa kohdassa eikä haittaa vaikka ei käyttäisi monospace fonttia.

Mariapori [03.10.2022 07:53:33]

#

Joo linuxissa ei oo Arial fonttia niin saattaa käyttää jotain aivan muuta.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta