+#######################################
+# Simple implementation of layered sprites technique, to achieve a voxel-like
+# Public Domain - michaelb (http://michaelb.org/)
+#######################################
+# To use this, simply set it as a script on a Node2D.
+# It could probably be optimized by pre-rendering each direction onto a texture.
+# changing the direction will cause it to achieve the rotation effect
+export(int, 0, 360) var direction = 0 setget set_direction
+# set spritesheet to be a single (horizontal) spritesheet containing every layer
+export(ImageTexture) var spritesheet = null setget set_spritesheet
+# layer_count is the number of layers (e.g. frames) contained by the spritesheet
+export(int, 0, 100) var layer_count = 0 setget set_layer_count
+# offset is the number of pixels to offset each layer
+export(int, 0, 100) var offset = 1 setget set_offset
+func set_direction(new_value):
+func set_offset(new_value):
+func set_layer_count(new_value):
+ layer_count = new_value
+func set_spritesheet(new_value):
+ spritesheet = new_value
+func _refresh_sprites():
+ # First remove existing children
+ for child in get_children():
+ for layer in range(layer_count):
+ var sprite = Sprite.new()
+ sprite.set_texture(spritesheet)
+ sprite.set_hframes(layer_count)
+ sprite.set_frame(layer)
+func _refresh_direction():
+ for layer in range(layer_count):
+ if layer >= sprites.size():
+ # layer_count hasn't yet been set
+ var sprite = sprites[layer]
+ sprite.set_rotd(direction)
+ sprite.set_pos(Vector2(0, layer * -offset))