2011-07-13 19 views
5

Tôi đang tạo một RPG 2d dựa trên gạch với cocos2d. Tôi đang sử dụng CCTMXTileMaps cho bản đồ của mình. Máy nghe nhạc của tôi là trung tâm trên màn hình và bản đồ di chuyển xung quanh nó (trừ khi người chơi đi về phía rìa của bản đồ, nơi họ đi bộ ra khỏi trung tâm và thực sự di chuyển). Hệ thống này hoạt động tốt trong các bản đồ lớn. Tuy nhiên, trong bản đồ nhỏ, bản đồ được neo ở phía trên bên phải của màn hình. Trong khi các cơ chế vẫn hoạt động, sẽ rất tốt nếu các bản đồ nhỏ này được căn giữa tự động.Làm thế nào tôi có thể căn giữa một CCTMXTileMap nhỏ trong cocos2d?

Làm cách nào để tạo bản đồ nhỏ hơn kích thước của màn hình? Tôi muốn bản đồ được căn giữa trong "hộp màu đỏ". (Hộp màu đỏ là chỉ vào đây để mục đích minh họa, nó không thực sự có trong mã.)

enter image description here

EDIT:

Vì vậy, tôi đã tìm ra cách để làm điều đó trong lý thuyết, nhưng tôi m gặp khó khăn khi hiểu hệ tọa độ. Tôi đang sử dụng mã sau để căn giữa bản đồ nhưng nó không hoạt động như mong đợi. Bản đồ tải ra khỏi màn hình.

if ((self.tileMap.contentSize.height < screenSize.height) && (self.tileMap.contentSize.width < screenSize.width)) { 

    CGSize winSize = [[CCDirector sharedDirector] winSize]; 
    CGPoint centerOfView = ccp(winSize.width/2, winSize.height/2);   


    CGPoint centerOfMap = CGPointMake((self.tileMap.mapSize.width*self.tileMap.tileSize.width)/2, (self.tileMap.mapSize.height*self.tileMap.tileSize.height)/2); 

    self.tileMap.anchorPoint = centerOfMap; 
    self.tileMap.position = centerOfView; 

} 

Tôi đang làm gì sai ở đây?

+0

xác định "vi phạm điều gì đó", nó có bị lỗi hoặc không hoạt động như bạn muốn không? –

+0

@FraserGraham Đã chỉnh sửa. Nó chạy, nhưng không cư xử như tôi muốn. – Moshe

Trả lời

0

Ok, giải pháp khá đơn giản, mặc dù tôi đã thiếu một vài thứ. Mã cơ bản nhất để căn giữa bản đồ trong bố mẹ là:

// 
    // Get the center of the 
    // screen/map layer (which are the same) 
    // 

    CGPoint centerOfSelf = CGPointMake(self.contentSizeInPixels.width/2, self.contentSizeInPixels.height/2); 

    // 
    // Position the map in the center 
    // 

    tileMap.position = CGPointMake(centerOfSelf.x - (tileMap.contentSizeInPixels.width/2), centerOfSelf.y - (tileMap.contentSizeInPixels.height/2)); 

Mã được đề cập ở trên sẽ hoạt động nếu bạn tải một bản đồ cho mỗi cảnh. Tuy nhiên, nếu bạn có (giống như tôi) một cảnh "thế giới" tải các bản đồ và dữ liệu liên quan, thì bạn cần phải làm những việc khác một chút. Bạn thấy đấy, việc tải một bản đồ lớn hơn màn hình sẽ khiến lớp đó "căng" và thay đổi kích thước bản đồ để vừa với bản đồ lớn hơn. Khi làm như vậy, đoạn mã trên sẽ tập trung và sau đó nạp bản đồ vào cảnh bản đồ "kéo dài". Vì vậy, để chống lại điều này, trước tiên tôi phải thay đổi kích thước lớp "cảnh thế giới" để phù hợp với kích thước của màn hình. Để làm như vậy, tôi sử dụng mã sau:

Lưu ý rằng tôi cũng di chuyển "máy ảnh" trở lại vị trí 0,0, trong trường hợp chúng tôi đã di chuyển theo ký tự chính của chúng tôi.

Các vấn đề liên quan