#ifndef MAPPABLE_H_0B0316FB #define MAPPABLE_H_0B0316FB #include #include "component.h" #include "renderer.h" #include "map.h" class MappableComponent : public Component { public: class Boundary { public: enum class Type { wall, wrap, teleport, reverse, platform, danger }; Boundary( double axis, double lower, double upper, Type type) : axis_(axis), lower_(lower), upper_(upper), type_(type) { } inline double getAxis() const { return axis_; } inline double getLower() const { return lower_; } inline double getUpper() const { return upper_; } inline Type getType() const { return type_; } private: double axis_; double lower_; double upper_; Type type_; }; MappableComponent( Texture tileset, Texture font) : tileset_(std::move(tileset)), font_(std::move(font)) { } using asc_boundaries_type = std::multimap< double, Boundary, std::less>; using desc_boundaries_type = std::multimap< double, Boundary, std::greater>; inline size_t getMapId() const { return mapId_; } inline void setMapId(size_t v) { mapId_ = v; } inline desc_boundaries_type& getLeftBoundaries() { return leftBoundaries_; } inline asc_boundaries_type& getRightBoundaries() { return rightBoundaries_; } inline desc_boundaries_type& getUpBoundaries() { return upBoundaries_; } inline asc_boundaries_type& getDownBoundaries() { return downBoundaries_; } inline const Texture& getTileset() const { return tileset_; } inline void setTileset(Texture v) { tileset_ = std::move(v); } inline const Texture& getFont() const { return font_; } inline void setFont(Texture v) { font_ = std::move(v); } private: size_t mapId_ = -1; desc_boundaries_type leftBoundaries_; asc_boundaries_type rightBoundaries_; desc_boundaries_type upBoundaries_; asc_boundaries_type downBoundaries_; Texture tileset_; Texture font_; }; #endif /* end of include guard: MAPPABLE_H_0B0316FB */ r
blob: 52f38b91f9d8048f026bfe06b1163ad8ef922a55 (plain) (blame)
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
extends CanvasLayer

var _message_queue = []
var _font
var _container
var _ordered_labels = []


func _ready():
	_container = VBoxContainer.new()
	_container.set_name("Container")
	_container.anchor_bottom = 1
	_container.offset_left = 20.0
	_container.offset_right = 1920.0
	_container.offset_top = 0.0
	_container.offset_bottom = -20.0
	_container.alignment = BoxContainer.ALIGNMENT_END
	_container.mouse_filter = Control.MOUSE_FILTER_IGNORE
	self.add_child(_container)

	_font = load("res://assets/fonts/Lingo2.ttf")


func _add_message(text):
	var new_label = RichTextLabel.new()
	new_label.push_font(_font)
	new_label.push_font_size(36)
	new_label.push_outline_color(Color(0, 0, 0, 1))
	new_label.push_outline_size(2)
	new_label.append_text(text)
	new_label.fit_content = true

	_container.add_child(new_label)
	_ordered_labels.push_back(new_label)


func showMessage(text):
	if _ordered_labels.size() >= 9:
		_message_queue.append(text)
		return

	_add_message(text)

	if _ordered_labels.size() > 1:
		return

	var timeout = 10.0
	while !_ordered_labels.is_empty():
		await get_tree().create_timer(timeout).timeout

		var to_remove = _ordered_labels.pop_front()
		var to_tween = get_tree().create_tween().bind_node(to_remove)
		to_tween.tween_property(to_remove, "modulate:a", 0.0, 0.5)
		to_tween.tween_callback(to_remove.queue_free)

		if !_message_queue.is_empty():
			var next_msg = _message_queue.pop_front()
			_add_message(next_msg)

		if timeout > 4:
			timeout -= 3