-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathFont2Tiles.gd
More file actions
77 lines (64 loc) · 2.22 KB
/
Font2Tiles.gd
File metadata and controls
77 lines (64 loc) · 2.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
extends Viewport
onready var _parent_map = get_parent()
func _ready():
assert(_parent_map is TileMap)
_set_size(len(Settings.font.get_available_chars()))
render_target_update_mode = Viewport.UPDATE_ALWAYS
# as _draw is called on idle and the texture after _draw also isn't
# available immediately, we need to wait some time.
# TODO: force_draw() might be a better solution in godot 4.0
yield(get_tree().create_timer(0.2), "timeout")
var _tiles = _get_tile_textures()
_init_tilemap(_tiles)
func _init_tilemap(tiles: Dictionary):
var set = TileSet.new()
var shape = RectangleShape2D.new()
shape.extents = Settings.cell_size * 0.5
var i = 0
for chr in tiles.keys():
set.create_tile(i)
set.tile_set_name(i, chr)
set.tile_set_texture(i, tiles[chr])
# set collision shape
if Settings.use_complex_collision:
var bm = BitMap.new()
bm.create_from_image_alpha(tiles[chr].get_data(), 0.1)
# dilation avoids small pieces getting no collision.
bm.grow_mask(1, Rect2(Vector2.ZERO, Settings.cell_size))
var polygons = bm.opaque_to_polygons(Rect2(Vector2.ZERO, Settings.cell_size), 1.0)
var shape_id = 0
for p in polygons:
var poly = ConvexPolygonShape2D.new()
poly.points = p
set.tile_set_shape(i, shape_id, poly)
shape_id += 1
else:
set.tile_set_shape(i, 0, shape)
set.tile_set_shape_offset(i, 0, Settings.cell_size * 0.5)
i += 1
_parent_map.modulate = Settings.text_color
_parent_map.cell_size = Settings.cell_size
_parent_map.tile_set = set
func _get_tile_textures() -> Dictionary:
var tiles = {}
var dat: Image = get_texture().get_data()
dat.flip_y()
var x = 0
for chr in Settings.font.get_available_chars():
var tile = dat.get_rect(Rect2(Vector2(x, 0), Settings.cell_size))
# convert to preserve transparency
tile.convert(Image.FORMAT_LA8)
# filter characters, that are not visible (like space).
if not tile.is_invisible():
var tex = ImageTexture.new()
# disable standard flags.
tex.create_from_image(tile, 0)
tiles[chr] = tex
x += Settings.cell_size.x
return tiles
func _set_size(n_characters):
"""
Set size of viewport, to fit the given amount of characters
with the globally set font.
"""
size = Vector2(Settings.cell_size.x * n_characters, Settings.cell_size.y)