时间系统的改进

一、把现实时间设为游戏时间(未考虑闰年)

1、创建GameTimestamp类的构造函数,将年份参数设为DateTime类型的参数,并将其转换为对应的年、季节、天、小时和分钟。

public GameTimestamp(DateTime dateTime)
{
    this.year = dateTime.Year;
    int totalDays = (dateTime - new DateTime(dateTime.Year, 1, 1)).Days;
    this.season = (Season)(totalDays / 91);
    this.day = (totalDays % 91) + 1;
    this.hour = dateTime.Hour;
    this.minute = dateTime.Minute;
}

2、创建UpdateClock方法,更新时间。

public void UpdateClock()
{
    var currentDateTime = new DateTime(year, 1, 1).AddDays(day - 1).AddHours(hour).AddMinutes(minute);
    currentDateTime = currentDateTime.AddMinutes(1);

    this.year = currentDateTime.Year;
    int totalDays = (currentDateTime - new DateTime(year, 1, 1)).Days;
    this.season = (Season)(totalDays / 91);
    this.day = (totalDays % 91) + 1;
    this.hour = currentDateTime.Hour;
    this.minute = currentDateTime.Minute;
}

3、创建GetDayOfTheWeek方法,使用DateTime的DayOfWeek属性获取对应的星期几。

public DayOfTheWeek GetDayOfTheWeek()
{
    var currentDateTime = new DateTime(year, 1, 1).AddDays(day - 1).AddHours(hour).AddMinutes(minute);
    return (DayOfTheWeek)currentDateTime.DayOfWeek;
}

4、使用新的构造函数创建GameTimestamp对象并更新时间,在需要获取星期几时使用GetDayOfTheWeek方法即可。

二、使用闰年
using System;

[System.Serializable]
public class GameTimestamp
{
    public enum Season { Spring, Summer, Fall, Winter }
    public enum DayOfTheWeek { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday }
    public int year, day, hour, minute;
    public Season season;

    public GameTimestamp(int year, Season season, int day, int hour, int minute)
    {
        this.year = year;
        this.day = day;
        this.hour = hour;
        this.minute = minute;
        this.season = season;
    }

    public void UpdateClock()
    {
        minute++;
        if (minute >= 60) { minute = 0; hour++; }
        if (hour >= 24) { hour = 0; day++; }
        if (day > 30)
        {
            day = 1;
            if (season == Season.Winter)
            {
                season = Season.Spring;
                year++;
            }
            else { season++; }
        }

        if (DateTime.IsLeapYear(year) && season == Season.Winter && day == 31)
        {
            day = 1;
            season = Season.Spring;
            year++;
        }
    }

    public GameTimestamp(GameTimestamp timestamp)
    {
        this.year = timestamp.year;
        this.day = timestamp.day;
        this.hour = timestamp.hour;
        this.minute = timestamp.minute;
        this.season = timestamp.season;
    }

    public DayOfTheWeek GetDayOfTheWeek()
    {
        DateTime currentDateTime = new DateTime(year, 1, 1).AddDays(day - 1).AddHours(hour).AddMinutes(minute);
        return (DayOfTheWeek)currentDateTime.DayOfWeek;
    }
}
三、 第一次进入游戏读取标准的北京时间,之后运行游戏始终使用这个初始时间,其余的按照正常的游戏时间流逝
using System;

[System.Serializable]
public class GameTimestamp
{
    public enum Season { Spring, Summer, Fall, Winter }
    public enum DayOfTheWeek { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday }
    public int year, day, hour, minute;
    public Season season;

    private static DateTime initialDateTime; // 初始时间

    public GameTimestamp(int year, Season season, int day, int hour, int minute)
    {
        this.year = year;
        this.day = day;
        this.hour = hour;
        this.minute = minute;
        this.season = season;
    }

    public void Initialize()
    {
        initialDateTime = DateTime.UtcNow; // 使用UTC时间初始化初始时间
        SetGameTime(initialDateTime); // 设置游戏时间为初始时间
    }

    public void UpdateClock()
    {
        minute++;
        if (minute >= 60) { minute = 0; hour++; }
        if (hour >= 24) { hour = 0; day++; }
        if (day > 30)
        {
            day = 1;
            if (season == Season.Winter)
            {
                season = Season.Spring;
                year++;
            }
            else { season++; }
        }

        if (DateTime.IsLeapYear(year) && season == Season.Winter && day == 31)
        {
            day = 1;
            season = Season.Spring;
            year++;
        }
    }

    public void UpdateGameTime()
    {
        DateTime currentDateTime = DateTime.UtcNow;
        TimeSpan elapsedGameTime = currentDateTime - initialDateTime; // 计算游戏时间流逝的时间间隔

        int elapsedMinutes = (int)elapsedGameTime.TotalMinutes;
        for (int i = 0; i < elapsedMinutes; i++)
        {
            UpdateClock();
        }
    }

    public DayOfTheWeek GetDayOfTheWeek()
    {
        DateTime currentDateTime = new DateTime(year, 1, 1).AddDays(day - 1).AddHours(hour).AddMinutes(minute);
        return (DayOfTheWeek)currentDateTime.DayOfWeek;
    }

    private void SetGameTime(DateTime dateTime)
    {
        year = dateTime.Year;
        day = dateTime.DayOfYear;
        hour = dateTime.Hour;
        minute = dateTime.Minute;

        // 根据日期计算季节
        if (day <= 30) season = Season.Spring;
        else if (day <= 30 * 2) season = Season.Summer;
        else if (day <= 30 * 3) season = Season.Fall;
        else season = Season.Winter;
    }
}
 

在Initialize方法中,使用DateTime.UtcNow来获取当前的UTC时间,并将其设置为初始时间。

然后调用SetGameTime方法根据初始时间设置游戏时间的初始值。

在UpdateGameTime方法中,使用DateTime.UtcNow来获取当前的UTC时间,并计算出初始时间至当前时间经过的时间间隔。

然后根据时间间隔更新游戏时间。

在游戏开始时调用Initialize方法,并在每一帧更新时调用UpdateGameTime方法以确保游戏时间与初始时间保持同步

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值