我在使我的墙壁物理身体无法穿透方面有困难。如果我的玩家节点物理身体以缓慢的“速度”与墙壁相撞,它就停止了。然而,如果它以快速的“速度”前进,它就会穿过墙壁。我的播放器被PanGestureRecognizer移动了。在速度上,我的意思是如果有一个突然的“快速”的滑动,或者如果这个手势不是一个优雅的缓慢移动的平底锅手势,那么玩家会穿过墙壁。这些是我的节点属性:
self.player.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.player.size];
self.player.physicsBody.categoryBitMask = SVGPlayerCategory;
self.player.physicsBody.contactTestBitMask = SVGWallCategory;
self.player.physicsBody.collisionBitMask = SVGWallCategory;
self.player.physicsBody.dynamic = YES;
self.player.physicsBody.usesPreciseCollisionDetection = YES;
self.player.physicsBody.velocity = CGVectorMake(0, 0);
self.leftWall.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.leftWall.size];
self.leftWall.physicsBody.categoryBitMask = SVGWallCategory;
self.leftWall.physicsBody.contactTestBitMask = SVGPlayerCategory;
self.leftWall.physicsBody.collisionBitMask = SVGPlayerCategory;
self.leftWall.physicsBody.dynamic = NO;
self.leftWall.physicsBody.resting = YES;如果有帮助,这就是我的移动方法:
-(void)dragPlayer: (UIPanGestureRecognizer *)gesture {
CGPoint translation = [gesture translationInView:self.view];
SKAction *move = [SKAction moveByX:translation.x y:-translation.y duration:0];
[self.player runAction:move];
[gesture setTranslation:CGPointMake(0, 0) inView:self.view];
}我遗漏了什么吗?
发布于 2013-09-27 08:09:22
通常,在一个纯物理驱动的世界中,实现精确的碰撞检测就足够了。
但是,由于您允许用户定位身体,所以没有什么可以阻止用户将身体的位置设置为墙内的某个位置,或者干脆跳过墙壁。然后Box2D的接触解析进入并移动身体在碰撞之外,这取决于物体被放置在墙内的位置,将导致身体被移动到另一边。
在这种情况下使用行动是适得其反的。如果触点产生一个新的位置,每帧,没有任何移动,但这导致身体被设置到给定的位置。尝试更改代码,以直接设置球员的位置,以查看这是否有任何不同。
还要注意的是,移动动作完全忽略了物理世界。如果你发出一个从一面墙到另一边的移动,那么移动动作将继续更新物理体的每一个帧的位置,然后身体在这个过程中分解它的接触,它最终会从一面墙到另一边的“量子隧道”。
造成这个问题的部分原因可能是当用户快速滑动时,两个触摸位置之间的距离很大。您也许应该使用物理世界的body bodyAlongRayStart:end: method来测试当前位置和目标位置之间是否存在阻塞体(手势转换),如果是的话,取消移动。
https://stackoverflow.com/questions/19042933
复制相似问题