A Quadrilateral Cowboy clone intended to help me learn Game Dev

Adding large terminal code

+118 -1
+104 -1
terminal.go
··· 2 2 3 3 import ( 4 4 "graphics.gd/classdb" 5 + "graphics.gd/classdb/Area3D" 6 + "graphics.gd/classdb/InputEvent" 7 + "graphics.gd/classdb/InputEventMouse" 8 + "graphics.gd/classdb/InputEventMouseMotion" 9 + "graphics.gd/classdb/MeshInstance3D" 10 + "graphics.gd/classdb/Node" 5 11 "graphics.gd/classdb/Node3D" 6 12 "graphics.gd/classdb/SubViewport" 13 + "graphics.gd/classdb/Time" 14 + "graphics.gd/variant" 15 + "graphics.gd/variant/Transform3D" 16 + "graphics.gd/variant/Vector2" 17 + "graphics.gd/variant/Vector3" 7 18 ) 8 19 9 20 type TerminalScene struct { 10 21 Node3D.Extension[TerminalScene] 11 22 12 - SubViewport SubViewport.Instance 23 + SubViewport SubViewport.Instance 24 + is_mouse_inside bool 25 + last_event_pos2D any 26 + last_event_time float32 27 + } 28 + 29 + func (t *TerminalScene) Ready() { 30 + node_area_node := t.AsNode().GetNode("Quad/Area3D") 31 + node_area := Area3D.New() 32 + node_area.SetObject(node_area_node.AsObject()) 33 + node_area.AsCollisionObject3D().OnMouseEntered(t.mouse_entered_area) 34 + node_area.AsCollisionObject3D().OnMouseExited(t.mouse_exited_area) 35 + node_area.AsCollisionObject3D().OnInputEvent(t.mouse_input_event) 36 + } 37 + 38 + func (t *TerminalScene) mouse_entered_area() { 39 + t.is_mouse_inside = true 40 + } 41 + 42 + func (t *TerminalScene) mouse_exited_area() { 43 + t.is_mouse_inside = false 44 + } 45 + 46 + func (t *TerminalScene) UnhandledInput(event InputEvent.Instance) { 47 + event_variant := variant.New(event) 48 + event_type_string := event_variant.Type().String() 49 + 50 + if (event_type_string == "InputEventMouseButton") || (event_type_string == "InputEventMouseMotion") || (event_type_string == "InputEventScreenDrag") || (event_type_string == "InputEventScreenTouch") { 51 + return 52 + } 53 + 54 + node_viewport_node := t.AsNode().GetNode("SubViewport") 55 + node_viewport := SubViewport.New() 56 + node_viewport.SetObject(node_viewport_node.AsObject()) 57 + node_viewport.AsViewport().PushInput(event) 58 + } 59 + 60 + func (t *TerminalScene) mouse_input_event(_camera Node.Instance, event InputEvent.Instance, event_position Vector3.XYZ, _normal Vector3.XYZ, _shape_idx int) { 61 + node_quad_node := t.AsNode().GetNode("Quad") 62 + node_quad := MeshInstance3D.New() 63 + node_quad.SetObject(node_quad_node.AsObject()) 64 + 65 + node_viewport_node := t.AsNode().GetNode("SubViewport") 66 + node_viewport := SubViewport.New() 67 + node_viewport.SetObject(node_viewport_node.AsObject()) 68 + 69 + mouse_event := InputEventMouse.New() 70 + mouse_event.SetObject(event.AsObject()) 71 + 72 + event_variant := variant.New(event) 73 + event_type_string := event_variant.Type().String() 74 + 75 + quad_mesh_size := node_quad.Mesh().GetAabb().Size 76 + event_pos3D := event_position 77 + now := Time.GetTicksMsec() / 1000.0 78 + event_pos3D = transform_xform(Transform3D.AffineInverse(Transform3D.BasisOrigin{ 79 + Basis: node_quad.AsNode3D().GlobalTransform().Basis, 80 + Origin: node_quad.AsNode3D().GlobalTransform().Origin, 81 + }), event_pos3D) 82 + 83 + event_pos2D := Vector2.Zero 84 + 85 + if t.is_mouse_inside { 86 + event_pos2D = Vector2.New(event_pos3D.X, -event_pos3D.Y) 87 + event_pos2D.X = event_pos2D.X / quad_mesh_size.X 88 + event_pos2D.Y = event_pos2D.Y / quad_mesh_size.Y 89 + event_pos2D.X += 0.5 90 + event_pos2D.Y += 0.5 91 + event_pos2D.X *= float32(node_viewport.Size().X) 92 + event_pos2D.Y *= float32(node_viewport.Size().Y) 93 + } else if t.last_event_pos2D != nil { 94 + event_pos2D = t.last_event_pos2D.(Vector2.XY) 95 + } 96 + 97 + mouse_event.SetPosition(event_pos2D) 98 + mouse_event.SetGlobalPosition(event_pos2D) 99 + 100 + if event_type_string == "InputEventMouseMotion" || event_type_string == "InputEventScreenDrag" { 101 + if t.last_event_pos2D == nil { 102 + other_event := InputEventMouseMotion.New() 103 + other_event.SetObject(event.AsObject()) 104 + other_event.SetRelative(Vector2.Zero) 105 + } else { 106 + other_event := InputEventMouseMotion.New() 107 + other_event.SetObject(event.AsObject()) 108 + other_event.SetRelative(Vector2.Sub(event_pos2D, t.last_event_pos2D.(Vector2.XY))) 109 + other_event.SetVelocity(Vector2.DivX(other_event.Relative(), (float32(now) - t.last_event_time))) 110 + } 111 + } 112 + 113 + t.last_event_pos2D = event_pos2D 114 + t.last_event_time = float32(now) 115 + node_viewport.AsViewport().PushInput(event) 13 116 } 14 117 15 118 func registerTerminal() {
+14
utils.go
··· 1 + package main 2 + 3 + import ( 4 + "graphics.gd/variant/Transform3D" 5 + "graphics.gd/variant/Vector3" 6 + ) 7 + 8 + func transform_xform(t Transform3D.BasisOrigin, v Vector3.XYZ) Vector3.XYZ { 9 + return Vector3.New( 10 + Vector3.Dot(t.Basis.X, v)+t.Origin.X, 11 + Vector3.Dot(t.Basis.Y, v)+t.Origin.Y, 12 + Vector3.Dot(t.Basis.Z, v)+t.Origin.Z, 13 + ) 14 + }