1 module armos.graphics.bitmapfont; 2 import armos.graphics;; 3 import armos.math; 4 5 /++ 6 BitmapFontを描画するclassです. 7 +/ 8 class BitmapFont { 9 public{ 10 /++ 11 +/ 12 this(){ 13 _image = new armos.graphics.Image; 14 } 15 16 /++ 17 fontのBitmap画像を読み込みます. 18 Params: 19 filename = fontの画像のPathを指定します. 20 fontWidth = フォントの横幅を指定します. 21 fontHeight= フォントの縦幅を指定します. 22 +/ 23 BitmapFont load(in string fileName, in int fontWidth, in int fontHeight){ 24 _image.load(fileName) 25 .minMagFilter(TextureMinFilter.Nearest, TextureMagFilter.Nearest); 26 width = fontWidth; 27 height = fontHeight; 28 return this; 29 }; 30 31 /++ 32 読み込まれたFontにより文字を描画します. 33 Params: 34 str = 描画する文字列を指定します. 35 x = 文字列を描画するX座標を指定します. 36 y = 文字列を描画するY座標を指定します. 37 z = 文字列を描画するZ座標を指定します. 38 +/ 39 BitmapFont draw(in string str, in int x, in int y, in int z = 0){ 40 if(str == ""){return this;} 41 42 int currentPosition = 0; 43 44 import std.string; 45 import std.algorithm; 46 import std.conv; 47 import std.array; 48 string[] lines = str.split("\n"); 49 50 armos.graphics.pushMatrix; 51 armos.graphics.translate(x, y, z); 52 foreach (line; lines) { 53 armos.graphics.pushMatrix; 54 armos.graphics.translate(0, currentPosition*height, 0); 55 drawLine(line); 56 armos.graphics.popMatrix; 57 currentPosition += 1; 58 } 59 armos.graphics.popMatrix; 60 return this; 61 } 62 63 /++ 64 fontの横幅のプロパティです. 65 +/ 66 int width()const{ 67 return _size[0]; 68 } 69 70 /++ 71 fontの横幅のプロパティです. 72 +/ 73 BitmapFont width(in int w){ 74 _size[0] = w; 75 return this; 76 } 77 78 /++ 79 fontの縦幅のプロパティです. 80 +/ 81 int height()const{ 82 return _size[1]; 83 } 84 85 /++ 86 fontの縦幅のプロパティです. 87 +/ 88 BitmapFont height(in int h){ 89 _size[1] = h; 90 return this; 91 } 92 93 /++ 94 tab幅のプロパティです. 95 +/ 96 int tabWidth= 4; 97 98 /++ 99 文字の位置を左寄せに設定します. 100 Deprecated: 現在動作しません. 101 +/ 102 BitmapFont alignLeft(){_align = armos.graphics.TextAlign.Left;return this;} 103 /++ 104 文字の位置を中央寄せに設定します. 105 Deprecated: 現在動作しません. 106 +/ 107 BitmapFont alignCenter(){_align = armos.graphics.TextAlign.Center;return this;} 108 /++ 109 文字の位置を右寄せに設定します. 110 Deprecated: 現在動作しません. 111 +/ 112 BitmapFont alignRight(){_align = armos.graphics.TextAlign.Right;return this;} 113 114 /// 115 Material material(){ 116 return _image.material; 117 } 118 }//public 119 120 private{ 121 armos.graphics.Image _image; 122 armos.math.Vector2i _size; 123 armos.graphics.TextAlign _align = armos.graphics.TextAlign.Left; 124 125 void drawLine(in string str){ 126 import std.string; 127 import std.algorithm; 128 import std.conv; 129 import std.array; 130 char[] characters = str.split("").map!(to!char).array; 131 int currentPosition = 0; 132 foreach (character; characters) { 133 switch (character) { 134 case '\t': 135 currentPosition += tabWidth; 136 break; 137 default: 138 drawCharacter(character, currentPosition, 0); 139 currentPosition += 1; 140 break; 141 } 142 } 143 } 144 145 void drawCharacter(in char character, in int x, in int y){ 146 immutable int textureX = character%16*width; 147 immutable int textureY = character/16*height; 148 _image.drawCropped(x*width, y*height, textureX, textureY, textureX+width, textureY+height); 149 150 } 151 }//private 152 }//class BitmapFont 153 154 enum TextAlign{ 155 Left, 156 Right, 157 Center 158 };