SpriteKit 碰撞检测不起作用
Posted
技术标签:
【中文标题】SpriteKit 碰撞检测不起作用【英文标题】:SpriteKit collision Detection does not work 【发布时间】:2014-05-13 20:47:56 【问题描述】:我以为我了解位掩码、CategoryBitMasks 和 CollisionBitMasks 的概念,但事实证明我不了解 ;-( 但我不明白为什么。 我为碰撞检测设置了位掩码,将类别位掩码添加到框架中,并将类别位掩码添加到我的对象(在本例中为出租车)。但是出租车只是从屏幕上掉下来:-/
你知道为什么会这样吗?
#import "MyScene.h"
#import "SKSpriteNode+DebugDraw.h"
// Define Bit Masks for Collision Detection
typedef NS_OPTIONS(uint32_t, CNPhysicsCategory)
CNPhysicsCategoryEdge = 1 <<0,
CNPhysicsCategoryTaxi = 1 <<1,
;
@interface MyScene() <SKPhysicsContactDelegate>
@end
@implementation MyScene
SKNode *_gameNode;
SKSpriteNode *_taxiNode;
-(instancetype)initWithSize:(CGSize)size
if (self = [super initWithSize:size])
[self initializeScene];
return self;
-(void)initializeScene
self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame];
self.physicsWorld.contactDelegate = self;
self.physicsBody.categoryBitMask = CNPhysicsCategoryEdge;
SKSpriteNode* bg = [SKSpriteNode spriteNodeWithImageNamed:@"background.png"];
bg.position = CGPointMake(self.size.width/2, self.size.height/2);
[self addChild: bg];
[self addTaxi];
_gameNode = [SKNode node];
[self addChild:_gameNode];
-(void)addTaxi
_taxiNode = [SKSpriteNode spriteNodeWithImageNamed:@"taxi.png"];
_taxiNode.position = CGPointMake(self.size.width/2, self.size.height/2);
[self addChild:_taxiNode];
CGSize contactSize = CGSizeMake(_taxiNode.size.width, _taxiNode.size.height);
_taxiNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize: contactSize];
[_taxiNode attachDebugRectWithSize:contactSize];
_taxiNode.physicsBody.categoryBitMask = CNPhysicsCategoryTaxi;
【问题讨论】:
尝试添加taxiNode之后初始化它的physicsBody 你把它们放在不同的类别中,要么使用相同的,要么确保接触和碰撞位掩码包含它们应该碰撞的位。对于“世界”形状,只需保留原样的位掩码即可。 您的问题不清楚。您是否在检测碰撞或物体从屏幕上掉落时遇到问题? @akashg 谢谢,我在physicsBody之后添加了taxiNode,但是taxiNode仍然从画布上掉下来并且没有检测到碰撞。 @sangony 我的问题是,物体正在从屏幕上掉下来,因为没有检测到碰撞 - 这就是我认为至少是问题所在。所以从逻辑的角度来看,我对你的问题的回答应该是:“是”;-) 【参考方案1】:我终于搞定了——问题不是碰撞检测,而是手机的布局,因为我没有用 viewWillLayoutSubviews 方法替换 ViewController 中的 viewDidLoad 方法。 现在一切正常。
重要的帖子如下:bodyWithEdgeLoopFromRect not working in landscape
感谢您的支持!
【讨论】:
以上是关于SpriteKit 碰撞检测不起作用的主要内容,如果未能解决你的问题,请参考以下文章