2011-06-20 81 views
1

我对iphone应用程序开发非常陌生,所以我开始使用Cocos2d框架而不是完全客观的c从头开始,因为它降低了一些学习曲线,我发现它更容易。我试图在Cocos2d网站上做一些教程,但是,作为人类而不是羊,决定尝试一些不在教程中的东西。在NSLog中看起来很奇怪的变量?

所以,这里是从教程中的相关代码:

- (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)]]; 

可正常工作,科科斯人移动到哪里我摸我的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

编译器阻止您创建经典的安全漏洞;如果您的字符串碰巧有时会创建一个无意的转义序列,那么您的手中就会有一个很好的拒绝服务攻击(最好)。 – bbum

+0

@bbum拒绝服务什么?一个iPod?它并不妨碍我编译,只是发出警告。 – Cyclone

回答

8

CGPointx, y成员float S,不int S,因此,你应该使用%f而不是%d

另外,NSLog()能够自己进行格式化。试试:

NSLog(@"x=%f y=%f", location.x, location.y); 

改为。需要注意的是,在第一个参数上面的代码NSLog()

@"x=%f y=%f" 

是一个字符串,而在你的代码中的第一个参数是不是字面:

[NSString stringWithFormat:@"x=%d y=%d", location.x, location.y] 
+0

修复它。并带来另外两个小问题:我如何投入int?而且,如何将该NSString对象转换为字符串文字? – Cyclone

+0

@Cyc如果你需要投射到一个'int',使用'(int)location.x'(然后格式化字符串中的'%d'就可以)。而且你不能将特定的字符串转换为字符串,因为它取决于'location.x'和'location.y'的值,而且这些字符串在运行时只是已知的(并且可以变化)。请注意,作为格式字符串的“@”x =%f y =%f“'可以是文字,因为它不关心将被格式化的实际值。 – 2011-06-21 00:06:39

+0

够公平的。谢谢,我从你的回复中学到了很多东西。 – Cyclone

1

的原因警告是NSLog期望它的第一个参数是一个字符串文字,并且您将它传递给您刚创建的对象。另外,我很确定location.xlocation.y将是浮点数,而不是整数。尝试使用%f而不是%d。无论如何,你应该使用NSLog格式化字符串,而不是像这样:

NSLog(@"x=%f y=%f", location.x, location.y); 
3

它看起来像你使用了错误的字符串格式说明。

%d是一个int,但CGPoint结构的xy属性实际上CGFloat(被定义为一个floatdouble,根据32位或64位)

你可以看到苹果的列表格式说明符在这里: 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:…

相关问题