Wie implementiere ich Variationen in Schriftarten wie Handschrift?

7

Ich kann ein Sprite-Blatt verwenden, um automatisch eine benutzerdefinierte Schriftart zu verwenden. Was ich jedoch tun möchte, ist, mehrere Versionen jedes Buchstabens zu haben, so dass die Buchstaben variiert werden können und natürlicher aussehen (a la Handschrift). Ich weiß nicht genau, wie Schriftarten intern implementiert werden, aber ich gehe davon aus, dass es einige Funktionen gibt, die Zeichen Zeichen zuordnen. Es scheint, als wäre es nicht schwierig, diese Funktion zufällig auszuwählen, wenn diese Funktion nicht versiegelt ist, eines der "gleichen" Bilder (mit geringfügigen Abweichungen) auszuwählen.

Kennt jemand die Plausibilität dieses / welchen Codes würde ich überladen wollen, damit dies mit der vorhandenen Schriftinfrastruktur in xna funktioniert?

Akroy
quelle
2
Wenn Sie den vorhandenen Code zum Rendern von Schriftarten verwenden, hängt die Schwierigkeit vollständig von der Komplexität dieses Codes und Ihrem Zugriff darauf ab. Wenn Sie es jedoch selbst implementieren, deckt die Antwort von Tim Holt die Grundlagen ab.
Kylotan

Antworten:

3

Grundsätzlich ist dies nur eine Programmierfrage, wenn Sie dies abstrahieren. Wenn Sie dies wirklich mit Sprite-Blättern tun möchten, kann ich dies in einem schnellen Pseudocode im JavaScript-Stil tun ...


// -------------------------------------------------------------------------
// --- Array of sprite sheet offset for letter variants, indexed by letter
// --- Note that it would be pretty easy to dynamically generate sprite 
// --- coordinates if you are certain your sheet has all the symbols you
// --- are looking for.
// -------------------------------------------------------------------------
var font_variants = [
  {'a' : {x:0,y:0}, 'b' :  {x:16, y:0},  'c':{x:32, y:0}, ...,  'z':{x:400, y:0}},
  {'a' : {x:0,y:16}, 'b' : {x:16, y:16}, 'c':{x:32, y:16}, ..., 'z':{x:400, y:16}},
  {'a' : {x:0,y:32}, 'b' : {x:16, y:32}, 'c':{x:32, y:32}, ..., 'z':{x:400, y:32}}
];

// -------------------------------------------------------------------------
// --- Call this function with a string to render randomized style text
// -------------------------------------------------------------------------
function render_it (text) {
    // --- Step through each letter in the text
    for (var i=0; i<text.length; i++) {
        // --- Randomly pick one of 3 variants
        var r = Math.random(3);
        // --- If letter is in our set, show it
        if font_variants[r].hasOwnProperty(text[i]) {
            // --- We have the letter
            letter_sprite = get_letter_sprite(font_variants[r][text[i]].x, font_variants[r][text[i]].y);
            // --- Display the letter here however you want to
        } else {
            // --- Requested letter not found
            // --- Handle as you see fit
        }
    }
}

Ich habe nur ein Beispiel für Kleinbuchstaben eingegeben, sodass Sie bei Bedarf weitere hinzufügen müssen. Es wird auch eine Funktion "get_letter_sprite" angenommen, die bei Übergabe eines X- und Y-Offsets ein Sprite an der angegebenen Stelle von einem Sprite-Blatt (aus Buchstaben) zurückgibt.

Tim Holt
quelle
Dies funktioniert nur für Monospace, nicht für Handschrift. Es kann auch Keming verursachen .
Anko
Ich bin mit dem Programmieren vertraut, aber wissen Sie, was man im XNA-Framework überschreiben würde, um mit dem vorhandenen Schriftcode zu arbeiten? Wie in, das ist mehr oder weniger das, was ich hatte, ich bin mir einfach nicht sicher, wo ich es hinstellen soll. (Ich kann leicht meinen eigenen Renderer erstellen, aber ich dachte, es könnte eine elegantere Option geben)
Akroy
4

Ich habe das noch nicht ausprobiert, daher wären einige Experimente erforderlich, um festzustellen, ob es tatsächlich funktioniert.

Was ich tun würde:

Beginnen Sie mit einem vektorisierten Format, das der Zeichenrichtung folgt. Beispielsweise könnten die Hershey-Schriftarten - die Schriftarten "scripts" und "scriptc" - ein guter Ausgangspunkt sein:

Geben Sie hier die Bildbeschreibung ein

Anstatt die Schriftarten als Liniensegmente zu zeichnen, rendern Sie sie als Splines. Schätzen Sie die Geschwindigkeit des Stifts und das Über- / Unterschießen durch zufällige (oder periodische) Beträge. Versuchen Sie, Fehler zu korrigieren, wie Sie es beim eigentlichen Schreiben tun würden (damit sich die Fehler im Text nicht zufällig zusammenballen).

Wenn Sie dies ausprobieren, würde ich gerne die Ergebnisse sehen =)

Jari Komppa
quelle