2011-06-20 135 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:…

相關問題