Ergebnis 1 bis 7 von 7

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

  1. #1

    [XP- Script] Brauche Hilfe bei Bitmap Fonts

    Hallo. ich habe ein Problem mit einem Script.
    Dieses Script ermöglicht es, einen eigenen Schriftfont zu erstellen, welcher aber aus einem Picture ausgelesen wird. Nun ahbe ich aber das Problem das es ein amerikanisches Script ist und daher kein ä ; ö; ü und ß unterstützt wird...
    Und diese europäischen Zeichen sind mein Anliegen an euch.

    Ich poste hiermit den Quellcode und einen Downloadlink zu einer Demo

    Code:
    #######################
    # Script by: BEHEMOTH #
    #############################################################################
    # Script : Bitmap Fonts                                                     #
    # Version: 2.0                                                              #
    #                                                                           #
    # Version 2.0 Features:                                                     #
    # ---------------------                                                     #
    #  - Bitmap Fonts hue can be altered                                        #
    #                                                                           #
    # Version 1.0 Features:                                                     #
    # ---------------------                                                     #
    #  - Fonts can now be displayed through bitmaps (images)                    #
    #  - Bitmap Fonts can be resized                                            #
    #  - You can change back and fourth through bitmap fonts and normal fonts   #
    #    anytime.                                                               #
    #                                                                           #
    # Description:                                                              #
    # ------------                                                              #
    # Gives the ability to have text displayed by an image.                     #
    #                                                                           #
    # Script Installation                                                       #
    # -------------------                                                       #
    # Copy the contents of this file into a new script and place it above the   #
    # script named "Main"                                                       #
    #                                                                           #
    # Default Font Script Commands:                                             #
    # -----------------------------                                             #
    #  - Font.default_text_type   (set to 0 for bitmap fonts,                   #
    #                              set to 1 for normal fonts)                   #
    #                                                                           #
    #  - Font.default_bitmap_name (set to a string containing the filename      #
    #                              of the image)                                #
    #                                                                           #
    #  - Font.default_bitmap_hue  (set to a numeric value from 0 to 360)        #
    #                                                                           #
    #  - Font.default_bitmap_size (set to 100 to display font at normal size,   #
    #                              lower values shrink the text,                #
    #                              higher values enlarge the text)              #
    #                                                                           #
    # Font Script Commands(for individual font objects):                        #
    # --------------------------------------------------                        #
    #  - myFont.text_type   (set to 0 for bitmap fonts,                         #
    #                        set to 1 for normal fonts)                         #
    #                                                                           #
    #  - myFont.bitmap_name (set to a string containing the filename            #
    #                        of the image)                                      #
    #                                                                           #
    #  - myFont.bitmap_hue  (set to a numeric value from 0 to 360)              #
    #                                                                           #
    #  - myFont.bitmap_size (set to 100 to display font at normal size,         #
    #                        lower values shrink the text,                      #
    #                        higher values enlarge the text)                    #
    #                                                                           #
    # Notes:                                                                    #
    # ------                                                                    #
    #  - Place your font images inside the Pictures directory.                  #
    #  - You can set the initial default font values a few lines down, after    #
    #    the end of all these comments.                                         #
    #                                                                           #
    # Font Image Setup:                                                         #
    # ----------------                                                          #
    #  1) Place a pixel with a different color than the images transparent      #
    #     color in the very top left of the image. This is done so the script   #
    #     knows what color is being used for the fonts character positioning.   #
    #                                                                           #
    #  2) After each letter in the image place another pixel at the top of the  #
    #     image to tell the script that the letter's bitmap is done and the     #
    #     next characters image starts here.                                    #
    #                                                                           #
    #  3) The top of each letter should be on the 3rd pixel down, leaving a     #
    #     space of 2 pixels on the top of the entire image. The first letter    #
    #     should be placed 1 pixel to right from the left of the image.         #
    #                                                                           #
    #  4) The character order in the font is as follows:                        #
    #                                                                           #
    #     ~ ! @ # $ % ^ & * ( ) _ + ` 0 1 2 3 4 5 6 7 8 9 - = { } | [ ] \ :     #
    #                                                                           #
    #     " ; ' < > ? , . / A B C D E F G H I J K L M N O P Q R S T U V W X     #
    #                                                                           #
    #     Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z               #
    #                                                                           #
    #     The last letter in the image is a space, and so typically you should  #
    #     leave about 6 or 7 pixels blank at the end. Or however big you want   #
    #     a space to be.                                                        #
    #                                                                           #
    #  5) *Optional and Recommended* Letters such as   g j y q p                #
    #      usually go below the baseline of other text characters. So to define #
    #      the baseline in the image: Place a pixel with the same color as the  #
    #      pixel in the top left of your image, on the 1st pixel on the left of #
    #      the image. Place it appropriately on the y-axis according to your    #
    #      fonts characters.                                                    #
    #                                                                           #
    # Please view the sample font image if you're having trouble understanding  #
    # how to create a correct font image.                                       #
    #                                                                           #
    #############################################################################
    class Font
      attr_accessor :text_type
      attr_accessor :bitmap_name
      attr_accessor :bitmap_hue
      attr_reader   :bitmap_size
      #**************************************************************************
      #Edit Initial Default Font Values HERE!!!
      #**************************************************************************
      # set to 0 for bitmap fonts, set to 1 for normal fonts
      @@default_text_type = 0
      
      # set to a string containing the filename of the fonts image
      @@default_bitmap_name = "alien_font.png"
      
      # set to a numeric value to display font at a different hue.
      # Values range from (Normal)0..360(Max hue).
      @@default_bitmap_hue = 0
      
      # set to 100 to display font at normal size,
      # lower values shrink the text, higher values enlarge the text
      @@default_bitmap_size = 100.0
      #**************************************************************************
      #End of Editing
      #**************************************************************************
      alias :font_init :initialize if ($aliased_font==nil)
      $aliased_font = true
      #--------------------------------------------------------------------------
      # * Object Initialization
      #--------------------------------------------------------------------------
      def initialize(name=Font.default_name, size=Font.default_size)
        @text_type = @@default_text_type
        @bitmap_name = @@default_bitmap_name
        @bitmap_hue = @@default_bitmap_hue
        @bitmap_size = @@default_bitmap_size
        font_init(name, size)
      end
      #--------------------------------------------------------------------------
      # * Set Bitmap Size
      #--------------------------------------------------------------------------
      def bitmap_size=(bitmap_size)
        @bitmap_size = bitmap_size.to_f
      end
      #--------------------------------------------------------------------------
      # * Set Default Bitmap Name
      #--------------------------------------------------------------------------
      def Font.default_bitmap_name=(default_bitmap_name)
        @@default_bitmap_name=default_bitmap_name
      end
      #--------------------------------------------------------------------------
      # * Get Default Bitmap Name
      #--------------------------------------------------------------------------
      def Font.default_bitmap_name
        return @@default_bitmap_name
      end
      #--------------------------------------------------------------------------
      # * Set Default Bitmap Hue
      #--------------------------------------------------------------------------
      def Font.default_bitmap_hue=(default_bitmap_hue)
        @@default_bitmap_hue=default_bitmap_hue
      end
      #--------------------------------------------------------------------------
      # * Get Default Bitmap Hue
      #--------------------------------------------------------------------------
      def Font.default_bitmap_hue
        return @@default_bitmap_hue
      end
      #--------------------------------------------------------------------------
      # * Set Default Bitmap Size
      #--------------------------------------------------------------------------
      def Font.default_bitmap_size=(default_bitmap_size)
        @@default_bitmap_size=default_bitmap_size.to_f
      end
      #--------------------------------------------------------------------------
      # * Get Default Bitmap Size
      #--------------------------------------------------------------------------
      def Font.default_bitmap_size
        return @@default_bitmap_size
      end
      #--------------------------------------------------------------------------
      # * Set Default Text Type
      #--------------------------------------------------------------------------
      def Font.default_text_type=(default_text_type)
        @@default_text_type=default_text_type
      end
      #--------------------------------------------------------------------------
      # * Get Default Text Type
      #--------------------------------------------------------------------------
      def Font.default_text_type
        return @@default_text_type
      end
      #--------------------------------------------------------------------------
    end
    #==============================================================================
    class Font_Bitmap
      attr_reader   :name
      attr_reader   :x
      attr_reader   :width
      attr_reader   :height
      attr_reader   :max_char_width #maximum width of a character
      attr_reader   :border_height  #the bottom line of the text
      attr_reader   :fBitmap #The Fonts Bitmap
      MAX_CHARS = 100
      #--------------------------------------------------------------------------
      # * Object Initialization
      #--------------------------------------------------------------------------
      def initialize(name)
        @name = name
        @fBitmap = RPG::Cache.picture(name)
        @x      = Table.new(MAX_CHARS) #0-95 - X-Position
        @width  = Table.new(MAX_CHARS) #0-95 - Width
        @height = @fBitmap.height - 2
        @border_height = 0
        @max_char_width = 0
        rebuild
      end
      #--------------------------------------------------------------------------
      # * Creates x and width values from name.
      #--------------------------------------------------------------------------
      def rebuild
        gColor = @fBitmap.get_pixel(0, 0)
        char_index = 1
        @x[1] = 1
        max_width = 0
        for i in 1...@fBitmap.width
          color = @fBitmap.get_pixel(i, 0)
          if color == gColor
            if char_index >= MAX_CHARS - 1 #has too many pixels(letters)
              break
            end
            char_index+=1
            @x[char_index] = i
            @width[char_index-1] = i - @x[char_index-1]
            if max_width < @width[char_index-1]
              max_width = @width[char_index-1]
            end
          end
        end
        @width[char_index] = [@fBitmap.width - @x[char_index], 0].max
        if max_width < @width[char_index]
          max_width = @width[char_index]
        end
        @max_char_width = max_width
        #Get border height
        @border_height = @fBitmap.height - 2
        for i in 2...@fBitmap.height
          color = @fBitmap.get_pixel(0, i)
          if color == gColor
            @border_height = i - 2
            break
          end
        end
      end
      #--------------------------------------------------------------------------
      # * Checks if name is the same
      #--------------------------------------------------------------------------
      def is_name?(name)
        return @name == name
      end
      #--------------------------------------------------------------------------
    end
    #==============================================================================
    module ExtraFont
      module_function
      @bitmap_text_pos = []
      #--------------------------------------------------------------------------
      # * Get bitmap text pos array
      #--------------------------------------------------------------------------
      def get_bitmap_text_pos(bitmap_name)
        index = get_bitmap_name_index(bitmap_name)
        if index == nil
          return nil
        else
          return @bitmap_text_pos[index]
        end
      end
      #--------------------------------------------------------------------------
      # * Add bitmap text pos array
      #--------------------------------------------------------------------------
      def add_bitmap_text_pos(bitmap_name)
        i = get_bitmap_name_index(bitmap_name)
        if i == nil
          @bitmap_text_pos.push(Font_Bitmap.new(bitmap_name))
        end
      end
      #--------------------------------------------------------------------------
      # * Gets the index value from a font's bitmap position name
      #     name : Font Bitmap Name
      #--------------------------------------------------------------------------
      def get_bitmap_name_index(name)
        for i in 0...@bitmap_text_pos.size
          if @bitmap_text_pos[i].is_name?(name)
            return i
          end
        end
        return nil
      end
      #--------------------------------------------------------------------------
      # * Gets a Rect of where the character is within the bitmap
      #     char        : The text character
      #     bitmap_name : Font Bitmap Name
      #--------------------------------------------------------------------------
      def get_char_rect(char, bitmap_name)
        index = get_bitmap_name_index(bitmap_name)
        if index == nil
          return Rect.new(0,0,0,0)
        end
        char_value = get_char_num(char)
        x = @bitmap_text_pos[index].x[char_value]
        w = @bitmap_text_pos[index].width[char_value]
        h = @bitmap_text_pos[index].height
        return Rect.new(x, 2, w, h)
      end
      #--------------------------------------------------------------------------
      # * Gets a Char Value From a Bitmap Font
      #     char   : The text character
      #--------------------------------------------------------------------------
      def get_char_num(char)
        value = 0
        case char
        when '~'
          value = 1
        when '!'
          value = 2
        when '@'
          value = 3
        when '#'
          value = 4
        when '$'
          value = 5
        when '%'
          value = 6
        when '^'
          value = 7
        when '&'
          value = 8
        when '*'
          value = 9
        when '('
          value = 10
        when ')'
          value = 11
        when '_'
          value = 12
        when '+'
          value = 13
        when '`'
          value = 14
        when '0'
          value = 15
        when '1'
          value = 16
        when '2'
          value = 17
        when '3'
          value = 18
        when '4'
          value = 19
        when '5'
          value = 20
        when '6'
          value = 21
        when '7'
          value = 22
        when '8'
          value = 23
        when '9'
          value = 24
        when '-'
          value = 25
        when '='
          value = 26
        when 'Ä'
          value = 27
        when 'ä'
          value = 28
        when 'Ö'
          value = 29
        when 'ö'
          value = 30
        when 'Ü'
          value = 31
        when '§'
          value = 32
        when ':'
          value = 33
        when '"'
          value = 34
        when ';'
          value = 35
        when '2"'
          value = 36
        when '<'
          value = 37
        when '>'
          value = 38
        when '?'
          value = 39
        when ','
          value = 40
        when '.'
          value = 41
        when '/'
          value = 42
        when 'A'
          value = 43
        when 'B'
          value = 44
        when 'C'
          value = 45
        when 'D'
          value = 46
        when 'E'
          value = 47
        when 'F'
          value = 48
        when 'G'
          value = 49
        when 'H'
          value = 50
        when 'I'
          value = 51
        when 'J'
          value = 52
        when 'K'
          value = 53
        when 'L'
          value = 54
        when 'M'
          value = 55
        when 'N'
          value = 56
        when 'O'
          value = 57
        when 'P'
          value = 58
        when 'Q'
          value = 59
        when 'R'
          value = 60
        when 'S'
          value = 61
        when 'T'
          value = 62
        when 'U'
          value = 63
        when 'V'
          value = 64
        when 'W'
          value = 65
        when 'X'
          value = 66
        when 'Y'
          value = 67
        when 'Z'
          value = 68
        when 'a'
          value = 69
        when 'b'
          value = 70
        when 'c'
          value = 71
        when 'd'
          value = 72
        when 'e'
          value = 73
        when 'f'
          value = 74
        when 'g'
          value = 75
        when 'h'
          value = 76
        when 'i'
          value = 77
        when 'j'
          value = 78
        when 'k'
          value = 79
        when 'l'
          value = 80
        when 'm'
          value = 81
        when 'n'
          value = 82
        when 'o'
          value = 83
        when 'p'
          value = 84
        when 'q'
          value = 85
        when 'r'
          value = 86
        when 's'
          value = 87
        when 't'
          value = 88
        when 'u'
          value = 89
        when 'v'
          value = 90
        when 'w'
          value = 91
        when 'x'
          value = 92
        when 'y'
          value = 93
        when 'z'
          value = 94
        when ' '
          value = 95
        when 'ä'
          value = 96
        end
        return value
      end
      #--------------------------------------------------------------------------
    end
    #==============================================================================
    class Bitmap
      if ($aliased_bitmap==nil)
        alias normal_draw_text draw_text
        alias normal_text_size text_size
      end
      $aliased_bitmap = true
      #--------------------------------------------------------------------------
      # * Draw Text (Overload Method)
      #     arg1 : X-Position, Rect   , X-Position
      #     arg2 : Y-Position, Text   , Y-Position
      #     arg3 : Width     , [Align], Width
      #     arg4 : Height    ,        , Height
      #     arg5 : Text      ,        , Text
      #     arg6 : [Align]   ,        , [Align]
      #--------------------------------------------------------------------------
      def draw_text(arg1, arg2, arg3=0, arg4=0, arg5="", arg6=0)
        if arg1.is_a?(Rect)
          if self.font.text_type == 0
            draw_bitmap_text(arg1.x, arg1.y, arg1.width, arg1.height, arg2, arg3)
          else
            normal_draw_text(arg1, arg2, arg3)
          end
        else
          if self.font.text_type == 0
            draw_bitmap_text(arg1, arg2, arg3, arg4, arg5, arg6)
          else
            normal_draw_text(arg1, arg2, arg3, arg4, arg5, arg6)
          end
        end
      end
      #--------------------------------------------------------------------------
      # * Gets the box (Rect) used when drawing
      #   a string str with the draw_text. (Overload Method)
      #     str : String to get rect from
      #--------------------------------------------------------------------------
      def text_size(str)
        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
          for i in 0...str.size
            char = str[i, 1]
            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
      #--------------------------------------------------------------------------
      # * Draw Text With Font From Bitmap File
      #     filename : Filename of Font Bitmap
      #     x        : draw spot x-coordinate
      #     y        : draw spot y-coordinate
      #     width    : draw width
      #     height   : draw height
      #     text     : draw text
      #     align    : text alignment (0=left, 1=center, 2=right)
      #--------------------------------------------------------------------------
      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
        for i in 0...text.size
          char = text[i, 1]
          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
      #--------------------------------------------------------------------------
    end
    #==============================================================================
    Demolink: http://www.gngamedev.com/downloads/r...5-bitmap-fonts

    Btw. die Demo ist Version 1.0, das ist aber egal, einfach in der Demo das Script 2.0 einfügen

    Bitte helft mir

  2. #2
    Das Script sieht etwas komplizierter aus, eine einfache Anpassung dürfte da für jeden ausser dem Autor, einiges an Zeit kosten.
    Theoretisch müsste aber eine Anpassung der get_char-Methode sowie ein erhöhen der MAX_CHAR-Konstante reichen um zusätzliche Characters aus dem Bitmap zu ziehen, dann hättest du Platz für die deutschen Sonderzeichen.
    Ich kann aber nicht garantieren, daß das funktioniert.

    Alternativ könntest du in einer speziellen Bitmap-Font, für normalen Text nicht benötigte Sonderzeichen durch die deutschen Umlaute und das ß ersetzen, wobei du dann beim Schreiben von Texten, die du damit zeichnest, das entsprechende amerikanische Sonderzeichen statt dem dt. Umlaut verwendest. (Hier wäre es wohl besser, den Text normal vorzuschreiben und dann die Suchen&Ersetzen-Funktion des Skript-Editors zu nutzen)

  3. #3
    Zitat Zitat von MagicMagor Beitrag anzeigen
    Das Script sieht etwas komplizierter aus, eine einfache Anpassung dürfte da für jeden ausser dem Autor, einiges an Zeit kosten.
    Theoretisch müsste aber eine Anpassung der get_char-Methode sowie ein erhöhen der MAX_CHAR-Konstante reichen um zusätzliche Characters aus dem Bitmap zu ziehen, dann hättest du Platz für die deutschen Sonderzeichen.
    Ich kann aber nicht garantieren, daß das funktioniert.
    Reicht wohl leider nicht...Jedenfalls hab ich das schonmal ausprobiert (allerdings mit sehr wenig RGSS- Kenntnis)

    Zitat Zitat von MagicMagor Beitrag anzeigen
    Alternativ könntest du in einer speziellen Bitmap-Font, für normalen Text nicht benötigte Sonderzeichen durch die deutschen Umlaute und das ß ersetzen, wobei du dann beim Schreiben von Texten, die du damit zeichnest, das entsprechende amerikanische Sonderzeichen statt dem dt. Umlaut verwendest. (Hier wäre es wohl besser, den Text normal vorzuschreiben und dann die Suchen&Ersetzen-Funktion des Skript-Editors zu nutzen)
    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...

  4. #4
    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.

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

  6. #6
    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.

  7. #7
    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
  •