I seem to live in the past… Monkey X programming language has evolved into Monkey2, but I’m still sometimes using Monkey X.
I made an example class to use in Monkey X with bitmap fonts converted with my Font 2 PNG. The example uses old Mojo-module, but old examples on scaling bitmap font made with Font 2 PNG will give you an idea of an alternative way to implementing this.
Next, let’s take a look at a screenshot:
Next to the code:
Import mojo Import brl.stream Import brl.filestream Function Main() New MyApp End Class MyFont Field maxHeight:Int Field fontDat:Int[][] Field gfxFont:Image Field scale:Float End Class MyApp Extends App Field gfxBG:Image Global font1:MyFont Global font2:MyFont Method OnCreate() Local file:FileStream ' ------- ' Font 1 ' ------- font1 = New MyFont font1.gfxFont = LoadImage("font1.png") font1.fontDat = allocateArray(95,2) font1.scale = 1 font1.maxHeight = 71 file = FileStream.Open("monkey://data/font1.dat","r") For Local i:Int = 0 To 95 - 1 font1.fontDat[i][0] = file.ReadInt() font1.fontDat[i][1] = file.ReadInt() Next file.Close() ' ------- ' Font 2 '-------- font2 = New MyFont font2.gfxFont = LoadImage("font2.png") font2.fontDat = allocateArray(95,2) font2.scale = 1 font2.maxHeight = 43 file = FileStream.Open("monkey://data/font2.dat","r") For Local i:Int = 0 To 95 - 1 font2.fontDat[i][0] = file.ReadInt() font2.fontDat[i][1] = file.ReadInt() Next file.Close() gfxBG = LoadImage("bg.jpg") SetDeviceWindow(640,480,0) SetUpdateRate(30) End Method OnRender() SetBlend AlphaBlend SetAlpha 1 DrawImage gfxBG,0,0 drawString(font1, "Testing font 1", 10, 10) drawString(font2, "Testing font 2", (640 - (stringWidth(font2, "Testing font 2") * font2.scale)) / 2, (480 - (font2.maxHeight * font2.scale)) / 2) End Function drawString(font:MyFont, text:String, x:Float, y:Float) Local len = text.Length() Local chrs:Int[] chrs = text.ToChars() For Local i = 0 To len - 1 ' pos. in font.png width in pixels in font.png DrawImageRect font.gfxFont, x, y, font.fontDat[chrs[i]-32][0], 0, font.fontDat[chrs[i]-32][1], font.maxHeight, 0 , font.scale, font.scale,0 x = x + font.fontDat[chrs[i]-32][1] * font.scale Next End Function stringWidth:Int(font:MyFont, text:String) Local len:Int = text.Length() Local chrs:Int[] Local length:Int = 0 chrs = text.ToChars() For Local i:Int = 0 To len - 1 length = length + font.fontDat[chrs[i]-32][1] Next Return length End Function allocateArray:Int[][](i:Int, j:Int) Local arr:Int[][] = New Int[i][] For Local index = 0 Until i arr[index] = New Int[j] Next Return arr End End Class
Font 2 PNG prints the max height of the font after converting. The value is in practice just the height of the png-file.
As a reminder: Font 2 PNG produces two files, font.png and font.dat for one font. The font.dat-file holds the information for each character with two 4 byte integers, first tells the position in pixels in font, the second the width of the chatacter in pixels.
I hope this example gives you some ideas on how to use different fonts converted with Font 2 PNG.
Feel free to use the code above.
PS. I also made new version of part 1 of my Old School series demonstration in Monkey X. Video below:
From the source code in the video you’ll get an idea, how this font class could be used with Mojo2-module.
That’s it from my “hobby corner” tonight!