[pygame] PixelFont - pixelige Buchstaben schreiben

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
DelphiMarkus
User
Beiträge: 23
Registriert: Samstag 19. April 2008, 13:27
Wohnort: Münsterland

Hallo!

Ich arbeite momentan an einem (wenn man so will Retro-)Spiel mit pygame, das schöne pixelige Grafiken hat. Damit das pixelige auch wirklich konsequent überall wiederzufinden ist, habe ich eine kleine Klasse geschrieben, die die Buchstaben aus einem Bitmap extrahiert und vergrößert. Wenn die Schrift fertig erstellt und vergrößert wurde kann man einfach einen String auf ein Surface schreiben lassen. Dabei sind sowohl farbige Vorder- und Hintergründe als auch ein transparenter Hintergrund möglich.

Leider habe ich keinen Support für Unicode eingebaut. Ich habe mich leider noch nie wirklich mit dem Thema beschäftigt. Ich würde dafür aber gerne Support einbauen, da man schließlich auch als Deutscher nicht komplett mit den paar ASCII-Zeichen zufrieden sein kann. Ein "ä" ist schließlich schöner als ein "ae". Ich werde mich bald mal nach Anleitungen umschauen um auch Unicode zu unterstützen.
Ein Beispiel fehlt übrigens auch noch...

Es würde mich freuen, wenn ihr mir aber jetzt schonmal sagt, was ihr so von dieser Klasse haltet. Spart bloß nicht mit konstruktiver Kritik. (Auch was die Wahl der Begriffe angeht, dieses Modul ist mein erstes, das ich mal nur auf Englisch geschrieben habe. Anders gesagt habe ich es von einem Misch aus Englisch und Deutsch nach Englisch übersetzt ;) )
Zumindest PyLint meckert an ein paar Stellen, dass ich map() verwendet habe. Wie ich gelesen habe mag PyLint wohl List-Comprehensions lieber, aber da ich map(str, ...) verwende, also ein builtin, sollte das doch eigentlich auch in Ordnung sein, oder?

Hier nun der Code: http://pastebin.com/kh9MinAA (paste.pocoo.org ist ja leider abgestellt worden, aber das ist ein anderes Thema...)

Eine neue Schrift erzeugt man wie folgt:

Code: Alles auswählen

# ASCII-Font erzeugen (über charorder kann die Formatierung geändert werden)
font = PixelFont('bilder/Schriftart.png', (8, 8), scale=4)

# Auf das Surface screen schreiben:
font.foreground_color = pygame.Color('black')
font.background_color = pygame.Color('white')
font.write(screen, 'Hi! Wie gehts?\nNaja...', (0, 0))
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Warum hast du überhaupt eine Bitmap aus der du die Schrift lädst? Ich würde einfach die benötigten Buchstaben in eine Surface zeichnen. Diese kannst du dann entsprechend nachbearbeiten und anzeigen.
Das Leben ist wie ein Tennisball.
DelphiMarkus
User
Beiträge: 23
Registriert: Samstag 19. April 2008, 13:27
Wohnort: Münsterland

Hi EyDu!

Da bin ich ehrlich gesagt zwar nicht drauf gekommen, aber ich habe es eben mal kurz ausprobiert. Es geht wohl, aber so richtig schön ist das auch nicht unbedingt. Ich nehme DejaVu Sans Mono aus Schriftart, Schriftgröße 8, rendere einen Text damit und vergrößere ihn. Die Breite und Höhe waren dabei jeweils 10 Pixel beim Wort "Hi". Das ist mir ehrlich gesagt etwas zu viel herumgefrickel, weil ich die Schriftgröße so anpassen müsste, dass ich (eigene Vorgabe für das Spiel) 8 Pixel in der Höhe für jeden Buchstaben habe. Das geht mit meiner Klasse etwas komfortabler als mit dem font-Modul von pygame.
Der pixelige Charakter ist mein Hauptaugenmerk was die Grafik meines Spiels angeht und für genau dieses habe ich das Modul ja geschrieben. Ich hab mir nur gedacht, dass das Modul auch anderen nützen könnte.

Ach ja: Ich benutze ein Bitmap, weil ich vorhabe meine eigene Schriftart einzubauen und da ich, was das Künstlerische angeht, mit 8x8 oder 16x16 Pixel großen Bildern einfach besser zurechtkomme als mit Vektorzeichnungen. :D (Es geht im übrigen auch schneller und absturzfreier als wenn ich fontforge benutze)

Die geplanten Features enthalten momentan:
  • Unicode-Support
  • Zeilenumbruch bei zu langen Zeilen
Mal sehen wann ich dazu komme. Zumindest hat sich das Modul für mich spätestens dann gelohnt, wenn ich mich nun mal etwas mit Unicode auseinandersetze. Bin ja sonst doch zu faul dazu... :roll:
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Du musst dein Modul ja auch nicht wegwerfen, das Wesentliche kannst du ja beibehalten. Du muss lediglich die Zeichen auf eine Surface zeichnen, danach kannst du doch dein Modul wie bisher einsetzen. Im Prinzip musst du also nur das Laden aus einer Datei ändern in das Rendern in eine Textur. Ok, ein wenig arbeit besteht noch darin das ganze dynamisch zu machen, so dass nicht alle Zeichen am Anfang als Textur erstellt werden, sondern immer nur die benötigten erzeugt werden. Das ist aber eigentlich eine triviale Aufgabe.

Eigentlich sehe ich aber für dich gar keine Alternative als den vorgeschlagenen Weg, da du irgendwann die Unicodeanforderung erfüllen musst. Und ich möchte die Textur sehen, in der alle unterstützten Zeichen eingebaut sind. Die könnte in der Größe etwas ausarten ;-) Natürlich kannst du dich jetzt auf eine Auwahl von Zeichen beschränken, aber das wird wahrscheinlich nicht weniger Arbeit nach sich ziehen.
Das Leben ist wie ein Tennisball.
Antworten