有一个" Clamp"从Ray Wenderlich类的库中完成功能 - 确切地说是SKTUtils。这种钳位功能是用速记写的,但我似乎无法理解。这个夹子的目的是限制一个区域的位置 - 游戏"相机"跟随_player.position,同时确保玩家永远不会看到游戏地图之外的虚无。这是功能:
CGFloat Clamp(CGFloat value, CGFloat min, CGFloat max)
{
return value < min ? min : value > max ? max : value;
}
以下是它使用的方法,它自己使用的方法是在'didFinishUpdate&#39;方法:
-(CGPoint)pointToCenterViewOn:(CGPoint)centerOn
{
CGFloat x = Clamp(centerOn.x, self.size.width/2, _backgroundLayer.layerSize.width - self.size.width/2); //Value, Min, Max.
CGFloat y = Clamp(centerOn.y, self.size.height/2, _backgroundLayer.layerSize.height - self.size.height/2);
return CGPointMake(-x, -y);
}
-(void)didFinishUpdate
{
_worldNode.position = [self centerViewOnPoint:_player.position];
}
有人可以解释一下吗?
value < min ? min : value > max ? max : value
我只能部分理解短暂的开头:
if (value < min)
{
value = min;
}
else if (value > min)
{
value > max??????
}
答案 0 :(得分:3)
以下是对value < min ? min : value > max ? max : value
if (value < min)
{
return min
}
else
{
if (value > max)
{
return max
}
else
{
return value
}
}
答案 1 :(得分:2)
此处部分涉及运算符优先级。用一些括号来帮助阅读会更好。比较运算符绑定比三元条件更严格,所以你有:
(value < min) ? min : ((value > max) ? max : value)
从那以后,它只是从左到右进行评估。唯一棘手的一点是第一个条件运算符的else分支本身就是另一个条件运算符。如果要展开它,这相当于else if
。因此,第二个条件的else分支是整个表达式的else。
要将此转换为if
语句,您可以执行以下操作:
CGFloat retVal;
if( value < min ){
retVal = min;
}
else if( value > max ){
retVal = max;
}
else {
retVal = value;
}
return retVal;
你可能也喜欢这种方法来限制一个值:
MAX(min_limit, MIN(value, max_limit))
使用MAX
和MIN
宏来评估max_limit
或value
的较低者以及其中较高者或min_limit
,从而产生结果在min_limit
和max_limit
(包括)之间的范围内。效果是一样的;我认为这更容易阅读。