/** * This method allows spiral searchs for a color. Set withing a bounds and * with a setable x,y. Thus searchs can begin in corners, center. top * center, ect. * * @param colorMap * the colors of the game screen sorted as short's in an array * [x][y][0-2] where 0 is red, 1 is blue, 2 is green * @param rgb * The RGB to search for * @param bounds * The Rectange to search, specifies which part of the * colorArray2d to search * @param startX * The x to spiral out from * @param startY * The y to spiral out from * @return the first match XY or null if no matches found */ public static final XY findXYspiral(short[][][] colorMap, RGB rgb, Rectangle bounds, int startX, int startY) { int dx = 0; int dy = 0; int relX, relY; relX = startX + dx; relY = startY + dy; boolean valid = true; int r = rgb.r, g = rgb.g, b = rgb.b; if (colorMap[relX][relY][0] != r) { valid = false; } else if (colorMap[relX][relY][1] != g) { valid = false; } else if (colorMap[relX][relY][2] != b) { valid = false; } int size = 0; int bX = bounds.x; int bY = bounds.y; int bW = bounds.width; int bH = bounds.height; int maxsize = 0; if (maxsize < startX - bX) { maxsize = startX - bX; } if (maxsize < bX + bW - startX) { maxsize = bX + bW - startX; } if (maxsize < startY - bY) { maxsize = startY - bY; } if (maxsize < bY + bH - startY) { maxsize = bY + bH - startY; } while (size < maxsize && !valid) { if (dy == size && dx < size && dx > 0) dx++; else if (dx == 0 && dy >= 0) { dy++; dx++; size++; } else if (dy == size && dx < 0) dx++; else if (dy == (-1 * size) && dx > (-1 * size)) dx--; else if (dx == size) dy--; else if (dx == -1 * size) dy++; relX = startX + dx; relY = startY + dy; if (bX < relX && relX < bX + bW && bY < relY && relY < bY + bH) { // valid = true; if (colorMap[relX][relY][0] != r) { continue; // valid = false; } if (colorMap[relX][relY][1] != g) { continue; // valid = false; } if (colorMap[relX][relY][2] != b) { continue; // valid = false; } valid = true; } } if (valid) { return new XY(relX, startY + dy); } return null; }