2010年09月26日

一定周期のループを安定させる方法(C#用メモ)

一定周期の処理を行いたいとき、タイマーを使えば良いのですが、より精度の高い周期で処理を行いたい場合は、次のような方法が考えられます。 これはゲームなどで、1フレーム(1回の画面の更新)の長さを1/60秒に保つために、良く用いられる方法です。

// 次に処理するフレームの時刻(初回は即処理するので初期値は現在時刻をセット)
double nextFrame = (double)System.Environment.TickCount;
// フレームを処理する周期(1/60秒)
float period = 1000f / 60f;

// メインループ
while ( true )
{
    // 現在の時刻を取得
    double tickCount = (double)System.Environment.TickCount;

    // 次に処理するフレームの時刻まで間がある場合は、処理をスキップする
    if (tickCount < nextFrame)
    {
        // 1ms以上の間があるか?
        if (nextFrame - tickCount > 1)
        {
            // Sleepする
            System.Threading.Thread.Sleep( (int)(nextFrame - tickCount) );
        }
        // Windowsメッセージを処理させる
        Application.DoEvents();
        // 残りの処理をスキップする
        continue;
    }

    // 
    // ここで描画以外の計算処理を行う。
    // 

    // この時点で現在の時刻が次のフレームの時刻より後ならば、
    // このフレームを描画している暇はないので、描画しないでスキップする
    if ((double)System.Environment.TickCount >= nextFrame + period)
    {
        nextFrame += period;
        continue;
    }

    // 
    // ここで描画処理を行う。
    // 

    // 次のフレームの時刻を計算する
    nextFrame += period;
}

良かったらクリックしてください
にほんブログ村 IT技術ブログ プログラム・プログラマーへ  人気ブログランキングへ

posted by among at 15:55 | Comment(0) | TrackBack(0) | C#

2010年09月25日

構造体のリストの値を変更する方法(C#用メモ)

構造体のリストの値を変更するとき、forループの中で構造体のメンバを直接さわることが出来ないので、次のような方法で変更します。

// 構造体の定義
struct SampleData
{
    public bool Status;
}

// 構造体のリストの定義
private List<SampleData> sampleData = new List<SampleData>();

// forループで値を変更する
for (int i = 0; i < sampleData.Count(); i++)
{
    // 本当は下記のようにしたいが、これだとエラーになる
    //sampleData[i].Status = true;

    // 下記のようにすることで、変更できる
    SampleData tmpData = sampleData[i];
    tmpData.Status = true;
    sampleData[i] = tmpData;
}

良かったらクリックしてください
にほんブログ村 IT技術ブログ プログラム・プログラマーへ  人気ブログランキングへ

posted by among at 20:05 | Comment(0) | TrackBack(0) | C#

2010年09月12日

フォームのスタイル(C#用メモ)

(自分用メモ)

C#で良く使いそうなフォームのスタイル変更方法のメモ。

// フォームの不透明度を変更する
this.Opacity = 0.75; // 75%

// 常に手前に表示
this.TopMost = true;

// 最大化ボタン非表示
this.MaximizeBox = false;

// 最小化ボタン非表示
this.MinimizeBox = false;

// コントロールボックス(タイトルバー、最小化、最大化ボタンなど)非表示
this.ControlBox = false;

// タスクバーにフォームを表示しない
this.ShowInTaskbar = false;

// フォームの境界線を無しにする
this.FormBorderStyle = FormBorderStyle.None;

// フォームの背景色を変更する
this.BackColor = System.Drawing.Color.Black; // 黒

// フォームの横幅を変更する
this.Width = 48;

// フォームの縦幅を変更する
this.Height = 48;

// フォームの位置を変更する
this.Left = 100;
this.Top = 100;

良かったらクリックしてください
にほんブログ村 IT技術ブログ プログラム・プログラマーへ  人気ブログランキングへ

posted by among at 15:00 | Comment(0) | TrackBack(0) | C#