用godot4.3 C#开发一个APP登陆界面

一、下载godot
godot 是一个游戏开发平台,可以用gd语言,这一个类似python,python程序员转gd很容易,也可以用C#开发。
https://godotengine.org/ 进行下载,下载在这里插入图片描述
下载,net版本。当然mac也可以下载,linux上也有可以,可以去下载相应版本。
二、因为自己的是新手,我再下载cursor进行智能编程,用其跟visual studio 2022及net 8.0进行开发。https://www.cursor.com/,在使用这一个工具后,让我对程序员这一个行业充满了失落。当然用其开时,我们也要写基本的代码,再让其进行完善。在这里插入图片描述
三、在godot开发中让cursor为默认的编程器。在这里插入图片描述
在这里插入图片描述
四、在godot开发中相关的开发习惯跟原来php 一类的不太一样,界面设计好后点选相关界面或按钮一类的进行角本挂载。
在这里插入图片描述
这里我们让登陆按钮挂载buttonClick.cs 即我们写的相关代码。
五、双击写好好的角本打开buttonClick.cs ,当然是我们用的cursor进行开发。
在这里插入图片描述
六、登陆代码:

using Godot;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json; // 引入 Newtonsoft.Json 用于处理 JSON 数据
using System.IO;

public partial class buttonClick : Button
{
    // 声明私有变量
    private string username;  
    private string password;  
    private string notice;  
    private string url = "https://www.xxx.com/api/stock/index/login"; // API 请求的 URL
    private ProgressBar progressBar;
    private LineEdit usernameEdit;
    private LineEdit passwordEdit;


    // _Ready 方法在节点准备好时调用
    public override void _Ready()
    {
        // 获取用户名和密码输入框
        usernameEdit = ((LineEdit)GetParent().GetNode("phone")); 
        passwordEdit = ((LineEdit)GetParent().GetNode("password"));
        
        // 获取进度条节点
        progressBar = (ProgressBar)GetParent().GetNode("%ProgressBar");

        // 使用 lambda 表达式处理按钮点击事件并调用异步方法 pressclickAsync
        this.Pressed += async () => await pressclickAsync();

        // 获取当前目录并加载用户数据
        string currentDirectory = Directory.GetCurrentDirectory();
        string filepath = Path.Combine(currentDirectory, "user_data.json");

        // 如果 user_data.json 存在,则读取其中的手机号并显示在输入框中
        if (File.Exists(filepath))
        {
            try
            {
                string jsonContent = File.ReadAllText(filepath); // 读取 JSON 文件内容
                var userData = JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonContent);

                if (userData != null && userData.TryGetValue("Phone", out string savedPhone))
                {
                    usernameEdit.Text = savedPhone; // 将保存的手机号显示在输入框中
                    GD.Print("Loaded phone number from user_data.json: " + savedPhone);
                }
                else
                {
                    GD.Print("Phone number not found in user_data.json");
                }
            }
            catch (Exception e)
            {
                GD.Print("Error reading user_data.json: " + e.Message); // 处理读取 JSON 文件时的错误
            }
        }
        else
        {
            GD.Print("user_data.json file not found"); // 文件不存在时打印提示信息
        }
    }

    // 异步方法处理按钮点击事件
    public async Task pressclickAsync()
    {
        username = usernameEdit.Text; // 获取用户名输入框的内容

        // 检查进度条是否存在
        if (progressBar == null)
        {
            await ShowMessageWithTimeout("进度条节点未找到!");
            return;
        }

        // 验证手机号格式(11位数字)
        if (string.IsNullOrEmpty(username) || !System.Text.RegularExpressions.Regex.IsMatch(username, @"^\d{11}$"))
        {
            await ShowMessageWithTimeout("请输入有效的手机号!");
            return;
        }

        password = passwordEdit.Text; // 获取密码输入框的内容

        // 验证密码格式(6位数字)
        if (string.IsNullOrEmpty(password) || !System.Text.RegularExpressions.Regex.IsMatch(password, @"^\d{6}$"))
        {
            await ShowMessageWithTimeout("密码必须是6位数字!");
            return;
        }

        // 显示进度条并重置其值
        progressBar.Visible = true;
        progressBar.Value = 0;

        using (var client = new System.Net.Http.HttpClient())
        {
            // 构造请求数据
            var jsonData = new Dictionary<string, string>
            {
                { "username", username },
                { "password", password }
            };

            var jsonString = JsonConvert.SerializeObject(jsonData); // 将数据序列化为 JSON 字符串
            var content = new StringContent(jsonString, Encoding.UTF8, "application/json");

            try
            {
                // 发送 POST 请求并获取响应
                var response = await client.PostAsync(url, content);
                var responseContent = await response.Content.ReadAsStringAsync();

                // 模拟进度条加载过程
                for (int i = 0; i <= 100; i += 10)
                {
                    progressBar.Value = i; // 更新进度条值
                    await Task.Delay(100); // 模拟等待时间
                }

                // 解析 JSON 响应
                var jsonResponse = JsonConvert.DeserializeObject<Dictionary<string, string>>(responseContent);

                if (jsonResponse != null && jsonResponse.TryGetValue("status", out var status))
                {
                    if (status == "1")
                    {
                        await ShowMessageWithTimeout("密码错误");
                    }
                    else
                    {
                        await ShowMessageWithTimeout("登陆成功");

                        // 保存用户数据到 user_data.json
                        string filepath = Path.Combine(Directory.GetCurrentDirectory(), "user_data.json");

                        var userData = new Dictionary<string, string>
                        {
                            { "Token", jsonResponse["token"] },
                            { "Username", jsonResponse["username"] },
                            { "Phone", jsonResponse["phone"] },
                            { "Header", jsonResponse["header"] }
                        };

                        // 将数据序列化为 JSON 并保存到文件
                        string jsonContent = JsonConvert.SerializeObject(userData, Formatting.Indented);
                        File.WriteAllText(filepath, jsonContent);

                        GD.Print("User data saved to: " + filepath);

                        // 切换到新场景
                        GetTree().ChangeSceneToFile("res://scenes/flagscreen.tscn");
                    }
                }
                else
                {
                    await ShowMessageWithTimeout("解析响应失败");
                }
            }
            catch (Exception ex)
            {
                // 处理请求异常
                await ShowMessageWithTimeout("请求异常: " + ex.Message);
            }
            finally
            {
                // 隐藏进度条
                progressBar.Visible = false;
            }
        }
    }

    // 显示提示信息并在指定时间后清除
    public async Task ShowMessageWithTimeout(string message, int duration = 3888)
    {
        var msg = (Label)GetParent().GetNode("Panel3").GetNode("Labelstatus");
        msg.Text = message; // 设置提示信息
        await Task.Delay(duration); // 等待指定的持续时间
        msg.Text = ""; // 清空提示信息
    }
}

GetTree().ChangeSceneToFile(“res://scenes/flagscreen.tscn”);这里中登陆后进行的下一个界面的跳转。
传参数的方法:

传参的方式

 GlobalData.Instance.SceneParameter = "YourParameter";
GetTree().ChangeSceneToFile("res://scenes/flagscreen.tscn");

在新场景中获取参数:

public override void _Ready()
{
    string parameter = GlobalData.Instance.SceneParameter;
    // 使用参数
}

六界面:
在这里插入图片描述
在这里插入图片描述
七、只是试手,并不太有指导意义,用godot再导出android ,ios ,windows ,linux平台,以及web端,但因为是开发游戏的,明显的执行速度不如原生android。 页面跳转回退一类的也不会象andriod一样保持前页的界面。不停的请求服务器,效率会差一点。但对于我一直想学一点游戏开发,又会点web开发的,也是一个不错的选择,主要是也再想浪费时间学习更多的开发工具。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老大白菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值