Skip to content

Instantly share code, notes, and snippets.

@igrir
Created May 28, 2023 13:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save igrir/7f3d9ebd845fd2d46c0c8acc4adf1a8a to your computer and use it in GitHub Desktop.
Save igrir/7f3d9ebd845fd2d46c0c8acc4adf1a8a to your computer and use it in GitHub Desktop.
extends StaticBody2D
class_name JigPiece
@onready var piece_image:Sprite2D = $"piece_image"
@onready var piz_top_in:Texture2D = preload("res://Assets/Masks/piz_top_in.png")
@onready var piz_top_out:Texture2D = preload("res://Assets/Masks/piz_top_out.png")
@onready var piz_top_plain:Texture2D = preload("res://Assets/Masks/piz_top_plain.png")
@onready var piz_right_in:Texture2D = preload("res://Assets/Masks/piz_right_in.png")
@onready var piz_right_out:Texture2D = preload("res://Assets/Masks/piz_right_out.png")
@onready var piz_right_plain:Texture2D = preload("res://Assets/Masks/piz_right_plain.png")
@onready var piz_bottom_in:Texture2D = preload("res://Assets/Masks/piz_bottom_in.png")
@onready var piz_bottom_out:Texture2D = preload("res://Assets/Masks/piz_bottom_out.png")
@onready var piz_bottom_plain:Texture2D = preload("res://Assets/Masks/piz_bottom_plain.png")
@onready var piz_left_in:Texture2D = preload("res://Assets/Masks/piz_left_in.png")
@onready var piz_left_out:Texture2D = preload("res://Assets/Masks/piz_left_out.png")
@onready var piz_left_plain:Texture2D = preload("res://Assets/Masks/piz_left_plain.png")
var piz_collections = []
enum Side { TOP = 0, RIGHT = 1, BOTTOM = 2, LEFT = 3 }
enum SideType { PLAIN = 0, IN = 1, OUT = 2}
var topSideType:SideType
var rightSideType:SideType
var bottomSideType:SideType
var leftSideType:SideType
var dragging = false
var start_pressed_position:Vector2
var start_pressed_distance:Vector2
# Called when the node enters the scene tree for the first time.
func _ready():
piz_collections.append([piz_top_plain, piz_top_in, piz_top_out])
piz_collections.append([piz_right_plain, piz_right_in, piz_right_out])
piz_collections.append([piz_bottom_plain, piz_bottom_in, piz_bottom_out])
piz_collections.append([piz_left_plain, piz_left_in, piz_left_out])
func set_side(top:SideType, right:SideType, bottom:SideType, left:SideType):
set_side_type(Side.TOP, top)
set_side_type(Side.RIGHT, right)
set_side_type(Side.BOTTOM, bottom)
set_side_type(Side.LEFT, left)
func set_side_type(side:JigPiece.Side, type:SideType):
var shader_param = ""
var side_index = 0
var type_index = 0
match side:
Side.TOP:
shader_param = "shader_parameter/MaskTop"
side_index = 0
Side.RIGHT:
shader_param = "shader_parameter/MaskRight"
side_index = 1
Side.BOTTOM:
shader_param = "shader_parameter/MaskBottom"
side_index = 2
Side.LEFT:
shader_param = "shader_parameter/MaskLeft"
side_index = 3
match type:
SideType.PLAIN:
type_index = 0
SideType.IN:
type_index = 1
SideType.OUT:
type_index = 2
piece_image.material.set(shader_param, piz_collections[side_index][type_index])
if (side_index == 0):
topSideType = type_index as SideType
elif (side_index == 1):
rightSideType = type_index as SideType
elif (side_index == 2):
bottomSideType = type_index as SideType
elif (side_index == 3):
leftSideType = type_index as SideType
func set_mat_tile(tileTexture:AtlasTexture):
piece_image.material.set("shader_parameter/Tile", tileTexture)
func set_mat_scale(scaleX:float, scaleY:float):
piece_image.material.set("shader_parameter/Scale", Vector2(scaleX, scaleY))
func set_mat_offset(offsetX:float, offsetY:float):
piece_image.material.set('shader_parameter/Offset', Vector2(offsetX, offsetY))
func duplicate_material():
piece_image.material = piece_image.material.duplicate()
func _process(delta):
if (dragging):
var mouse_position = get_viewport().get_mouse_position()
self.global_position = mouse_position + start_pressed_distance
func _on_input_event(viewport, event, shape_idx):
if event is InputEventMouseButton:
if event.pressed:
if !dragging:
start_pressed_position = get_viewport().get_mouse_position()
start_pressed_distance = self.global_position - start_pressed_position
dragging = true
elif !event.pressed:
dragging = false
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment