0
DateTime newDate = new DateTime(2013, 1, 1);

void AddTime()
{

   timer1.Interval = 600000;  
   timer1.Enabled = true;
   timer1.Tick += new EventHandler(timer1_Tick);
   timer1.Start();
}
void timer1_Tick(object sender, EventArgs e)
{
    newDate = newDate.AddMonths(+3);
    lblDate.Text = newDate.ToString();

}

何らかの理由で を変更しtimer1.Intervalても、 に追加される 3 か月の速度は変わらず、newDate常に一定です。ゲーム内での 1 分間の実生活時間が 3 か月に相当するようにしています。私はC#を使用しています。

4

4 に答える 4

1

最初のタイマー間隔は少し大きくなっています。以下は完全なアプリケーションのサンプルです。期待どおりに動作する

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        DateTime newDate = new DateTime(2013, 1, 1);
        public Form1()
        {
            InitializeComponent();
            AddTime(); // call the method, otherwise timer will not start 
        }
        void AddTime()
        {
            timer1.Interval = 60000; // every minute (1 minute = 60000 milliseconds)
            timer1.Enabled = true;
            timer1.Tick += new EventHandler(timer1_Tick);
            timer1.Start();
        }
        void timer1_Tick(object sender, EventArgs e)
        {
            newDate = newDate.AddMonths(3); 
            label1.Text = newDate.ToString();
        }
        // if you need to set timet interval after timer start, do as below 
        private void button1_Click(object sender, EventArgs e)
        {
            timer1.Stop();
            timer1.Interval = 30000; // set interval 30 seconds 
            timer1.Start();
        }
    }
}
于 2013-05-14T17:49:32.400 に答える
0

あなたはそれについて間違った方法で進んでいます。まず、「ゲーム時間」と「通常時間」の比率を計算します。ただし、月の日数は可変であるため、月は問題があります。代わりに、4 分の 1 (365 / 4) を使用して、そこから作業することができます。ストップウォッチを使用して経過時間を追跡し、それを参照日付に追加して「リアルタイム」を取得します。したがって、「ゲーム時間」は単に経過時間に比率を掛けてから基準時間に加算したものです。このモデルを使用すると、Timer Interval() はIRREVELANTになります。1 分に 1 回、1 秒に 1 回、または 1 秒に 4 回更新することができます。実時間/ゲーム時間を決定するコードはまったく同じです...そして、表示を更新してもすべての時間は正確なままです。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        // update once per second, but the rate here is IRREVELANT...
        // ...and can be changed without affecting the real/game timing
        timer1.Interval = 1000; 
        timer1.Tick += new EventHandler(timer1_Tick);
    }

    private DateTime dtReal;
    private DateTime dtGame;
    private DateTime dtReference;
    private System.Diagnostics.Stopwatch SW = new System.Diagnostics.Stopwatch();
    private double TimeRatio = (TimeSpan.FromDays(365).TotalMilliseconds / 4.0) / TimeSpan.FromMinutes(1).TotalMilliseconds;

    private void button1_Click(object sender, EventArgs e)
    {
        StartTime();
    }        

    private void StartTime()
    {
        dtReference = new DateTime(2013, 1, 1);
        SW.Restart();
        timer1.Start();
    }

    void timer1_Tick(object sender, EventArgs e)
    {
        UpdateTimes();
        DisplayTimes();
    }

    private void UpdateTimes()
    {
        double elapsed = (double)SW.ElapsedMilliseconds;
        dtReal = dtReference.AddMilliseconds(elapsed);
        dtGame = dtReference.AddMilliseconds(elapsed * TimeRatio);
    }

    private void DisplayTimes()
    {
        lblReference.Text = dtReference.ToString();
        lblReal.Text = dtReal.ToString();
        lblGame.Text = dtGame.ToString();
    }

}

編集:スクリーンショットを追加しました...

1分後=約3ヶ月 1分後=約3ヶ月

4分後=約1年 4分後=約1年

于 2013-05-14T18:53:29.057 に答える
0

値 .Interval が必要なものであることを確認してください。600 000 は 600 秒または 10 分です。イベントを実行するのに十分な時間を与えましたか? それをデバッグし、breakpoing を入れます。

于 2013-05-14T17:23:22.617 に答える
0

現在、間隔が高すぎます。60 秒ではなく 600 秒です。

DateTime newDate = new DateTime(2013, 1, 1);
void AddTime()
{

   timer1.Interval = 60000;  // was 600 seconds, now 60
   timer1.Enabled = true;
   timer1.Tick += new EventHandler(timer1_Tick);
   timer1.Start();
}

void timer1_Tick(object sender, EventArgs e)
{
    newDate = newDate.AddMonths(3); // + sign shouldn't be here
    lblDate.Text = newDate.ToString();
}

編集: 現時点で AddTime() を呼び出しておらず、どこでそれを行うべきか不明であることがわかりました。詳細な情報がないとなんとも言えませんが、Winforms を使用している場合は、フォームの load イベントを使用できます。または、クラスの場合は、コンストラクターを使用して呼び出すことができます。

基本的に、使用しているオブジェクトを初期化するメソッド。

于 2013-05-14T17:24:48.730 に答える