如何接受超出场景界限的触摸输入,这样无论我设置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
以下是我的存储库的github page。
更新2
到目前为止,Mark已经能够通过将hitAreaExpansion
设置为如此大的数字来提出临时解决方案:
self.hitAreaExpansion = 10000000.0f;
这将导致触摸再次响应!但是,如果有一个解决方案不需要我用绝对数字设置属性那么那就太棒了!
答案 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的大小,可触摸区域现在在整个地图上展开,这允许节点处理触摸。