2011-06-24 11 views
1

これはちょっと残念です。私は2つの不透明度のint値を決定したい。 1つは増加し、もう1つは時間によって減少するはずです。現在の時刻で2つのint値を計算する

1日は4つの部分で構成されているとします。夜、日の出、日、日没。各部品は、 の2枚の画像が重ね合わせて描かれています。夜には夜のイメージと日の出のイメージがあります。真夜中の夜の画像は、日の出は実際には見えないが、不透明度は255と言うことができます。

時間が経過するまで、 4時に、夜の画像の不透明度が低下し、日の出の不透明度が増加します。 5時の夜には画像の不透明度が0で、日の出の画像の不透明度は255です。

したがって、4つの部分のそれぞれで、2つの不透明度の値を計算します。各パートでは不透明度が255から0になり、他の側に0〜255

にこれは私がこのソリューション

int opacIn = hour * 10; 

if (opacIn >= 230) { 
    opacIn += 25; 
} 

int opacOut = 255 - opacIn; 
でそれを試してみました時間

switch (hour) { 
     //night to sunrise 
     case 23: case 0: case 1: case 2: case 3: case 4: 
      [self setSetting:1 andOpacity:opacIn andOpacity:opacOut]; 
      break; 
     //sunrise to day 
     case 5: case 6: case 7: case 8: case 9: case 10: 
      [self setSetting:1 andOpacity:opacIn andOpacity:opacOut]; 
      break; 
     //day to sunset 
     case 11: case 12: case 13: case 14: case 15: case 16: 
      [self setSetting:4 andOpacity:opacIn andOpacity:opacOut]; 
      break; 
     //sunset to night 
     case 17: case 18: case 19: case 20: case 21: case 22: 
      [self setSetting:2 andOpacity:opacIn andOpacity:opacOut]; 
      break; 
    } 

で部品を区切る方法です

これは、1日中の不透明度を決定する問題です。したがって、1回だけ255から0になります。しかし、私はそれが今日の各部分のためにこの方法であることを望んでいます。

これに関するご意見はありますか?どのように各部品の不透明度を決定できますか?

答えて

3

古いモジュラー算術のダッシュが必要なようです。あなたの日は、それぞれ6時間の4つのセグメントに分割されます。あなたが何らかの値を変更したいと思う各時間と、各セグメントの対応する時間は同じ値を持っています。

だから最初に、ステップの数によって、あなたの目標値を分割:あなたが列としてあなたのswitch文のcase Sを読めば、列のすべての値が同じ結果の剰余を持っている、ということ

// Avoid magic numbers 
#define MAX_OPACITY 255 
#define HOURS_PER_SEGMENT 6 
#define OPACITY_STEP (MAX_OPACITY/HOURS_PER_SEGMENT) 

お知らせ

これがキーです。

// For purposes of opacity, it's as if 11PM is the first hour of the day 
int shifted_hour = hour + 1; 
if(24 == shifted_hour) shifted_hour = 0; 
int segment_pos = shifted_hour % HOURS_PER_SEGMENT; 

は今、あなたは非常に単純にあなたの不透明度の値を取得する:あなたはまた、switchと離れて行うことができます

int opacIn = segment_pos * OPACITY_STEP; 
int opacOut = MAX_OPACITY - opacIn; 

たび、あなたはあなたの位置は現在のセグメントであるかを調べる、時間を確認してください。

int segment_index = shifted_hour/6; 

[self setSegment:segment_index withOpacityIn:opacIn withOpacityOut:opacOut];