Cách chính xác để thực hiện phát hiện hit với các sprite không phải hình chữ nhật là gì?


8

Cách chính xác để thực hiện phát hiện chạm hoặc chạm cho các họa tiết không phải hình chữ nhật trong Cocos2d là gì?

Tôi đang làm việc trên một trò chơi ghép hình, vì vậy các họa tiết của chúng ta có một số hình thức kỳ lạ (gạch ghép hình). Đến bây giờ, chúng tôi đã thực hiện "phát hiện" theo cách này:

- (void)selectSpriteForTouch:(CGPoint)touchLocation {  
    CCSprite * newSprite = nil;

    // Loop array of sprites
    for (CCSprite *sprite in movableSprites) {

        // Check if sprite is hit.
        // TODO: Swap if with something better.
        if (CGRectContainsPoint(sprite.boundingBox, touchLocation)) {
            newSprite = sprite;
            break;
        }
    }
    if (newSprite != selSprite) {
        // Move along, nothing to see here
        // Not the problem
    }
}

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
    CGPoint touchLocation = [self convertTouchToNodeSpace:touch];
    [self selectSpriteForTouch:touchLocation];
    return TRUE;
}

Tôi biết rằng vấn đề nằm ở từ khóa " sprite.boundingBox". Có cách nào tốt hơn để thực hiện điều này không, hay nó có phải là một hạn chế khi sử dụng các họa tiết dựa trên .png không? Nếu vậy, tôi nên tiến hành như thế nào?

Câu trả lời:


5

Tôi thực sự tìm thấy một giải pháp đơn giản!

Đã thay đổi các đối tượng nhân vật để không chỉ bao gồm thông tin và sprite, mà còn cả CGPath. Sau đó thực hiện một phương thức, để lặp tất cả các đối tượng ký tự và kiểm tra

CGPathContainsPoint( params ...)

thay cho

CGRectContainsPoint( params ...)

Hướng dẫn tôi đã sử dụng: http://www.youtube.com/watch?v=HxHZwzaadNQ - "Sự kỳ diệu của CGPath"


3

Tôi không quen thuộc với mục tiêu C, vì vậy tôi không thể đưa ra bất kỳ mã cụ thể nào. Nhưng cách chung để thực hiện những việc như thế này là bằng cách kiểm tra va chạm trên mỗi pixel. Về cơ bản, nó hoạt động giống như cách bạn có nó dựa trên hình chữ nhật, nhưng trước khi thực hiện sự kiện chạm, bạn phải lặp qua tất cả các pixel được chạm và đảm bảo ít nhất một trong số chúng không trong suốt. Điều đó sẽ giúp bạn đến gần hơn với câu trả lời, hy vọng người khác có thể cung cấp cho bạn một số mẫu mã thực tế về chủ đề này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.