首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使SKPhysicsBody无法穿透?

使SKPhysicsBody无法穿透?
EN

Stack Overflow用户
提问于 2013-09-27 04:49:44
回答 1查看 574关注 0票数 2

我在使我的墙壁物理身体无法穿透方面有困难。如果我的玩家节点物理身体以缓慢的“速度”与墙壁相撞,它就停止了。然而,如果它以快速的“速度”前进,它就会穿过墙壁。我的播放器被PanGestureRecognizer移动了。在速度上,我的意思是如果有一个突然的“快速”的滑动,或者如果这个手势不是一个优雅的缓慢移动的平底锅手势,那么玩家会穿过墙壁。这些是我的节点属性:

代码语言:javascript
复制
  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;

如果有帮助,这就是我的移动方法:

代码语言:javascript
复制
-(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];
    }

我遗漏了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-27 08:09:22

通常,在一个纯物理驱动的世界中,实现精确的碰撞检测就足够了。

但是,由于您允许用户定位身体,所以没有什么可以阻止用户将身体的位置设置为墙内的某个位置,或者干脆跳过墙壁。然后Box2D的接触解析进入并移动身体在碰撞之外,这取决于物体被放置在墙内的位置,将导致身体被移动到另一边。

在这种情况下使用行动是适得其反的。如果触点产生一个新的位置,每帧,没有任何移动,但这导致身体被设置到给定的位置。尝试更改代码,以直接设置球员的位置,以查看这是否有任何不同。

还要注意的是,移动动作完全忽略了物理世界。如果你发出一个从一面墙到另一边的移动,那么移动动作将继续更新物理体的每一个帧的位置,然后身体在这个过程中分解它的接触,它最终会从一面墙到另一边的“量子隧道”。

造成这个问题的部分原因可能是当用户快速滑动时,两个触摸位置之间的距离很大。您也许应该使用物理世界的body bodyAlongRayStart:end: method来测试当前位置和目标位置之间是否存在阻塞体(手势转换),如果是的话,取消移动。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19042933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档