2013-09-29 110 views
1

我試圖檢查我的SKSpriteNode是否會在拖動手勢期間保持在屏幕的邊界。我已經到了一個地步,我很確定我的邏輯是朝着解決問題的方向發展,但我的實施是錯誤的。基本上,在玩家從翻譯中移動之前,程序會檢查是否有界限。這是我的代碼:保持SKSpriteNode在屏幕的邊界

-(CGPoint)checkBounds:(CGPoint)newLocation{ 
    CGSize screenSize = self.size; 
    CGPoint returnValue = newLocation; 
    if (newLocation.x <= self.player.position.x){ 
    returnValue.x = MIN(returnValue.x,0); 
    } else { 
     returnValue.x = MAX(returnValue.x, screenSize.width); 
    } 

    if (newLocation.y <= self.player.position.x){ 
    returnValue.y = MIN(-returnValue.y, 0); 
    } else { 
    returnValue.y = MAX(returnValue.y, screenSize.height); 
    } 

    NSLog(@"%@", NSStringFromCGPoint(returnValue)); 
    return returnValue; 
} 
-(void)dragPlayer: (UIPanGestureRecognizer *)gesture { 
      CGPoint translation = [gesture translationInView:self.view]; 

      CGPoint newLocation = CGPointMake(self.player.position.x + translation.x, self.player.position.y - translation.y); 
    self.player.position = [self checkBounds:newLocation]; 
} 

由於某些原因,我的播放器正在關閉屏幕。我認爲我使用MIN & MAX宏可能是錯誤的,但我不確定。

回答

1

準確地說,你混合了MIN/MAX。行MIN(x, 0)將返回x或0的較低值,這意味着結果將爲0或更小。

在一行中,您使用的是-returnValue.y,這是沒有意義的。

您可以(也應該爲了便於閱讀)省略if/else,因爲如果使用正確,MIN/MAX會使if/else不必要。

+0

問題。正在使用最小和最大冗餘?或者編譯器會知道選擇哪一個? – EvilAegis

+0

不,您必須同時應用最小值/最大值,才能將位置限制爲特定的矩形。只有if/else是多餘的,因爲它們實際上表達了與MIN/MAX宏相同的內容(或者使用if/else,但沒有MIN/MAX宏,因爲在每個實例中已經知道例如y <0,然後只設置y = 0。 – LearnCocos2D