【问题标题】:Google Maps iOS Racing Game Collision Detection?谷歌地图 iOS 赛车游戏碰撞检测?
【发布时间】:2013-04-16 05:47:05
【问题描述】:

我正在为 iOS 制作一个驾驶游戏,其中一辆汽车 (UIView) 放置在 google maps ios api 的顶部。我无法检测与地图上显示的汽车和灰色建筑物的碰撞。

我一直在尝试通过像素颜色来做到这一点,即检查汽车前面的像素颜色是否是建筑物屋顶的颜色(灰色)。无法直接访问 iPhone 的像素颜色,因此我使用谷歌地图截图方法来获取图像并从中获取像素颜色。问题是,我只能截取刚刚离开的屏幕。我在用 mapImage = [GMSScreenshot screenshotOfMainScreen];。我也尝试过获取窗口和屏幕并调用mapImage = [GMSScreenshot screenshotOfScreen:topWindow.screen]; 两者都具有相同的效果。

有什么办法可以解决这个问题?你能想出一种更好的方法来处理这种情况下的碰撞吗?反向地理编码是否能够检测建筑物的顶部和街道? 感谢您的所有帮助!

编辑: 图片: Interface Builder:左边是主菜单,右边是游戏。左上角的 Ui 图像视图设置为当前屏幕截图,以供参考。这就是我知道它关闭的方式

Game Play,如您所见,它只显示上一个菜单。

我的 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];
}

【问题讨论】:

  • 你能显示更多代码(也许还有截图)吗?只有 2 行无济于事

标签: ios objective-c google-maps-api-3 google-maps-sdk-ios


【解决方案1】:

您是否每帧(或每隔一段时间)都获得新的屏幕截图,例如从您的更新回调?

GMSMapView 在您创建或更改它时不会立即呈现 - 它会在下次更新时呈现。因此,当您在viewDidLoad 中截取屏幕截图时,您可能会看到添加地图视图时屏幕上的内容,即初始菜单。

【讨论】:

  • 我只是在 viewdidload 中调用它,然后当我离开屏幕并更换相机时。但是,我发现在我的更新函数中调用它非常慢,并且导致汽车运动不稳定。更具体地说,汽车的运动由 updateClock 计时器决定,并且窗口在 crashTimer 中更新。有没有办法避免这种波涛汹涌的每一秒?我也试过两次调用屏幕截图方法,但这也没有用。
  • 当您在地图上更新相机时,它会在下一次更新时渲染“一段时间后”。它的目标似乎是大约 30fps,所以我猜地图被渲染的时间可能是大约 33 毫秒左右。当您更换相机时,也许您可​​以设置一个计时器,在稍稍延迟后拍摄新的屏幕截图。
  • 成功了,谢谢!但现在似乎屏幕截图正在拍摄的图像顺时针旋转了 90 度,任何想法如何解决这个问题?
  • GMSScreenshot 方法可能假定设备处于纵向模式,因此总是返回纵向屏幕截图,而不是检查。之后您可以尝试自己旋转它,例如参见stackoverflow.com/questions/1315251/…。但是,如果您不需要查看屏幕截图,只需查找它以进行碰撞检测,您可以调整用于查找的 x/y 以考虑旋转。
  • 另外顺便说一句,最新版本的 1.2.x 的 Google 地图 SDK 已经删除了GMSScreenshot,现在您使用renderInContext。也许这将正确使用设备旋转。这里有一些示例代码:stackoverflow.com/questions/16090637/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多