当我的场景被偏移时,如何确保仍能获得正确的触摸输入?

时间:2014-01-29 07:16:14

标签: cocoa-touch opengl-es cocos2d-iphone

如何接受超出场景界限的触摸输入,这样无论我设置self.position的是什么,仍然可以检测到触摸?

我正在使用Cocos2d 3.0版上的Ray Winderlich创建一个基于磁贴的游戏。我正在将我的瓷砖地图上的屏幕视图设置为放大状态。我已经成功地做到了这一点虽然现在我的触摸没有响应,因为我已经超出了用于处理的触摸空间。

调用此方法可将缩放视图设置为播放器的位置:

-(void)setViewPointCenter:(CGPoint)position{
    CGSize winSize = [CCDirector sharedDirector].viewSizeInPixels;
    int x = MAX(position.x, winSize.width/2);
    int y = MAX(position.y, winSize.height/2);
    x = MIN(x, (_tileMap.mapSize.width * _tileMap.tileSize.width) - winSize.width / 2);
    y = MIN(y, (_tileMap.mapSize.height * _tileMap.tileSize.height) - winSize.height / 2);
    CGPoint actualPosition = ccp(x, y);

    CGPoint centerOfView = ccp(winSize.width/2, winSize.height/2);
    NSLog(@"centerOfView%@", NSStringFromCGPoint(centerOfView));
    CGPoint viewPoint = ccpSub(centerOfView, actualPosition);
    NSLog(@"viewPoint%@", NSStringFromCGPoint(viewPoint));

    //This changes the position of the helloworld layer/scene so that
    //we can see the portion of the tilemap we're interested in.
    //That however makes my touchbegan method stop firing 
    self.position = viewPoint;
}

这是NSLog从方法打印的内容:

2014-01-30 07:05:08.725 TestingTouch[593:60b] centerOfView{512, 384}
2014-01-30 07:05:08.727 TestingTouch[593:60b] viewPoint{0, -832}

如您所见,y坐标为-800。如果我注释掉self.position = viewPoint行,那么self.position会读取{0, 0},并且可以再次检测到触摸,但之后我们没有关于角色的缩放视图。相反,它会在地图的左下角显示视图。

这是video demonstration

我该如何解决这个问题?

更新1

以下是我的存储库的github page

更新2 到目前为止,Mark已经能够通过将hitAreaExpansion设置为如此大的数字来提出临时解决方案:

self.hitAreaExpansion = 10000000.0f;

这将导致触摸再次响应!但是,如果有一个解决方案不需要我用绝对数字设置属性那么那就太棒了!

1 个答案:

答案 0 :(得分:1)

-edit 3-(tldr version): 将scene / layer的contentize设置为tilemap的大小可以解决这个问题:

[self setContentSize: self.tileMap.contentSize];


以下原始回复:

您将采用触摸坐标并减去图层位置。

通常类似于:

touchLocation = ccpSub(touchLocation, self.position);

如果你要缩放图层,你也需要适当的翻译。

-edit 1 -

所以,我有机会再看看,看起来我的“荒谬”数字不够荒谬,或者我做了另一个改变。无论如何,如果你只是添加

self.hitAreaExpansion = 10000000.0f; // I'll let you find a more reasonable number 

触摸现在将被注册。

至于潜在的问题,我认为这是一个未正确设置的内容规模,但我再说一遍,我现在就把它留给你。然而,我确实发现,当浏览一些tilemap类时,tileize被认为是以像素为单位,而不是点,我猜这是与此有关。

-edit 2 - :

它以次优答案打扰了我,所以我看得更远一点。原谅我,在看到这个问题之前我没有看过v3。 :P

检查基类并观察场景/图层的值:

- (BOOL)hitTestWithWorldPos:(CGPoint)pos;

很明显,场景/图层的内容大小被设置为当前视图大小,在iPad的情况下是(1024,768)

setViewPointCenter调用后图层的位置完全高于初始视图的位置,因此触摸被抑制。通过将图层/场景contentSize设置为tilemap的大小,可触摸区域现在在整个地图上展开,这允许节点处理触摸。