Пиксельное идеальное столкновение? - PullRequest
2 голосов
/ 06 августа 2009

Возможно ли сделать идеальное столкновение пикселей в приложении на основе вида? Я искал примеры кодов, но безуспешно ... Также вы можете использовать цветные растровые изображения для представления коллизий для определенного цвета?

1 Ответ

2 голосов
/ 06 сентября 2009

Можно. Похоже, это проще всего, если вы используете CGImage .

Вы можете создать двумерный логический массив для считывания значений пикселей, чтобы построить сетку попаданий (в основном, матрицу 2x2), а затем сохранить ее в своем классе игровых объектов.

Вам потребуется прямой доступ к данным пикселей для CGImage (код здесь) , затем используйте цикл for, считывая данные пикселей в логические значения массива:

BOOL pixelGrid[xPixels][yPixels];
for (int i = 0; i < xPixels; i++) {
    for (int j = 0; j < yPixels; j++) {
        pixelGrid[i][j] = pixelIsOpaque(i, j);
    }
}

Вышеописанный метод pixelIsOpaque (), очевидно, не существует, просто замените его тем, что дает пример кода для извлечения значения пикселя. Вы сохраняете, существует ли пиксель (в основном проверьте, является ли пиксель непрозрачным> 0)

Как только вы получите эту сетку (сгенерируйте ее в начале вашей программы и сохраните результирующий 2D-массив внутри игрового объекта), вам понадобится метод обнаружения столкновений.

BOOL detectCollision( BOOL *pixelGrid1, BOOL *pixelGrid2 ) {
BOOL result = NO;  
    for (int i = 0; i < xPixels; i++) {
        for (int j = 0; j < yPixels; j++) {
            if ( pixelGrid1[i][j].opacity != 0 && pixelGrid2[i][j].opacity != 0] ) {
                result = YES; break;
            }

    }
}
return result;
}

Я только что написал этот код на лету, так что я не могу быть на 100% компилируемым, но я надеюсь, что это даст вам идею. Вы можете легко изменить это, но вместо сравнения с непрозрачностью, просто сравните со значением цвета пикселя, см. Здесь для получения необработанных данных цвета.

...