2009-08-06 3 views
2

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

ответ

2

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

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

Вам потребуется прямой доступ к пикселям для CGImage (the code is here) затем использовать для цикла считывания пиксельных данных в массив булевых значений:

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() выше, очевидно, Безразлично» t, просто замените все, что дает код примера, чтобы извлечь значение пикселя. Вы сохраняете, существует ли пиксель (в основном, проверьте, прозрачен ли пиксель) 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% компилируется, но я надеюсь, что это дает вам идею. Вы можете легко изменить это, но вместо сравнения с непрозрачностью просто сравните с значением цвета пикселя снова, see here для получения необработанных данных цвета.

+0

+1 для отличной информации. Меня действительно интересовали идеальные столкновения пикселей. Я попытаюсь посмотреть, будет ли это работать в эти выходные. Меня просто беспокоит производительность, но это еще одна проблема, которую можно решить в более позднее время. – Tovi7

Смежные вопросы