Trong Cocos2D, làm cách nào để kiểm tra va chạm với hình dạng do người dùng vẽ tùy ý?


10

Tôi muốn phát hiện sự va chạm giữa một sprite và hình dạng do người dùng tạo ra.

Ví dụ. Có 3 đối tượng trên màn hình. Người dùng lấy ngón tay của họ và vẽ một hình dạng bất thường xung quanh 2 đối tượng. Tôi cần phát hiện 2 đối tượng đó.

hình dạng người dùng màu tím, đối tượng trò chơi màu xanh lá cây và đỏ

Làm thế nào để tôi tiếp cận điều này một cách hiệu quả bằng Cocos2D?

Câu trả lời:


10

Có một giải pháp rất dễ dàng cho ví dụ cụ thể đó.

Tôi cho rằng hình dạng tùy ý của bạn chỉ là một loạt các điểm.

Vẽ một tia từ mỗi đối tượng của bạn theo bất kỳ hướng nào. Nếu số lần nó cắt một đoạn đường trên hình của bạn là chẵn (bao gồm 0), thì bạn nằm ngoài hình.

Nếu số lần bạn giao nhau là số lẻ, bạn ở trong đối tượng.

Xung đột phân đoạn Ray / dòng là một thuật toán khá dễ dàng để tìm / thực hiện.


3

Chắc chắn, tôi đã phải tìm ra điều đó cho trò chơi Star Catch của tôi. Có thể có những cách tốt hơn để làm điều đó nhưng đây là cách tôi đã làm nó. Tôi thực sự tìm thấy thuật toán trực tuyến (xin lỗi tôi không thể nhớ nguồn) Tôi đã thực hiện tìm kiếm để phát hiện một điểm bên trong đa giác.

Tôi đã tạo một NSMutableArray để giữ quan điểm của mình. Tôi thêm các điểm trong touchevents của tôi.

- (BOOL) testNodeInLoop:(CCNode *)node {

    CGPoint prev;

    // This is more accurate point for the node
    CGPoint absPoint = [node convertToWorldSpace:CGPointZero];

    float x = absPoint.x;
    float y = absPoint.y;

    BOOL isIn = NO;

    CGPoint cp;

    for(int i = 0, j = [points count] - 1; i < [points count]; j = i++) {
        [[points objectAtIndex:i] getValue:&cp];
        [[points objectAtIndex:j] getValue:&prev];

        if( ((cp.y > y) != (prev.y > y)) && (x < (prev.x -cp.x) * (y - cp.y) / (prev.y - cp.y) + cp.x)) {
            isIn = !isIn;
        }
    }
    return isIn;
}

Hãy cho tôi biết nếu điều này là hữu ích.



0

Để kiểm tra va chạm pixelwise, có một loạt hướng dẫn hay trên trang web của nhà phát triển XNA.
http://creators.xna.com/en-US/tutorial/collision2dperpixeltransformed

Một tối ưu hóa bạn có thể sử dụng không được sử dụng trong các hướng dẫn đó (đủ kỳ lạ) là trong hầu hết các trường hợp chỉ cần kiểm tra phác thảo, lưu các chu kỳ quý giá .

Chỉnh sửa để thêm: Câu trả lời tệ hại, đọc sai câu hỏi. Các hướng dẫn vẫn còn khá tốt mặc dù nếu bạn muốn đọc lên trên mỗi pixel pixel.

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.