Я имею на самом деле просто, недавно записал эту функциональность в один из моих проектов.
void Battle::CheckSensorRange(Unit* unit,bool fog){
int sensorRange = 0;
for(int i=0; i < unit->GetSensorSlots(); i++){
if(unit->GetSensorSlot(i)->GetSlotEmpty() == false){
sensorRange += unit->GetSensorSlot(i)->GetSensor()->GetRange()+1;
}
}
int originX = unit->GetUnitX();
int originY = unit->GetUnitY();
float lineLength;
vector <Place> maxCircle;
//get a circle around the unit
for(int i = originX - sensorRange; i < originX + sensorRange; i++){
if(i < 0){
continue;
}
for(int j = originY - sensorRange; j < originY + sensorRange; j++){
if(j < 0){
continue;
}
lineLength = sqrt( (float)((originX - i)*(originX - i)) + (float)((originY - j)*(originY - j)));
if(lineLength < (float)sensorRange){
Place tmp;
tmp.x = i;
tmp.y = j;
maxCircle.push_back(tmp);
}
}
}
//if we're supposed to fog everything we don't have to do any fancy calculations
if(fog){
for(int circleI = 0; circleI < (int) maxCircle.size(); circleI++){
Map->GetGrid(maxCircle[circleI].x,maxCircle[circleI].y)->SetFog(fog);
}
}else{
bool LOSCheck = true;
vector <bool> placeCheck;
//have to check all of the tiles to begin with
for(int circleI = 0; circleI < (int) maxCircle.size(); circleI++){
placeCheck.push_back(true);
}
//for all tiles in the circle, check LOS
for(int circleI = 0; circleI < (int) maxCircle.size(); circleI++){
vector<Place> lineTiles;
lineTiles = line(originX, originY, maxCircle[circleI].x, maxCircle[circleI].y);
//check each tile in the line for LOS
for(int lineI = 0; lineI < (int) lineTiles.size(); lineI++){
if(false == CheckPlaceLOS(lineTiles[lineI], unit)){
LOSCheck = false;
//mark this tile not to be checked again
placeCheck[circleI] = false;
}
if(false == LOSCheck){
break;
}
}
if(LOSCheck){
Map->GetGrid(maxCircle[circleI].x,maxCircle[circleI].y)->SetFog(fog);
}else{
LOSCheck = true;
}
}
}
}
существует некоторый дополнительный материал там, что Вам не было бы нужно при адаптации его к собственному использованию. Место типа просто определяется как положение X и Y для пользы удобств.
функция строки взята из Википедии с очень маленькими модификациями. Вместо того, чтобы распечатать x y координирует, я изменил его для возврата вектора места со всеми точками в строке. Функция CheckPlaceLOS просто возвращает TRUE или FALSE на основе того, если мозаика имеет объект на нем. Существует еще некоторая оптимизация, которая могла быть сделана с этим, но это хорошо для моих потребностей.
Использовать группировку. Я добавил ?
, чтобы сделать сопоставление «нелицеприятным», так как это, вероятно, то, что вы хотите.
var matches = mystring.match(/\[(.*?)\]/);
if (matches) {
var submatch = matches[1];
}
Поскольку javascript не поддерживает захват, вы должны обойти его. Рассмотрим эту альтернативу, использующую противоположный подход. Скорее это фиксирует то, что находится внутри скобок, удаляет то, что находится за ними. Поскольку всегда будет только один набор скобок, он должен работать нормально. Я обычно использую этот метод для удаления начальных и конечных пробелов.
mystring.replace( /(^.*\[|\].*$)/g, '' );
Вы пытались захватить скобки:
("\\[(.*)]");
Это должно вернуть шаблон в пределах скобки как зафиксированное совпадение в возвращенном массиве
Вы не можете. Javascript не поддерживает поиск назад.
Вам придется либо использовать группу захвата, либо обрезать скобки.
Кстати, вам, вероятно, не нужен жадный . *
в ваше регулярное выражение. Попробуйте следующее:
"\\[.*?]"
Или лучше, это:
"\\[[^\\]]*]"