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