PNGTuber-Plus/ui_scenes/selectedSprite/spriteObject.gd

326 lines
7.1 KiB
GDScript3
Raw Normal View History

2024-02-03 18:36:09 -06:00
extends Node2D
2025-04-30 16:45:19 +02:00
class_name SpriteObject
2024-02-03 18:36:09 -06:00
@onready var sprite = $WobbleOrigin/DragOrigin/Sprite
@onready var grabArea = $WobbleOrigin/DragOrigin/Grab
@onready var dragOrigin = $WobbleOrigin/DragOrigin
@onready var dragger = $WobbleOrigin/Dragger
@onready var originSprite = $WobbleOrigin/DragOrigin/Sprite/Origin
@onready var wob = $WobbleOrigin
@onready var outlineScene = preload("res://ui_scenes/selectedSprite/outline.tscn")
2025-05-01 01:03:40 +02:00
var sprite_data: SpriteData
var parentSprite = null
var imageSize = Vector2.ZERO
2024-02-03 18:36:09 -06:00
#Visuals
2025-05-01 01:03:40 +02:00
var size = Vector2(1, 1)
2024-02-03 18:36:09 -06:00
var showOnTalk = 0
var showOnBlink = 0
var z = 0
#Movement
var heldTicks = 0
var dragSpeed = 0
#Origin
var origTick = 0
var remadePolygon = false
var tick = 0
2024-03-26 17:32:05 -05:00
#Vis toggle
2025-04-30 21:31:31 +02:00
var toggle: Key = KEY_NONE
2024-03-26 17:32:05 -05:00
2024-02-03 18:36:09 -06:00
func _ready():
2025-04-30 21:31:31 +02:00
InputHandler.key_pressed.connect(visToggle)
2024-03-26 17:32:05 -05:00
2025-05-01 01:03:40 +02:00
imageSize = sprite_data.image.get_size()
2024-02-03 18:36:09 -06:00
2025-05-01 01:03:40 +02:00
sprite.texture = sprite_data.image
2024-02-03 18:36:09 -06:00
var bitmap = BitMap.new()
2025-05-01 01:03:40 +02:00
bitmap.create_from_image_alpha(sprite_data.image.get_image())
2024-02-03 18:36:09 -06:00
2025-05-01 01:03:40 +02:00
var polygons = bitmap.opaque_to_polygons(Rect2(Vector2(), bitmap.get_size()), 4.0)
2024-02-03 18:36:09 -06:00
var b = false
for polygon in polygons:
b = true
var collider = CollisionPolygon2D.new()
collider.polygon = polygon
grabArea.add_child(collider)
var outline = outlineScene.instantiate()
outline.points = polygon
outline.add_point(outline.points[0])
grabArea.add_child(outline)
size = imageData.get_size()
sprite.offset = offset
2025-05-01 01:03:40 +02:00
grabArea.position = (size * -0.5) + offset
2024-02-03 18:36:09 -06:00
changeFrames()
setZIndex()
if frames > 1:
remakePolygon()
if !b:
remakePolygon()
add_to_group(str(id))
await get_tree().create_timer(0.1).timeout
if parentId != null:
var nodes = get_tree().get_nodes_in_group(str(parentId))
get_parent().remove_child(self)
nodes[0].sprite.add_child(self)
parentSprite = nodes[0]
set_owner(nodes[0].sprite)
setClip(clipped)
if Global.filtering:
sprite.texture_filter = 2
func replaceSprite(pathNew):
var img = Image.new()
var err = img.load(pathNew)
if err != OK:
#Runs if image import fails.
Global.epicFail(err)
print_debug("Failed to load image.")
return
path = pathNew
var texture = ImageTexture.new()
texture = ImageTexture.create_from_image(img)
tex = texture
imageData = img
sprite.texture = tex
var bitmap = BitMap.new()
bitmap.create_from_image_alpha(imageData)
var polygons = bitmap.opaque_to_polygons(Rect2(Vector2(0, 0), bitmap.get_size()))
for i in grabArea.get_children():
i.queue_free()
var b = false
for polygon in polygons:
b = true
var collider = CollisionPolygon2D.new()
collider.polygon = polygon
grabArea.add_child(collider)
var outline = outlineScene.instantiate()
outline.points = polygon
outline.add_point(outline.points[0])
grabArea.add_child(outline)
size = imageData.get_size()
sprite.offset = offset
2025-05-01 01:03:40 +02:00
grabArea.position = (size * -0.5) + offset
2024-02-03 18:36:09 -06:00
if !b:
remakePolygon()
func _process(delta):
tick += 1
if Global.heldSprite == self:
grabArea.visible = true
originSprite.visible = true
else:
grabArea.visible = false
originSprite.visible = false
var glob = dragger.global_position
if ignoreBounce:
glob.y -= Global.main.bounceChange
drag(delta)
wobble()
var length = (glob.y - dragger.global_position.y)
2025-05-01 01:03:40 +02:00
rotationalDrag(length, delta)
stretch(length, delta)
2024-02-03 18:36:09 -06:00
talkBlink()
animation()
func animation():
2025-05-01 01:03:40 +02:00
var speed = max(float(animSpeed), Engine.max_fps * 6.0)
2024-02-03 18:36:09 -06:00
if animSpeed > 0 and frames > 1:
2025-05-01 01:03:40 +02:00
if Global.animationTick % int((speed) / float(animSpeed)) == 0:
2024-02-03 18:36:09 -06:00
if sprite.frame == frames - 1:
sprite.frame = 0
else:
sprite.frame += 1
if frames > 1:
remakePolygon()
func setZIndex():
sprite.z_index = z
func talkBlink():
var faded = 0.2 * int(Global.main.editMode)
2025-05-01 01:03:40 +02:00
var value = (showOnTalk + (showOnBlink * 3)) + (int(Global.speaking) * 10) + (int(Global.blink) * 20)
var yes = [0, 10, 20, 30, 1, 21, 12, 32, 3, 13, 4, 15, 26, 36, 27, 38].has(int(value))
sprite.self_modulate.a = max(int(yes), faded)
2024-02-03 18:36:09 -06:00
func delete():
queue_free()
func _physics_process(delta):
if Global.heldSprite == self:
var dir = pressingDirection()
if Input.is_action_pressed("origin"):
moveOrigin(dir)
else:
moveSprite(dir)
else:
set_physics_process(false)
func pressingDirection():
var dir = Vector2.ZERO
dir.x = Input.get_action_strength("move_left") - Input.get_action_strength("move_right")
dir.y = Input.get_action_strength("move_up") - Input.get_action_strength("move_down")
return dir
func moveSprite(dir):
if dir != Vector2.ZERO:
heldTicks += 1
else:
heldTicks = 0
if heldTicks > 30 or heldTicks == 1:
var multiplier = 2
if heldTicks == 1:
multiplier = 1
position -= dir * multiplier
2025-05-01 01:03:40 +02:00
position = Vector2(int(position.x), int(position.y))
2024-02-03 18:36:09 -06:00
func moveOrigin(dir):
if dir != Vector2.ZERO:
origTick += 1
else:
origTick = 0
if origTick > 30 or origTick == 1:
var multiplier = 2
if origTick == 1:
multiplier = 1
offset += dir * multiplier
position -= dir * multiplier
2025-05-01 01:03:40 +02:00
offset = Vector2(int(offset.x), int(offset.y))
2024-02-03 18:36:09 -06:00
sprite.offset = offset
2025-05-01 01:03:40 +02:00
grabArea.position = (size * -0.5) + offset
2024-02-03 18:36:09 -06:00
func drag(delta):
if dragSpeed == 0:
dragger.global_position = wob.global_position
else:
2025-05-01 01:03:40 +02:00
dragger.global_position = lerp(dragger.global_position, wob.global_position, 1 / dragSpeed)
2024-02-03 18:36:09 -06:00
dragOrigin.global_position = dragger.global_position
func wobble():
2025-05-01 01:03:40 +02:00
wob.position.x = sin(tick * xFrq) * xAmp
wob.position.y = sin(tick * yFrq) * yAmp
2024-02-03 18:36:09 -06:00
2025-05-01 01:03:40 +02:00
func rotationalDrag(length, delta):
2024-02-03 18:36:09 -06:00
var yvel = (length * rdragStr)
#Calculate Max angle
2025-05-01 01:03:40 +02:00
yvel = clamp(yvel, rLimitMin, rLimitMax)
2024-02-03 18:36:09 -06:00
2025-05-01 01:03:40 +02:00
sprite.rotation = lerp_angle(sprite.rotation, deg_to_rad(yvel), 0.25)
2024-02-03 18:36:09 -06:00
2025-05-01 01:03:40 +02:00
func stretch(length, delta):
2024-02-03 18:36:09 -06:00
var yvel = (length * stretchAmount * 0.01)
2025-05-01 01:03:40 +02:00
var target = Vector2(1.0 - yvel, 1.0 + yvel)
2024-02-03 18:36:09 -06:00
2025-05-01 01:03:40 +02:00
sprite.scale = lerp(sprite.scale, target, 0.5)
2024-02-03 18:36:09 -06:00
func changeCollision(enable):
grabArea.monitorable = enable
grabArea.monitorable = enable
func changeFrames():
sprite.hframes = frames
sprite.frame = 0
func remakePolygon():
if remadePolygon:
return
for c in grabArea.get_children():
c.queue_free()
var collider = CollisionShape2D.new()
var shape = RectangleShape2D.new()
2025-05-01 01:03:40 +02:00
shape.size = Vector2(imageSize.y, imageSize.y)
2024-02-03 18:36:09 -06:00
collider.shape = shape
2025-05-01 01:03:40 +02:00
collider.position = Vector2(imageSize.x, imageSize.y) * Vector2(0.5, 0.5)
2024-02-03 18:36:09 -06:00
grabArea.add_child(collider)
var p = imageSize.y * 0.5
var outline = outlineScene.instantiate()
2025-05-01 01:03:40 +02:00
outline.add_point(Vector2(-p, -p))
outline.add_point(Vector2(p, -p))
outline.add_point(Vector2(p, p))
outline.add_point(Vector2(-p, p))
outline.add_point(Vector2(-p, -p))
2024-02-03 18:36:09 -06:00
outline.position = collider.position
grabArea.add_child(outline)
remadePolygon = true
func setClip(toggle):
if toggle:
sprite.clip_children = CLIP_CHILDREN_AND_DRAW
for node in getAllLinkedSprites():
node.z = z
node.setZIndex()
else:
sprite.clip_children = CLIP_CHILDREN_DISABLED
clipped = toggle
func getAllLinkedSprites():
var nodes = get_tree().get_nodes_in_group("saved")
var linkedSprites = []
for node in nodes:
if node.parentId == id:
linkedSprites.append(node)
return linkedSprites
2024-03-26 17:32:05 -05:00
2025-04-30 21:31:31 +02:00
func visToggle(key: Key):
if key == toggle:
2024-03-26 17:32:05 -05:00
$WobbleOrigin/DragOrigin.visible = !$WobbleOrigin/DragOrigin.visible
func makeVis():
$WobbleOrigin/DragOrigin.visible = true