我对iphone app开发很新,所以我开始使用Cocos2d框架而不是从头开始完全客观c,因为它降低了学习曲线,我发现它更容易。我正在尝试从Cocos2d网站上做一些教程,但是,作为人而不是羊,已经决定尝试一些本教程中没有的东西。
所以,这是教程中的相关代码:
- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event {
CGPoint location = [self convertTouchToNodeSpace: touch];
[cocosGuy stopAllActions];
[cocosGuy runAction: [CCMoveTo actionWithDuration:1 position:ccp( location.x + 32, location.y + 32)]];
这可以正常工作,cocos家伙移动到我触摸我的ipod的地方,延迟一秒和32像素偏移。所以现在,我想得到一些文字反馈,以及我在点击屏幕的位置。我尝试使用NSLog显示有关触摸location
的一些信息:
NSLog([NSString stringWithFormat:@"x=%d y=%d", location.x, location.y]);
Xcode告诉我:Format not a string literal and no format arguments
。除非我完全弄错了,@"text"
是目标C中的字符串文字,两个位置变量是格式参数。
运行时,控制台显示如下内容:
2011-06-20 19:54:22.765 Lesson1[315:707] x=0 y=1078640640
2011-06-20 19:54:23.887 Lesson1[315:707] x=0 y=1080631296
2011-06-20 19:54:24.576 Lesson1[315:707] x=0 y=1080242176
当我在三个随机位置触摸ipod屏幕时。 x似乎永远不会改变,y总是一个大整数。
我的代码出了什么问题,并且对iphone开发,Objective c和cocos2d这个世界不熟悉,我怎么能在将来尝试更好地调试它?
请注意,这实际上是我第二天尝试所有这些,所以请原谅我,如果这是一个非常明显或愚蠢的问题。
答案 0 :(得分:8)
x, y
的{{1}}成员为CGPoint
,而非float
,因此您应使用int
代替%f
。< / p>
此外,%d
能够自行格式化。尝试:
NSLog()
代替。请注意,在NSLog(@"x=%f y=%f", location.x, location.y);
的第一个参数上面的代码中:
NSLog()
是一个字符串文字,而在你的代码中,第一个参数不是字面值:
@"x=%f y=%f"
答案 1 :(得分:3)
看起来你正在使用错误的字符串格式说明符。
%d
适用于int
,但x
结构的y
和CGPoint
属性实际上是CGFloat
(已定义)作为float
或double
,取决于32位或64位)
您可以在此处查看Apple的格式说明符列表: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html%23//apple_ref/doc/uid/TP40004265
它说CGFloats应该使用%f
或%g
代替。
要使+stringWithFormat:
正确解释这些值,您的格式字符串应如@"x=%f y=%f"
另一个提示 - NSLog()实际上内置了格式,因此您只需使用
NSLog(@"x=%f y=%f", location.x, location.y);
而不是[NSString stringWithFormat:…
答案 2 :(得分:1)
警告的原因是NSLog
期望其第一个参数是字符串文字,并且您将它传递给您刚刚创建的对象。另外,我非常确定location.x
和location.y
将是浮点数,而不是整数。尝试使用%f
代替%d
。无论如何,您应该使用NSLog
来格式化字符串,如下所示:
NSLog(@"x=%f y=%f", location.x, location.y);