Ergebnis 1 bis 7 von 7

Thema: [XP- Script] Brauche Hilfe bei Bitmap Fonts

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Zitat Zitat
    Darüber hatte ich auch schon nachgedacht... Allerdings verträgt sich das dann nicht mit einer anderen Sache, und zwar dass der Spieler selbst schreiben können soll...
    Dafür bietet aber Ruby eine Lösung, die String-Methode gsub, mit denen du alle Vorkommen eines Musters in einem String durch etwas anderes ersetzen kannst.
    PHP-Code:
    # Angenommen text ist eine Variable, die den String enthält, den der Benutzer eingeben hat.
    # Zum korrekten Zeichnen müsste das Zeichen 'ß' durch '<' ersetzt werden dann würde man dies mit folgendem Aufruf erreichen:
    text2 text.gsub('ß''<')
    # Beispiel:
    text "Dieß ißt nur ein Teßttext ohne Anßpruch auf richtige Rechtßchreibung"
    text2 text.gsub('ß''ss')
    # text2 => "Diess isst nur ein Tessttext ohne Ansspruch auf richtige Rechtsschreibung"

    # Allgemein funktioniert gsub folgendermaßen:
    str.gsub(patternreplacement)
    # Die Funktion durchsucht den gesamten String "str" auf Vorkommnisse von 'pattern', 
    # wobei Pattern entweder eine Regular Expression ist (RegExp) oder einfach selbst nur ein String und ersetzt alle gefunden Vorkommnisse durch 'replacement' und liefert den neuen String zurück. 
    # str selbst bleibt dabei unverändert.
    # Es gibt dann noch die Funktion gsub! die genau dasselbe macht, aber die Änderungen dabei am Objekt selber durchführt. (Und nil zurück gibt, falls pattern nicht gefunden wurde) 
    Du kannst also die Eingabe des Nutzers nehmen, durch gsub jagen um die nötigen Ersetzungen für die Anzeige per Bitmap-Font zu machen und dabei den Text noch in der unveränderten Version behalten, falls du ihn mittels normaler Fonts anzeigen willst.

  2. #2
    Kann man nun aus dem Skript sowas machen? Ode rist das mit diesem Script eher hoffnungslos?

  3. #3
    Das ist Script ist zwar recht umständlich geschrieben, aber soweit ich das sehe gibt es bereits die Buchstaben 'ä', 'ü' usw. Nur das 'ß' fehlt, kann man ja noch hinzufügen. Einfach in Zeile 507 in dem riesigen irrsinnigen Case-Statement ein
    Code:
    when 'ß'
          value = 97
    einfügen (wtf? warum nimmt man dafür keinen Hash ;__ und MAX_CHARS auf 101 setzen.

    Das eigentliche Problem, warum es nicht funktioniert: Ruby 1.8 arbeitet nur auf Bytestrings und nicht auf Kodierungen. Darum kann man nicht auf einzelne Zeichen eines Strings zugreifen, sondern nur auf einzelne Bytes. Für einen Amerikaner ist das ziemlich uninteressant, weil die Buchstaben des englischen Alphabets in einem Byte kodiert sind. Nun sind aber alle Strings im Maker in UTF-8 kodiert. Und deutsche Umlaute haben in UTF-8 die Länge 2 Bytes. Darum schlägt das Script fehl, wenn es nur einzelne Bytes abfragt.
    Es gibt da aber einen Trick: Reguläre Ausdrücke können in Ruby mit UTF-8 Kodierung umgehen. Mit ihnen lassen sich Bytestrings in einzelne Charakter-Arrays zerlegen.

    Da wäre einmal die Methode text_size. Korrigiert sieht sie so aus:
    Code:
    def text_size(str)
        chars = str.scan(/./) # wandle Bytestring in Char-Array um
        if self.font.text_type == 0
          ExtraFont.add_bitmap_text_pos(self.font.bitmap_name)
          bitmap_pos = ExtraFont.get_bitmap_text_pos(self.font.bitmap_name)
          width = 0
          font_size = self.font.bitmap_size / 100
          height = bitmap_pos.height * font_size
          chars.each do |char|
            src_rect = ExtraFont.get_char_rect(char, self.font.bitmap_name)
            dw = src_rect.width * font_size
            width += dw + 1
          end
          if width > 0
            width -= 1
          end
          return Rect.new(0, 0, width, height)
        else
          normal_text_size(str)
        end
      end
    Und dann die Methode draw_bitmap_text:

    Code:
    def draw_bitmap_text(x, y, width, height, text, align=0)
        ExtraFont.add_bitmap_text_pos(self.font.bitmap_name)
        bitmap_pos = ExtraFont.get_bitmap_text_pos(self.font.bitmap_name)
        src_bitmap = bitmap_pos.fBitmap.clone
        drawx = 0
        font_size = self.font.bitmap_size / 100
        font_hue = self.font.bitmap_hue
        dh = bitmap_pos.height * font_size
        b_height = bitmap_pos.border_height * font_size
        max_dw = bitmap_pos.max_char_width * font_size
        dum_width = [max_dw * text.size, 32].max
        dum_height = [dh, 32].max
        dummy = Bitmap.new(dum_width, dum_height)
        src_bitmap.hue_change(font_hue) if font_hue != 0
        #Go through each char in string and draw the letter from the bitmap
        chars = text.scan(/./)
        chars.each do |char|
          src_rect = ExtraFont.get_char_rect(char, self.font.bitmap_name)
          w = src_rect.width
          h = src_rect.height
          dw = w * font_size
          dest_rect = Rect.new(drawx, 0, dw, dh)
          dummy.stretch_blt(dest_rect, src_bitmap, src_rect)
          drawx += dw
        end
        #If went beyond the width then strech it to the smaller width.
        if drawx - 1 >= width
          dest_rect = Rect.new(x, y+(height/2)-(b_height/2), width, dummy.height)
          src_rect = Rect.new(0, 0, drawx, dum_height)
          self.stretch_blt(dest_rect, dummy, src_rect)
        else
          posy = y+(height/2)-(b_height/2)
          src_rect = Rect.new(0, 0, drawx, dum_height)
          if align == 0    #left
            posx = x
          elsif align == 1 #center
            posx = x + (width - src_rect.width) / 2
          else             #right
            posx = x + (width - src_rect.width)
          end
          self.blt(posx, posy, dummy, src_rect)
        end
        dummy.dispose
      end
    Die Originalmethoden durch die korrigierten ersetzen. Hoffentlich reicht das aus, damit das Script Umlaute erkennt.

  4. #4
    Ich verstehe ehrlichgesagt kein Wort von dem was du da sagst-KD- ....
    Aber ich weiß das dein genialer Code funktioniert
    Ich danke dir vielmals !! Ehrlich

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •