Skip to content

Commit 64625df

Browse files
committed
feat: add a single pointer display option
ArrayView now has the ability to display a smaller pointer to up to one element.
1 parent cf0b7ff commit 64625df

File tree

9 files changed

+56
-28
lines changed

9 files changed

+56
-28
lines changed

levels/bogo_sort.gd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,5 @@ func next(action):
1717
if array.is_sorted():
1818
emit_signal("done")
1919

20-
func _get_effect(i):
20+
func get_effect(i):
2121
return EFFECTS.NONE

levels/bubble_sort.gd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ func next(action):
4242
_end -= 1
4343
_swapped = false
4444

45-
func _get_effect(i):
45+
func get_effect(i):
4646
if i == _index or i == _index + 1:
4747
return EFFECTS.HIGHLIGHTED
4848
if i >= _end:

levels/comparison_sort.gd

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const DISABLE_TIME = 1.0
1414

1515
var array: ArrayModel
1616
var active = true
17-
var _done = false
17+
var done = false
1818

1919
var _timer = Timer.new()
2020

@@ -29,7 +29,7 @@ func _init(array):
2929

3030
func _input(event):
3131
"""Pass input events for checking and take appropriate action."""
32-
if _done or not active:
32+
if done or not active:
3333
return
3434
if event.is_pressed():
3535
return next(event.as_text())
@@ -39,15 +39,13 @@ func next(action):
3939
push_error("NotImplementedError")
4040

4141
func get_effect(i):
42-
if _done:
43-
return EFFECTS.NONE
44-
return _get_effect(i)
42+
return get_effect(i)
4543

4644
func _get_effect(i):
4745
push_error("NotImplementedError")
4846

4947
func _on_ComparisonSort_done():
50-
_done = true
48+
done = true
5149

5250
func _on_ComparisonSort_mistake():
5351
"""Disable the controls for one second."""

levels/insertion_sort.gd

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@ func next(action):
3838
return emit_signal("mistake")
3939
_grow()
4040

41-
func _get_effect(i):
41+
func get_effect(i):
4242
if i == _index or i == _index - 1:
4343
return EFFECTS.HIGHLIGHTED
44-
if i < _end:
44+
if i <= _end:
4545
return EFFECTS.DIMMED
4646
return EFFECTS.NONE
4747

levels/merge_sort.gd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ func next(action):
6262
_left = _get_begin()
6363
_right = _get_middle()
6464

65-
func _get_effect(i):
65+
func get_effect(i):
6666
var is_left = _left != _get_middle() and i == _left
6767
var is_right = _right != _get_end() and i == _right
6868
if is_left or is_right:

levels/selection_sort.gd

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,12 @@ func next(action):
4242
if _base == array.size - 1:
4343
emit_signal("done")
4444

45-
func _get_effect(i):
45+
func get_effect(i):
4646
if i == _min or i == _index:
4747
return EFFECTS.HIGHLIGHTED
4848
if i < _base:
4949
return EFFECTS.DIMMED
5050
return EFFECTS.NONE
51+
52+
func get_pointer():
53+
return _min

models/array_model.gd

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,23 @@ signal sorted(i, j)
88

99
var _array = []
1010
var size = 0 setget , get_size
11+
var biggest = null
1112

1213
func _init(size=16):
1314
"""Randomize the array."""
1415
for i in range(1, size + 1):
1516
_array.append(i)
1617
_array.shuffle()
18+
biggest = _array.max()
1719

1820
func at(i):
1921
"""Retrieve the value of the element at index i."""
2022
return _array[i]
2123

24+
func frac(i):
25+
"""Get the quotient of the element at index i and the biggest."""
26+
return float(_array[i]) / biggest
27+
2228
func is_sorted():
2329
"""Check if the array is in monotonically increasing order."""
2430
for i in range(get_size() - 1):

scripts/theme.gd

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ Global constants relating to the GUI.
44

55
extends Node
66

7-
const GREEN = Color(0.2, 1, 0.2)
8-
const DARK_GREEN = Color(0.2, 1, 0.2, 0.5)
9-
const ORANGE = Color(1, 0.69, 0)
10-
const RED = Color(1, 0, 0)
7+
const GREEN = Color("33ff33")
8+
const DARK_GREEN = Color("7733ff33")
9+
const ORANGE = Color("ffb000")
10+
const RED = Color("f44336")
11+
const BLUE = Color("2196f3")

views/array_view.gd

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ var _tween = Tween.new()
1111
var _level: ComparisonSort
1212
var _rects = []
1313
var _positions = []
14-
var _unit_width: int
15-
var _unit_height: int
1614
var _viewport = Viewport.new()
15+
var _pointer = null
16+
var _pointer_size: int
1717
onready var _separation = 128 / _level.array.size
1818

1919
func _init(level):
@@ -26,38 +26,58 @@ func _init(level):
2626

2727
func _ready():
2828
yield(get_tree(), "idle_frame")
29-
_viewport.size = rect_size
30-
_unit_width = rect_size.x / _level.array.size
31-
_unit_height = rect_size.y / _level.array.size
29+
var unit_width = rect_size.x / _level.array.size
30+
_pointer_size = max((unit_width - _separation) / 4, 2)
3231
# Keep track of accumulated pixel error from integer division
33-
var error = float(rect_size.x) / _level.array.size - _unit_width
32+
var error = float(rect_size.x) / _level.array.size - unit_width
3433
var accumulated = 0
3534
var x = 0
3635
_level.connect("mistake", get_parent(), "flash")
36+
var width = unit_width - _separation
37+
var height = rect_size.y - _pointer_size * 2
3738
for i in range(_level.array.size):
3839
var rect = Polygon2D.new()
3940
if accumulated >= 1:
4041
x += 1
4142
accumulated -= 1
4243
rect.polygon = [
4344
Vector2(0, 0),
44-
Vector2(0, rect_size.y),
45-
Vector2(_unit_width - _separation, rect_size.y),
46-
Vector2(_unit_width - _separation, 0),
45+
Vector2(0, height),
46+
Vector2(width, height),
47+
Vector2(width, 0),
4748
]
4849
accumulated += error
4950
rect.position = Vector2(x, rect_size.y)
5051
_positions.append(x)
51-
x += _unit_width
52+
x += unit_width
5253
_rects.append(rect)
5354
_viewport.add_child(rect)
5455
_level.array.connect("swapped", self, "_on_ArrayModel_swapped")
5556
_level.array.connect("sorted", self, "_on_ArrayModel_sorted")
57+
if _level.has_method("get_pointer"):
58+
_pointer = Polygon2D.new()
59+
_pointer.polygon = [
60+
Vector2(width / 2, _pointer_size),
61+
Vector2(width / 2 - _pointer_size, 0),
62+
Vector2(width / 2 + _pointer_size, 0),
63+
]
64+
_pointer.color = GlobalTheme.BLUE
65+
_viewport.add_child(_pointer)
5666

5767
func _process(delta):
68+
if _pointer != null:
69+
var pointed = _level.get_pointer()
70+
var height = rect_size.y - _pointer_size * 2
71+
_pointer.position = Vector2(_rects[pointed].position.x,
72+
height - _level.array.frac(pointed) * height)
73+
if _level.done:
74+
_pointer.queue_free()
5875
for i in range(_rects.size()):
59-
_rects[i].color = _level.get_effect(i)
60-
_rects[i].scale.y = -float(_level.array.at(i)) / _level.array.size
76+
if _level.done:
77+
_rects[i].color = ComparisonSort.EFFECTS.NONE
78+
else:
79+
_rects[i].color = _level.get_effect(i)
80+
_rects[i].scale.y = -_level.array.frac(i)
6181

6282
func _on_ArrayModel_swapped(i, j):
6383
var time = ANIM_DURATION * (1 + float(j - i) / _level.array.size)

0 commit comments

Comments
 (0)