2011-06-24 23 views
1

我對此有點卡住了。我想確定兩個不透明度int值。一個應該增加,另一個應該按小時減少。假設一天由4部分組成。晚上,日出,日落和日落。每個部分都由 兩張圖片疊加在一起。夜晚有夜間圖像和日出圖像。在午夜的夜晚,圖像具有255的不透明度,而日出實際上是不可見的。按當前時間計算兩個int值

當時間流逝到例如4點,夜間圖像的不透明度下降,而日出的不透明度增加。在5點鐘的夜晚,圖像不透明度爲0,而日出圖像的不透明度爲255.

因此,在4個部分中,我要計算兩個不透明度值,一個增加另一個減少值。在每個部分的不透明度變爲從255到0和從0到255

另一側這是我的單獨以小時

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; 
    } 

我用該溶液

int opacIn = hour * 10; 

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

int opacOut = 255 - opacIn; 
嘗試過的部件

這樣做的問題是,這決定了參照整天的不透明度。所以它從255到0只有一次。但我希望一天的每一部分都能如此。

對此的任何想法?我怎麼能確定每個部分的不透明度?

回答

3

它看起來像你需要一箇舊模塊算術的破折號。你的一天分成四段,每段六小時;每個小時要更改一些值,並且每個段中的相應小時數具有相同的值。

因此,首先,由步數除以你的目標值:

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

注意的是,如果你看過case是你的switch語句列,一列中的每個值具有相同的效果模6.這是關鍵;每次檢查的時候,發現你的位置是在當前部分內容:

// 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; 

現在你得到的不透明度值很簡單:

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

您也可以與switch做掉:

int segment_index = shifted_hour/6; 

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