Simple card flip script.

This commit is contained in:
Relintai 2023-10-18 17:32:49 +02:00
parent ed30a29a8e
commit b2d9a390e1
1 changed files with 120 additions and 0 deletions

120
card/Card.gd Normal file
View File

@ -0,0 +1,120 @@
tool
extends Control
enum State {
STATE_OFF = 0,
STATE_FLIP_PHASE_1 = 1,
STATE_FLIP_PHASE_2 = 2,
};
export(Texture) var texture_from : Texture = null
export(Texture) var texture_back : Texture = null
export(bool) var flip : bool = false
var tex_mirror : bool = false
var angle : float = 0
export(bool) var start_flip : bool = false setget set_flip
var _state : int = 0
var mesh : ArrayMesh = ArrayMesh.new()
func start():
_state = State.STATE_FLIP_PHASE_1
set_process(true)
func _draw() -> void:
var tex : Texture = null
if flip:
tex = texture_back
else:
tex = texture_from
var tf_top : Transform2D = Transform2D()
tf_top.x = Vector2(1, 0).rotated(angle)
var tf_bottom : Transform2D = Transform2D()
tf_bottom.x = Vector2(1, 0).rotated(-angle)
var arr : Array = Array()
arr.resize(ArrayMesh.ARRAY_MAX)
var rhx : float = rect_size.x / 2
var v : PoolVector2Array = PoolVector2Array()
v.push_back(tf_top.xform(Vector2(-rhx, 0)) + Vector2(rhx, 0))
v.push_back(tf_top.xform(Vector2(rhx, 0)) + Vector2(rhx, 0))
v.push_back(tf_bottom.xform(Vector2(-rhx, rect_size.y)) + Vector2(rhx, 0))
v.push_back(tf_bottom.xform(Vector2(rhx, rect_size.y)) + Vector2(rhx, 0))
arr[ArrayMesh.ARRAY_VERTEX] = v
var c : PoolColorArray = PoolColorArray()
c.push_back(Color(1, 1, 1, 1))
c.push_back(Color(1, 1, 1, 1))
c.push_back(Color(1, 1, 1, 1))
c.push_back(Color(1, 1, 1, 1))
arr[ArrayMesh.ARRAY_COLOR] = c
if !tex_mirror:
var uv : PoolVector2Array = PoolVector2Array()
uv.push_back(Vector2(0, 0))
uv.push_back(Vector2(1, 0))
uv.push_back(Vector2(0, 1))
uv.push_back(Vector2(1, 1))
arr[ArrayMesh.ARRAY_TEX_UV] = uv
else:
var uv : PoolVector2Array = PoolVector2Array()
uv.push_back(Vector2(1, 0))
uv.push_back(Vector2(0, 0))
uv.push_back(Vector2(1, 1))
uv.push_back(Vector2(0, 1))
arr[ArrayMesh.ARRAY_TEX_UV] = uv
var indices : PoolIntArray = PoolIntArray()
indices.push_back(0)
indices.push_back(1)
indices.push_back(2)
indices.push_back(1)
indices.push_back(2)
indices.push_back(3)
arr[ArrayMesh.ARRAY_INDEX] = indices
mesh.clear_surfaces()
mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arr)
draw_mesh(mesh, tex, null, Transform2D())
func _process(delta: float) -> void:
if _state == State.STATE_OFF:
set_process(false)
elif _state == State.STATE_FLIP_PHASE_1:
angle += 0.01
if angle >= PI / 2:
angle = PI / 2
_state = State.STATE_FLIP_PHASE_2
flip = !flip
tex_mirror = true
update()
elif _state == State.STATE_FLIP_PHASE_2:
angle += 0.01
if angle >= PI:
angle = 0
_state = State.STATE_FLIP_PHASE_1
tex_mirror = false
update()
func _ready() -> void:
set_process(false)
start()
func set_flip(val):
if val:
start()