我有一个适用于视网膜iPad和iPhone的cocos2d应用程序,我刚刚出去买了一个iPad专业版,以确保它正常工作,果然,大量的东西显示不正确。
在做了一些调试之后,我确定它是因为许多元素的比例为0 ......所以我做了一些调试,例如我的代码中有一行代码:
self.scale = 1.0f;
如果我在该行上放置一个断点,然后进入我的类从CCNode继承的setter函数:
-(void) setScale:(float) s
{
_scaleX = _scaleY = s;
_isTransformDirty = _isInverseDirty = YES;
}
然后..然后在调试器中我看看_scaleX和_scaleY ivars设置为:
(lldb) expr s
(float) $0 = 0
什么?!?!?!?!?!?!?!?世界上如何将1.0传递到此函数并变为0 ???为什么iPad专业人士无视计算机科学的所有法则?
如果我在视网膜iPad或iPhone 5或iPhone 6或iPhone 6 plus上做同样的事情,比例为1.0,而不是0。
答案 0 :(得分:0)
哇......所以,原因是这个对象被用于协议:
// stuff...
[self.menuItems enumerateObjectsUsingBlock:^(CCNode<MenuInteractable> *menuItem, NSUInteger idx, BOOL *stop) {
maxMenuItemSize = CGSizeMake(maxMenuItemSize.width, maxMenuItemSize.height * menuItem.scale);
// more stuff..
该协议看起来像:
@protocol MenuInteractable <NSObject>
@property (nonatomic) CGFloat scale;
@end
...
我注意到CCNode的setScale方法签名使用的是float类型,而不是CGFloat。
显然,这两种类型不匹配会导致iPad专业版的架构以这种方式将价值归零 - 奇怪的是这种行为只发生在iPad专业版,而不是iPad视网膜,iPhone 5/6 ,iPhone 6 +。
将协议更改为:
@protocol MenuInteractable <NSObject>
@property (nonatomic) float scale;
@end
修复了问题。