联系仍然存在时被终止

Posted

技术标签:

【中文标题】联系仍然存在时被终止【英文标题】:Contact being ended when it still exist 【发布时间】:2014-05-22 02:55:16 【问题描述】:

我正在开发一款可以通过参考下图进行最佳描述的瓷砖地图游戏。 红色瓷砖是我的地板,它与我的玩家发生碰撞,它还处理精灵是否可以跳跃(如果没有接触就不要跳跃)。所以在走过红色瓷砖时我“可以跳跃” 但是,如果我遇到黄色瓷砖。我的 NSLog 再次打印“可以跳跃”,因为我对玩家和墙壁的接触时间很长。但是,如果我在仍然走在红色上的同时离开黄色瓷砖。我收到一条通知说“不能跳跃”,结果我的精灵不能再跳跃,因为它没有检测到我的玩家和我的地板之间的碰撞。

如果我能得到关于如何处理这个问题的想法,我会很高兴。 谢谢

floor.name = @"floor";
floor.position = CGPointMake(x + w/2, y + h/2);
floor.zPosition=0;

floor.physicsBody =
[SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(w, h)];
floor.physicsBody.usesPreciseCollisionDetection=YES;
floor.physicsBody.categoryBitMask =  floorCategory;
floor.physicsBody.contactTestBitMask=spriteCategory;
floor.physicsBody.dynamic = NO;




- (void)didBeginContact:(SKPhysicsContact *)contact 
  uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask);
  if (collision == (floorCategory|spriteCategory)) 

      NSLog(@"Can jummp");
      onFloor=YES;

 

- (void) didEndContact:(SKPhysicsContact *)contact 
  uint32_t contactTest = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask);
  if (contactTest == (spriteCategory| floorCategory)) 


    NSLog(@"dont jumps");
    onFloor = NO;

【问题讨论】:

你有没有机会很快收到很多可以/不能跳转的消息? @sangony 不,我不知道,当我跳时我得到“不能跳”,当我降落在平台上时,我得到“可以跳”。 所以如果你的人与黄色和红色接触然后失去与黄色的接触而仍然与红色接触,则显示“没有跳跃”? @sangony 不,对不起,如果我解释错了。当我从显示“可以跳跃”的任何地方降落到红色时,如果我触摸黄色而仍然站在红色上,它会说“可以跳跃”,但如果我向右走并与黄色断开接触但仍处于红色状态。它说“不跳”。 黄色物体是什么类别? 【参考方案1】:

问题已在聊天中解决。

问题在于红色和黄色对象具有相同的物理类别(floorCategory)。

玩家在与红色物体接触时接触了黄色物体。然后玩家向右移动失去了与黄色物体的联系,并且由于黄色物体与红色物体具有相同的类别而触发了 didEndContact: 方法,从而设置了“No Jump”状态。

解决方案是在黄色对象的一侧添加一个“墙类别”,从而防止 didEndContact: 触发。

【讨论】:

以上是关于联系仍然存在时被终止的主要内容,如果未能解决你的问题,请参考以下文章

尽管存在终止条件,为什么无限循环仍然存在?

PHP5中魔术方法函数有哪几个,请举例说明各自的用法

PHP5中魔术方法函数有哪几个,请举例说明各自的用法

如果脚本被杀死,node.js 生成的进程仍然存在

详解PHP魔术函数魔术常量预定义常量

Python 多处理正确完成工作,但进程仍然存在(Linux)