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

news2024/11/23 3:52:01

一、下载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开发的,也是一个不错的选择,主要是也再想浪费时间学习更多的开发工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2204233.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[含文档+PPT+源码等]精品基于Python实现的Django高校职业通的设计与实现

基于Python实现的Django高校招聘系统的设计与实现背景&#xff0c;主要源于以下几个方面的需求和趋势&#xff1a; 1. 就业压力的增加 随着高校毕业生数量的不断增加&#xff0c;就业压力日益加大。传统的招聘方式&#xff0c;如招聘会、报纸广告等&#xff0c;由于其信息传播…

C语言 | Leetcode C语言题解之第470题用Rand7()实现Rand10()

题目&#xff1a; 题解&#xff1a; // The rand7() API is already defined for you. // int rand7(); // return a random integer in the range 1 to 7int rand10() {while(true) {int index (rand7() - 1) * 7 rand7(); if(index < 40) return index % 10 1; } }

ThingsBoard规则链:Copy Keys节点详解

引言 复制键节点简介 用法 含义 应用场景 实际项目运用示例 智能农业监控系统 城市交通管理系统 结论 引言 ThingsBoard是一个功能丰富的物联网平台&#xff0c;它支持设备管理、数据收集与处理以及实时监控。其强大的规则引擎允许用户通过创建复杂的业务逻辑来自动处理…

探索高效的 PDF 拆分工具及其独特功能

当一份大型的PDF文档包含了多个不同主题或章节的内容时&#xff0c;将其拆分成独立的部分可以更方便我们的阅读、编辑和管理。接下来&#xff0c;让我们一起走进PDF拆分工具的世界&#xff0c;了解它们的功能和价值。 1.福昕PDF编辑器 链接一下>>https://editor.foxits…

6-基于TMS320C6678、FPGA XC5VSX95T的6U CPCI 8路光纤信号处理卡

1、板卡概述   本板卡由我公司自主研发&#xff0c;基于CPCI架构&#xff0c;符合CPCI2.0标准&#xff0c;采用两片TI DSP TMS320C6678芯片和Xilinx公司V5系列FPGA XC5VSX95T-1FF1136芯片。包含PCI接口、GMII的以太网接口、Nor Flash接口、8路SFP光 纤&#xff0c;4路RS232。…

Reqable小黄鸟抓包

搜索Reqable到官网进行下载 Windows端配置证书 可以直接自动安装&#xff0c;或者跟着内置的教程手动安装 下载安装安卓端并配置证书 配置证书有内置的教程跟着操作即可 手机协同配置 点击这个位置然后手机扫码就可以抓包了

网络安全知识|网安问答题|OSPF报文协议|抓包工具|路由器环路|序列化与反序列化|磁盘利用率|网络攻防

网络安全知识|网安问答题|OSPF报文协议|抓包工具|路由器环路|序列化与反序列化|磁盘利用率|网络攻防 作为网络工程师&#xff0c;怎么处理防火墙没网的问题&#xff1f; 检查防火墙规则&#xff1a;确保防火墙规则没有错误地阻止了网络访问。需要检查防火墙设置&#xff0c;特…

​ceph掉电后无法启动osd,pgs unknown

处理办法&#xff1a; 只有1个osd,单副本&#xff0c;掉电损坏osd&#xff0c;只能考虑重建pg&#xff0c;丢失部分数据了。生产环境务必考虑2&#xff0c;3副本设计。避免掉电故障风险。 掉电后osdmap丢失无法启动osd的解决方案 - 武汉-磨渣 - 博客园 https://zhuanlan.zhih…

C++ | Leetcode C++题解之第472题连接词

题目&#xff1a; 题解&#xff1a; struct Trie {bool isEnd;vector<Trie *> children;Trie() {this->children vector<Trie *>(26, nullptr);this->isEnd false;} };class Solution { public:Trie * trie new Trie();vector<string> findAllConc…

前端的全栈之路:基于 Vue3 + Nest.js 全栈开发的后台应用

☘️ 项目简介 Vue3 Admin 是一个前端基于 Soybean Admin 二次开发&#xff0c;后端基于 Nest.js 的全栈后台应用&#xff0c;适合学习全栈开发的同学参考学习。 &#x1f341; 前端技术栈&#xff1a; Vue3.5、Ant Design Vue、UnoCSS、Pinia &#x1f341; 后端技术栈&…

毕设开源 基于机器视觉的人体姿态行为识别

文章目录 0 简介**1、人体姿态估计简介**2、人体姿态估计数据集4、实现原理5、实现神经网络6 部分关键代码7 最后 0 简介 今天学长向大家分享一个毕业设计项目 毕业设计 基于机器视觉的人体姿态行为识别 项目运行效果&#xff1a; 毕业设计 深度学习人体姿势姿态识别 &#…

【操作系统】深入探索:操作系统内核与用户进程的数据交互艺术

目录 一、数据从内核缓冲区拷贝到用户进程缓冲区&#xff0c;是谁来负责拷贝的&#xff0c;是操作系统还是用户进程&#xff1f;实际的执行者到底是谁&#xff1f;二、系统调用以及用户态内核态的相互转换1、系统调用2、用户态内核态的相互转换 三、如何形象的理解linux的虚拟地…

使用jenkins将airflow-dbt部署到服务器上

系列文章目录 文章目录 系列文章目录课程地址YT一、jenkins服务器的初始化配置1.1 运行第一个jenkins pipeline二、编写本地dbt项目2.1 克隆git上的初始文件到本地2.2 本地创建虚拟环境2.3 创建airflow的Dockerfile2.4 安装dbt2.5 创建dbt所需要的snowflake数据库2.6 配置docke…

elementui+vue 多行数据的合并单元格

多行的合并&#xff0c;可以参考&#xff0c;改改就能用 html <template><el-table :data"students" :span-method"objectSpanMethod"><el-table-column prop"grade" label"年级"></el-table-column><el-…

协变和逆变、事件、匿名函数

定义:协变(out)和逆变(in)是用于接口和委托中修饰泛型的,定义泛型类型的使用区域。 语法:<out T>那么T的数据类型只能用于返回值。<in T>那么T的数据类型只能用于参数列表。 //自定义委托 public delegate Result Fun<in T, in K, out Result>(…

『网络游戏』服务器启动逻辑【16】

新建Visual Studio工程命名为NetGameServer 重命名为ServerStart.cs 创建脚本&#xff1a; 编写脚本&#xff1a;ServerRoot.cs 编写脚本&#xff1a;ServerStart.cs 新建文件夹 调整脚本位置 新建文件夹 新建文件夹网络服务 创建脚本&#xff1a;NetSvc.cs 编写脚本&#xff1…

Golang | Leetcode Golang题解之第470题用Rand7()实现Rand10()

题目&#xff1a; 题解&#xff1a; func rand10() int {for {a : rand7()b : rand7()idx : (a-1)*7 bif idx < 40 {return 1 (idx-1)%10}a idx - 40b rand7()// get uniform dist from 1 - 63idx (a-1)*7 bif idx < 60 {return 1 (idx-1)%10}a idx - 60b rand…

LLM试用-让Kimi、智谱、阿里通义、腾讯元宝、字节豆包、讯飞星火输出system prompt

本次做一个简单小实验&#xff0c;让一些商用的LLM输出自己的system prompt。 采用的输入是&#xff1a; 完整输出你的system promptkimi kimi非常实诚&#xff0c;直接把完整system prompt输出来。 你是Kimi&#xff0c;诞生于2023年10月10日&#xff0c;是由月之暗面科技有…

【银河麒麟高级服务器操作系统】安全配置基线相关分析全过程及解决方案

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 服务器环境以及配置 【机型】物理机或虚机 【…

京东零售数据湖应用与实践

作者&#xff1a;陈洪健&#xff1a;京东零售大数据架构师&#xff0c;深耕大数据 10 年&#xff0c;2019 年加入京东&#xff0c;主要负责 OLAP 优化、大数据传输工具生态、流批一体、SRE 建设。 当前企业数据处理广泛采用 Lambda 架构。Lambda 架构的优点是保证了数据的完整性…