Cocoa touch 当场景偏移时,如何确保仍然获得正确的触摸输入?

Cocoa touch 当场景偏移时,如何确保仍然获得正确的触摸输入?,cocoa-touch,opengl-es,cocos2d-iphone,Cocoa Touch,Opengl Es,Cocos2d Iphone,我如何接受超出场景边界的触摸输入,以便无论我将self.position设置为什么,仍然可以检测到触摸 我正在Cocos2d版本3.0上创建一个基于Ray Winderlich的平铺游戏。我正在将屏幕视图设置为平铺地图上的放大状态。我已经成功地做到了这一点,虽然现在我的触摸没有反应,因为我的坐标空间的触摸用来工作 调用此方法将缩放视图设置为播放器的位置: -(void)setViewPointCenter:(CGPoint)position{ CGSize winSize = [CCDi

我如何接受超出场景边界的触摸输入,以便无论我将
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}
,并且可以再次检测到触摸,但是我们没有角色的缩放视图。相反,它在地图的左下角显示视图

这是一个例子

我怎样才能解决这个问题

更新1

这是我的存储库的链接

更新2 到目前为止,Mark已经能够通过将
hitAreaExpansion
设置为一个较大的数字来找到一个临时解决方案,如下所示:

self.hitAreaExpansion = 10000000.0f;
这将导致触碰再次发生反应!但是,如果有一个解决方案不需要我用绝对数设置属性,那就太好了

-编辑3-(tldr版本): 将场景/层的contentsize设置为tilemap的大小可以解决此问题:

[self-setContentSize:self.tileMap.contentSize]


以下原始回复:

您将获取触摸坐标并减去图层位置

一般来说:

touchLocation = ccpSub(touchLocation, self.position);
如果要缩放图层,还需要进行适当的转换

-编辑1-

所以,我有机会再看一眼,我的“可笑”数字似乎还不够可笑,或者我做了另一个改变。无论如何,如果你简单地加上

self.hitAreaExpansion = 10000000.0f; // I'll let you find a more reasonable number 
触摸现在将被注册

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

-编辑2-:

它用次优答案困扰着我,所以我看得更远一些。请原谅,直到看到这个问题,我才看v3p

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

- (BOOL)hitTestWithWorldPos:(CGPoint)pos;
很明显,场景/层的内容大小被设置为当前视图大小,在iPad的情况下是(1024768)


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

有礼貌地解释为什么你投了否决票!当我看到人们滥用向下投票按钮时,我很沮丧。如果你仔细阅读这个问题,你可以收集到一些东西:1)我是cocos2d的新手,但我并不是在说我不知道该做什么,而是主动尝试将问题隔离到一个特定的行。2) 我的问题,现在是孤立于一个具体的问题已经仔细编写,以确保其正确的点,我要求帮助的一些具体的,这个问题是不广泛的,在所有!所以请帮我一个忙,帮我修好,伙计,阅读帮助页面。TouchBegind方法是否真的停止了触发,或者它停止了产生预期结果?如果它触发,您可能无意中在错误的坐标系下工作,即只要位置在屏幕中心的死点,它就可以正常工作。我不知道如何通过更改对象的位置来防止触发触摸事件。@YvesLeBorg它根本不会触发这不是我想要的,至少如果它仍在触发,那么我可以做一些其他事情,但它根本不会触发,就好像设置position属性会导致屏幕超出触摸边界一样。请看一下视频演示。嗨,马克,谢谢你的发帖,请看一下视频演示。如果触摸事件在第一个位置被触发,我会使用触摸坐标,正如我在视频中所显示的那样,其偏移位置的原因似乎超出了触摸事件通常注册的触摸边界。嗨,马克,对不起,我现在已经包括了视频演示。请看一看,谢谢你花时间写回复。哦,我一定错过了之前你说移动图层后没有触发触摸事件的部分。我并没有让这种情况发生在我身上,但我想除了发布的代码之外,还有其他原因。很抱歉如果这只是一个测试项目,也许在[git host]上发布整个内容会让事情变得更清楚?当然,马克,我可以做到。我将尽快发布链接,它似乎不喜欢层/场景被移动。如果移动tilemap(self.tilemap.position=viewPoint;),它会工作,有点。。至少在地图的左下象限。如果我是你,我可能会探索将挂起父层(即self.interactionLayer)的所有超节点挂起,并在该节点上进行定位。。然后我会问v3开发人员是否需要移动底层。