我有一個使用cocos2d-iphone構建的相當簡單的應用程序,但是我一直無法解決一個奇怪的定位問題。該應用使用精靈表,並且應用內有一個Retina和非Retina精靈表,使用完全相同的圖形(當然,分辨率除外)。該應用程序中還有其他用於CCSprites
的圖形,它們都是標準和-hd後綴。Cocos2d-iPhone:CCSprite在視網膜和非視網膜屏幕上的位置不同
在應用程序中,應用程序啓動時會創建一組精靈。這些最初創建的CCSprites
始終在Retina &上的位置相同(並正確),非視網膜屏幕。
// In method called to setup sprites when app launches
// Cache & setup app sprites
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile: @"sprites.plist"];
sprites = [CCSpriteBatchNode batchNodeWithFile: @"sprites.png"];
hill = [CCSprite spriteWithSpriteFrameName: @"hill.png"];
hill.position = ccp(160, 75);
[sprites addChild: hill z: 1];
// ... [create more sprites in same fashion]
// NOTE: All sprites created here have correct positioning on Retina & non-Retina screens
當用戶點擊屏幕一定的方式中,一種方法被稱爲創建另一基團的CCSprites
(導通和截止屏幕),動畫它們全部,其中一個子畫面的,hand
,總是在Retina &非視網膜屏幕上的位置相同(並正確)。其他人(一羣雲)成功創建&動畫,但他們的位置是正確的只有在視網膜顯示。在非Retina顯示屏上,每個雲的起始位置都不正確(對於x
,y
或有時兩者都不正確),並且它們在動畫之後的結束位置也是錯誤的。
我已經在觸摸方法中包含了以下負責的代碼,可以創建新的精靈並將它們加以動畫。再一次,它在Retina顯示屏上按預期工作,但在非Retina屏幕上顯示不正確。使用的CCSprites
在應用程序啓動時以相同的方式創建,以設置應用程序中始終具有正確位置的所有初始精靈。
// Elsewhere, in a method called on touch
// Create clouds
cloud1 = [CCSprite spriteWithSpriteFrameName: @"cloud_1.png"];
cloud1.position = ccp(-150, 320);
cloud1.scale = 1.2f;
cloud2 = [CCSprite spriteWithSpriteFrameName: @"cloud_2.png"];
cloud2.position = ccp(-150, 335);
cloud2.scale = 1.3f;
cloud3 = [CCSprite spriteWithSpriteFrameName: @"cloud_4.png"];
cloud3.position = ccp(-150, 400);
cloud4 = [CCSprite spriteWithSpriteFrameName: @"cloud_5.png"];
cloud4.position = ccp(-150, 420);
cloud5 = [CCSprite spriteWithSpriteFrameName: @"cloud_3.png"];
cloud5.position = ccp(400, 350);
cloud6 = [CCSprite spriteWithSpriteFrameName: @"cloud_1.png"];
cloud6.position = ccp(400, 335);
cloud6.scale = 1.1f;
cloud7 = [CCSprite spriteWithSpriteFrameName: @"cloud_2.png"];
cloud7.flipY = YES;
cloud7.flipX = YES;
cloud7.position = ccp(400, 380);
// Create hand
hand = [CCSprite spriteWithSpriteFrameName:@"hand.png"];
hand.position = ccp(160, 650);
[sprites addChild: cloud1 z: 10];
[sprites addChild: cloud2 z: 9];
[sprites addChild: cloud3 z: 8];
[sprites addChild: cloud4 z: 7];
[sprites addChild: cloud5 z: 6];
[sprites addChild: cloud6 z: 10];
[sprites addChild: cloud7 z: 8];
[sprites addChild: hand z: 10];
// ACTION!!
[cloud1 runAction:[CCMoveTo actionWithDuration: 1.0f position: ccp(70, 320)]];
[cloud2 runAction:[CCMoveTo actionWithDuration: 1.0f position: ccp(60, 335)]];
[cloud3 runAction:[CCMoveTo actionWithDuration: 1.0f position: ccp(100, 400)]];
[cloud4 runAction:[CCMoveTo actionWithDuration: 1.0f position: ccp(80, 420)]];
[cloud5 runAction:[CCMoveTo actionWithDuration: 1.0f position: ccp(250, 350)]];
[cloud6 runAction:[CCMoveTo actionWithDuration: 1.0f position: ccp(250, 335)]];
[cloud7 runAction:[CCMoveTo actionWithDuration: 1.0f position: ccp(270, 380)]];
[hand runAction: handIn];
這可能是值得一提的是我看到一個正在運行的應用程序和標準的iPhone和iPhone(視網膜)的硬件選項之間切換時,在iPhone模擬器這個定位不正確的行爲。我沒有能夠驗證這種情況發生,或者在實際的非Retina iPhone上沒有發生,因爲我沒有。然而,這是我唯一一次看到這種奇怪的定位行爲發生(在用戶觸摸後得到不正確的結果),並且因爲我以完全相同的方式創建了所有的精靈(即,[CCSprite spriteWithSpriteFrameName:]
,然後設置了position
與position
cpp()
),我會特別感謝任何幫助,以追查爲什麼這組單個精靈在非Retina屏幕上總是不正確。
編輯/更新 我已經添加了一些額外的日誌來精確調查創建的精靈發生了什麼。這裏是一個雲的例子:
// Non-Retina
cloud1 position -- x: 70.000000 y: 320.000000
cloud1 anchor -- x: 0.500000 y: 0.500000
cloud1 size -- w: 384.000000 h: 576.000000
cloud1 origin -- x: -122.000008 y: 31.999989
// Retina
cloud1 position -- x: 70.000000 y: 320.000000
cloud1 anchor -- x: 0.500000 y: 0.500000
cloud1 size -- w: 172.800003 h: 121.800003
cloud1 origin -- x: -16.400003 y: 259.100006
我必須說我對此很困惑。我也沒有混合這些日誌。非Retina上的邊界框比Retina上的邊界框大?而且這些寬度/高度值甚至不匹配它們引用的圖像的大小。也許在spritesheets /紋理內發生了一些奇怪的事情?我也注意到起源不匹配。也許這也會影響產出?很奇怪,它只發生在這些精靈身上,沒有其他人。
任何想法&建議表示讚賞。
您是否檢查過實際圖像文件本身是否正確?也許非視網膜版本有一些額外的透明空間,導致它不正確地對齊。 –
是的,我想到了。甚至還要重新制作精靈表,仔細檢查他們有相同的佈局參數和結果。我將重新檢查用於製作精靈圖表的源圖像。 編輯:檢查所有源圖像用於構建精靈表(通過Zwoptex);沒有明顯的額外空間,所有標準解像圖像都是按比例縮小的HD圖像版本。 – bobwaycott