2012-08-27 36 views
9

Như một câu hỏi tiếp theo trên cho câu hỏi trước đây của tôi về displaying the anchor point, tôi subclassed CCSprite và thay đổi phương pháp bốc thăm như sau:Làm cách nào để hiển thị hộp giới hạn cho một CCNode trong cocos2d?

[super draw]; 
ccDrawColor4F(0, 1, 0, 1); 
ccDrawCircle(self.anchorPointInPoints, 20, 0, 8, YES); 

này hoạt động tuyệt vời. Đối với tín dụng thêm, tôi được thêm vào sau để hiển thị hộp bounding của nó:

CGRect bb = self.boundingBox; 
CGPoint vertices[4] = { 
    [self convertToNodeSpace:ccp(bb.origin.x, bb.origin.y)], 
    [self convertToNodeSpace:ccp(bb.origin.x + bb.size.width, bb.origin.y)], 
    [self convertToNodeSpace:ccp(bb.origin.x + bb.size.width, bb.origin.y + bb.size.height)], 
    [self convertToNodeSpace:ccp(bb.origin.x, bb.origin.y + bb.size.height)], 
}; 
ccDrawPoly(vertices, 4, YES); 

này cũng hoạt động tuyệt vời, cho đến khi tôi reparent một sprite:

CGPoint oldPosition = [sprite convertToWorldSpace:sprite.position]; 
[sprite removeFromParentAndCleanup:NO]; 
[parentSprite addChild:sprite]; 
sprite.position = [sprite convertToNodeSpace:oldPosition]; 

của sprite tại ở vị trí thích hợp và điểm neo của nó rút ra nơi cần, nhưng hộp giới hạn vẽ ở vị trí sai. Tôi đang làm gì sai?

Trả lời

18

Hộp giới hạn của nút là so với nút gốc. Phương thức vẽ được thực hiện theo phương thức vẽ nằm trong không gian địa phương của của nút. convertToNodeSpace: chuyển đổi toạ độ từ thế giới không gian thành không gian cục bộ, không phải từ không gian của cha mẹ.

Khi bạn đặt lại nút cho phụ huynh có nguồn gốc khác nhau trong khi duy trì cùng vị trí "thế giới" của nút này, nguồn gốc của hộp giới hạn của nó thay đổi.

Sai lầm của bạn là bạn đối xử với hộp giới hạn của sprite như thể tọa độ của nó nằm trong không gian thế giới.

Thứ hai, bạn không cần thực hiện điệu nhảy chuyển đổi thành x không gian để vẽ hộp giới hạn của một hình ảnh. Mở tập tin trong thư mục ccConfig.h cocos2d của dự án của bạn và thay đổi

#define CC_SPRITE_DEBUG_DRAW 0 

dòng để

#define CC_SPRITE_DEBUG_DRAW 1 

Thứ ba, tọa độ của sprite.position điểm có liên quan đến mẹ, không phải ma. Khi bạn gọi [node convertToWorldSpace:aPoint], nó sẽ xử lý aPoint như thể nó nằm trong không gian cục bộ của nút. Nếu bạn muốn nhận tọa độ thế giới về vị trí của một nút, bạn nên gọi convertToWorldSpace: trên cha mẹ của nút: [node.parent convertToWorldSpace:node.position].

+0

Cảm ơn bạn! Rất khai ngộ. Tất cả đã được sửa. Tôi thực sự cần phải subclass CCSprite kể từ khi tôi muốn chọn lọc bật hộp bounding, nhưng vay mã từ CC_SPRITE_DEBUG_DRAW và vẽ poly hình thành bởi 'quad_.tl.vertices' đỉnh thực hiện chính xác những gì tôi cần. – mobopro

2

Tôi thường vẽ AABBs với:

Rect aabb = someNode->getBoundingBox(); 
DrawNode* drawNode = DrawNode::create(); 
drawNode->drawRect(aabb.origin, aabb.origin + aabb.size, Color4F(1, 0, 0, 1)); 
parentNode->addChild(drawNode, 100); 

Lưu ý: Nếu kích thước Rect aabb là (0,0) thì hình chữ nhật sẽ không được rút ra.

+1

Câu trả lời hay. Tôi thích rằng nó không yêu cầu biên dịch lại Cocos2d-x như trên. – aardvarkk

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