Пример #1
0
//  // Called every frame. 'delta' is the elapsed time since the previous frame.
    public override void _Process(float delta)
    {
        if (Visible)
        {
            GetNode <Node2D>("Node2D").Visible = true;
            Godot.Camera cam = GetTree().GetRoot().GetCamera();
            if (cam != null)
            {
                var target = GetParent <PhysicalEntity>();
                GetNode <Label>("Node2D/Info").SetText(target.GetTargettingInfoText());
                GetNode <Node2D>("Node2D").SetPosition(cam.UnprojectPosition(GetGlobalTransform().origin));

                Spatial player      = GetTree().GetRoot().GetNode <Spatial>("Spatial/Player");
                string  distanceStr = "";
                if (player != null)
                {
                    float distance = player.GetGlobalTransform().origin.DistanceTo(target.GetGlobalTransform().origin);
                    if (distance >= 1000)
                    {
                        distance   /= 1000;
                        distanceStr = string.Format("{0:0.0}km", distance);
                    }
                    else
                    {
                        distanceStr = string.Format("{0:0}m", distance);
                    }
                }
                GetNode <Label>("Node2D/Distance").SetText(distanceStr);
            }
        }
        else
        {
            GetNode <Node2D>("Node2D").Visible = false;
        }
    }
Пример #2
0
    // Called when the node enters the scene tree for the first time.
    public override void _Process(float delta)
    {
        t += delta;
        GetNode <Label>("Text").Visible = ((t * 1000) % 500) > 250;
        PhysicalEntity player = GetTree().GetRoot().GetNode <PhysicalEntity>("Spatial/Player");
        Spatial        target = player.GetLockedOnTarget();

        if (target != null)
        {
            Vector3      point = target.GetGlobalTransform().origin;
            Godot.Camera cam   = GetTree().GetRoot().GetCamera();
            if (cam == null)
            {
                return;
            }
            float distance = player.GetGlobalTransform().origin.DistanceTo(point);
            if (distance >= 1000)
            {
                distance /= 1000;
                GetNode <Label>("Distance").SetText(string.Format("{0:0.0}km", distance));
            }
            else
            {
                GetNode <Label>("Distance").SetText(string.Format("{0:0}m", distance));
            }
            if (!cam.IsPositionBehind(point))
            {
                Viewport vp   = cam.GetViewport();
                Vector2  pos  = cam.UnprojectPosition(point);
                Viewport vp2d = GetViewport();
                Vector2  posx = new Vector2(
                    pos.x / (vp.GetSize().x / vp2d.GetSize().x),
                    pos.y / (vp.GetSize().y / vp2d.GetSize().y)
                    );
                this.SetPosition(posx);
                this.Visible = true;
            }
            else
            {
                this.Visible = false;
            }
        }
    }
Пример #3
0
    public override void InputEvent(Node camera, InputEvent @event, Vector3 click_position, Vector3 click_normal, int shape_idx)
    {
        GD.Print("GIZMO SCALE INPUT EVENT");
        Godot.Camera cam = (Godot.Camera)camera;
        if (shape_idx != 0)
        {
            LatestAngle      = shape_idx;
            LatestClickStart = click_position;
        }
        if (@event is InputEventMouseButton)
        {
            GizmoPressed = @event.IsActionPressed("mouse_left_click");
            ClickStart   = cam.UnprojectPosition(click_position);

            if (ActiveAxis != Axis.NONE)
            {
                EmitSignal("HandlePressed");
            }
            if (@event.IsActionReleased("mouse_left_click"))
            {
                StartTrans = CurrentObject.GlobalTransform;
                EmitSignal("HandleUnpressed");
            }
        }
        if (@event is InputEventMouseMotion && GizmoPressed && ActiveAxis != Axis.NONE)
        {
            GD.Print(LatestAngle);
            InputEventMouseMotion Event = (InputEventMouseMotion)@event;

            Godot.Spatial tempObj = GetObject();
            if (tempObj == null)
            {
                return;
            }
            if (CurrentObject == null)
            {
                CurrentObject = tempObj;
                StartTrans    = CurrentObject.GlobalTransform;
            }
            else if (CurrentObject.Name != tempObj.Name)
            {
                CurrentObject = tempObj;
                StartTrans    = CurrentObject.GlobalTransform;
            }
            if (CurrentObject.Name == "env")
            {
                return;
            }

            Vector2 Origin2d = cam.UnprojectPosition(CurrentObject.GlobalTransform.origin);
            Vector2 MousePos = Event.Position;

            Vector2 StartVector = ClickStart - Origin2d;
            Vector2 CurrVector  = MousePos - Origin2d;

            // float AngleCurr = (float) (180 / Math.PI) * StartVector.AngleTo(CurrVector);
            float AngleCurr = StartVector.AngleTo(CurrVector);


            Vector3 PreviousObjectRotation = CurrentObject.RotationDegrees;
            Vector3 CurrentObjectRotation  = PreviousObjectRotation;

            Transform rotTrans = StartTrans;

            Vector3 rotation = rotTrans.basis.GetEuler();

            if (ActiveAxis == Axis.X)
            {
                rotTrans.basis = StartTrans.basis.Rotated(new Vector3(1, 0, 0), AngleCurr);
            }
            else if (ActiveAxis == Axis.Y)
            {
                rotation.y     = -1 * AngleCurr;
                rotTrans.basis = StartTrans.basis.Rotated(new Vector3(0, 1, 0), -1 * AngleCurr);
            }
            else
            {
                rotation.z     = AngleCurr;
                rotTrans.basis = StartTrans.basis.Rotated(new Vector3(0, 0, 1), AngleCurr);
            }

            // rotTrans.basis = new Basis(rotation);
            CurrentObject.GlobalTransform = rotTrans;
        }
    }