Google Maps iOS Racing Game Обнаружение столкновений?

Я делаю гоночную игру для iOS, где автомобиль (UIView) помещается поверх google maps ios api. У меня возникают проблемы с обнаружением столкновений с автомобилем и серыми зданиями, которые появляются на карте.

Я пытался сделать это по цвету пикселя, то есть проверял, является ли цвет пикселя прямо перед автомобилем цветом крыши здания (серый). Прямого доступа к цвету пикселя iPhone нет, поэтому я использую метод скриншотов Google Maps, чтобы получить изображение и получить от него цвет пикселя. Проблема в том, что я могу сделать снимок только того экрана, который только что покинул. Я использую mapImage = [GMSScreenshot screenshotOfMainScreen];. Я также пытался получить окно и экран и вызвать mapImage = [GMSScreenshot screenshotOfScreen:topWindow.screen]; Оба имеют тот же эффект.

Каково решение этой проблемы? Можете ли вы придумать лучший способ обработки столкновений в этой ситуации? Есть ли у обратного геокодирования возможность определять вершины зданий по сравнению с улицами? Спасибо за любую помощь!

РЕДАКТИРОВАТЬ: Изображения: Интерфейсный конструктор: Слева — главное меню, справа — игра. Представление изображения пользовательского интерфейса в верхнем левом углу установлено как текущее изображение снимка экрана для справочных целей. Вот как я знал, что это было выключено

Игровой процесс. Как видите, он представляет только предыдущее меню.

Моя функция viewdidLoad: не более того, что связано с получением изображения.

- (void)viewDidLoad
{
    [super viewDidLoad];

    cameraPosition = CLLocationCoordinate2DMake(42.271291, -83.729918);
    moveDistance = .00055;

    cA = [UIColor colorWithRed:.937255 green:.921569 blue:.886275 alpha:1];

    camera = [GMSCameraPosition cameraWithLatitude:cameraPosition.latitude
                                         longitude:cameraPosition.longitude
                                              zoom:19
                                           bearing:0
                                      viewingAngle:0];


    mapView_ = [GMSMapView mapWithFrame:CGRectMake(0, 0, 480, 300) camera:camera];
    mapView_.myLocationEnabled = NO;

    [self.view addSubview:mapView_];

    car_ = [[Car alloc] initWithFrame:CGRectMake(240, 150, 13, 29) withImage:[UIImage imageNamed:@"carA-01.png"]];
    [self.view addSubview:car_];

    [self.view addSubview:controllerView];

    updateClock = [NSTimer scheduledTimerWithTimeInterval:(1/20)
                                                   target:self
                                                 selector:@selector(update)
                                                 userInfo:nil
                                                  repeats:YES];

    crashClock = [NSTimer scheduledTimerWithTimeInterval:1
                                                  target:self
                                                selector:@selector(checkCrash)
                                                userInfo:nil
                                                 repeats:YES];

    UIWindow *topWindow = [[UIApplication sharedApplication].windows objectAtIndex:0];

    mapImage = [GMSScreenshot screenshotOfScreen:topWindow.screen];


    //  mapImage = [GMSScreenshot screenshotOfMainScreen];
}

person Mark Mevorah    schedule 23.04.2013    source источник
comment
Можете ли вы показать больше кодов (и, возможно, скриншот)? Всего 2 строчки не помогут   -  person Raptor    schedule 23.04.2013


Ответы (1)


Получаете ли вы новый снимок экрана каждый кадр (или через какой-то интервал), например, при обратном вызове обновления?

GMSMapView не отображается сразу, когда вы создаете или вносите в него изменения — он отображается позже при следующем обновлении. Поэтому, когда вы делаете снимок экрана в viewDidLoad, вы, вероятно, видите то, что было на экране во время добавления вида карты, то есть начальное меню.

person Saxon Druce    schedule 24.04.2013
comment
Я только звонил во viewdidload, потом когда вбиваю экран и меняю камеры. Тем не менее, я обнаружил, что вызов его в моей функции обновления был очень медленным и приводил к прерывистому движению автомобиля. Чтобы быть более точным, движение автомобиля диктуется таймером updateClock, а окно было обновлено в crashTimer. Есть ли способ избежать этой изменчивости каждую секунду? Я также дважды пытался вызвать метод снимка экрана, но это тоже не сработало. - person Mark Mevorah; 24.04.2013
comment
Когда вы обновляете камеру на карте, она будет отображаться «через некоторое время» при следующем обновлении. Похоже, что он рассчитан примерно на 30 кадров в секунду, поэтому я предполагаю, что карта будет отображаться примерно через 33 мс или около того. Когда вы меняете камеру, возможно, вы могли бы установить таймер, чтобы сделать новый снимок экрана после небольшой задержки. - person Saxon Druce; 25.04.2013
comment
Это сработало, спасибо! Но теперь кажется, что изображение, которое делает снимок экрана, повернуто на 90 градусов по часовой стрелке, есть идеи, как это исправить? - person Mark Mevorah; 25.04.2013
comment
Методы GMSScreenshot могут предполагать, что устройство находится в портретном режиме, и поэтому всегда возвращают портретный снимок экрана вместо проверки. После этого вы можете попробовать повернуть его самостоятельно, например, см. градусов"> stackoverflow.com/questions/1315251/. Однако, если вам не нужно видеть скриншот, просто найдите его для обнаружения столкновений, вы можете просто настроить x/y, которые вы используете для поиска, чтобы учесть вращение. - person Saxon Druce; 26.04.2013
comment
Также, кстати, последняя версия 1.2.x SDK карт Google удалила GMSScreenshot, и теперь вы используете renderInContext. Возможно, это будет правильно использовать вращение устройства. Здесь есть пример кода: stackoverflow.com/questions/16090637/ - person Saxon Druce; 26.04.2013