嗨,我是IOS Dev的新手。 如果我的船体节点和我的fallingObject节点发生碰撞,我想发短信。 一旦碰撞,我想删除该fallingObject节点。
在我的代码中,我在场景中创建了一个篮子。然后在屏幕上的随机点上创建一个fallingObject节点。
我的目标是一旦fallObject碰撞(或捕获)船体(篮子节点内的虚构框)。 fallingObject将从场景中消失或删除。
请参阅下面的代码:
static const uint32_t boxCategory = 0x1 << 0;
static const uint32_t fallingObjectCategory = 0x1 << 1;
#import "MyScene.h"
- (SKSpriteNode *)newBasket
{
SKSpriteNode *basketImage = [[SKSpriteNode alloc] initWithImageNamed:@"basket-01.png"];
basketImage.size = CGSizeMake(150,120);
SKSpriteNode *hull = [[SKSpriteNode alloc] initWithColor:[SKColor grayColor] size:CGSizeMake(64,32)];
[basketImage addChild:hull];
hull.alpha = 0.0;
hull.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:hull.size];
hull.physicsBody.dynamic = NO;
hull.physicsBody.categoryBitMask = boxCategory;
hull.physicsBody.contactTestBitMask = fallingObjectCategory;
hull.physicsBody.collisionBitMask = boxCategory | fallingObjectCategory;
_basket = basketImage;
_box =hull;
return basketImage;
}
- (void)addFallingObject
{
SKSpriteNode *fallingObject = [[SKSpriteNode alloc] initWithImageNamed:[self getRandomFallingObject]];
//Configure the Size
switch (randomNumber) {
case 0:
fallingObject.size = CGSizeMake(70,45);
break;
case 1:
fallingObject.size = CGSizeMake(30,45);
break;
case 2:
fallingObject.size = CGSizeMake(40,90);
break;
default:
fallingObject.size = CGSizeMake(50,50);
break;
}
fallingObject.position = CGPointMake(skRand(0, self.size.width), self.size.height-50);
fallingObject.name = @"fallingObject";
fallingObject.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:fallingObject.size];
self.physicsWorld.speed = 0.30;
fallingObject.physicsBody.categoryBitMask = fallingObjectCategory;
fallingObject.physicsBody.contactTestBitMask = boxCategory;
fallingObject.physicsBody.collisionBitMask = fallingObjectCategory | boxCategory;
[self addChild:fallingObject];
}
-(void)didBeginContact:(SKPhysicsContact *)contact
{
NSLog(@"contact detected");
SKPhysicsBody *boxBody;
SKPhysicsBody *fallingObjectBody;
if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
{
boxBody = contact.bodyA;
fallingObjectBody = contact.bodyB;
}
else
{
boxBody = contact.bodyB;
fallingObjectBody = contact.bodyA;
}
if ((boxBody.categoryBitMask & boxCategory) !=0 && (fallingObjectBody.categoryBitMask & fallingObjectCategory) !=0)
{
//do whatever you want like remove a node
}
}
谢谢你的帮助。 :d
答案 0 :(得分:1)
我有一个sprite kit游戏,有两件事情发生碰撞。一个是玩家,一个是收费。在我的所有代码之前,我为这两个类别设置了一个类别。这是在我所有的进口和东西之前。
static const uint32_t playerCategory = 0x1 << 4;
static const uint32_t chargeCategory = 0x1 << 5;
然后当我创建每个节点时,我使用以下内容。
self.player.physicsBody.categoryBitMask = playerCategory;
self.player.physicsBody.contactTestBitMask = chargeCategory;
self.player.physicsBody.collisionBitMask = chargeCategory | selfCategory;
和收费。
_chargedBall.physicsBody.categoryBitMask = chargeCategory;
_chargedBall.physicsBody.contactTestBitMask = playerCategory;
_chargedBall.physicsBody.collisionBitMask = playerCategory | selfCategory | chargeCategory;
这告诉玩家它可以与一个充电和我称之为自我的东西相撞,但现在不需要。
然后在didBeginContact中我使用。
SKPhysicsBody *playerBody, *chargeBody;
if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
{
playerBody = contact.bodyA;
chargeBody = contact.bodyB;
}
else
{
playerBody = contact.bodyB;
chargeBody = contact.bodyA;
}
if ((playerBody.categoryBitMask & playerCategory) !=0 && (chargeBody.categoryBitMask & chargeCategory) !=0)
{
//do whatever you want like remove a node
}
编辑#1
我实际上是在initWithSize中创建我的对象。
-(id)initWithSize:(CGSize)size {
if (self = [super initWithSize:size])
{ // a bunch of code
self.player = [[Player alloc] initWithImageNamed:@"character"];
self.player.name = @"MyPlayer";
self.player.position = CGPointMake(self.frame.size.width / 2.0f, 120);
self.player.zPosition = 15;
self.player.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.player.frame.size];
self.player.physicsBody.dynamic = YES;
self.player.physicsBody.affectedByGravity = NO;
self.player.physicsBody.mass = 0.25;
self.player.physicsBody.allowsRotation = NO;
self.player.physicsBody.friction = 0.5;
self.player.physicsBody.restitution = 0.3;
self.player.physicsBody.categoryBitMask = playerCategory;
self.player.physicsBody.contactTestBitMask = chargeCategory;
self.player.physicsBody.collisionBitMask = chargeCategory | selfCategory;
[self.map addChild:self.player];
}
然后我用方法制作另一个obj。
- (void)spawnChargesWithNumber:(int)number
{ // some code
_chargedBall.position = (CGPointMake(_randomX, random));
_chargedBall.name = [NSString stringWithFormat:@"chargeNumber%i", number];
_chargedBall.zPosition = 15;
_chargedBall.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:13.0f];
_chargedBall.physicsBody.dynamic = YES;
_chargedBall.physicsBody.affectedByGravity = NO;
_chargedBall.physicsBody.mass = 0.1;
_chargedBall.velocity = CGPointMake(0.0, 0.0); //changed actualVelocityX to 0
_chargedBall.physicsBody.categoryBitMask = chargeCategory;
_chargedBall.physicsBody.contactTestBitMask = playerCategory;
_chargedBall.physicsBody.collisionBitMask = playerCategory | selfCategory | chargeCategory;
[self.map addChild:_chargedBall];
}
编辑#2。编辑#2 这可能会清除一些事情。它来自Apple Docs。*** categoryBitMask
一个掩码,用于定义此物理实体所属的类别。
@property(assign,nonatomic)uint32_t categoryBitMask 讨论 场景中的每个物理主体最多可以分配32个不同的类别,每个类别对应于位掩码中的一个位。您可以定义游戏中使用的蒙版值。结合collisionBitMask和contactTestBitMask属性,您可以定义哪些物理实体彼此交互,以及何时通知您的游戏这些交互。
默认值为0xFFFFFFFF(设置所有位)。
状况 适用于iOS 7.0及更高版本。 也可以看看 @property collisionBitMask @property contactTestBitMask 宣告进入 SKPhysicsBody.h
*** collisionBitMask
一个掩码,用于定义哪些类别的物理实体可以与此物理实体发生碰撞。
@property(assign,nonatomic)uint32_t collisionBitMask 讨论 当两个物理实体相互接触时,可能会发生碰撞。通过执行逻辑AND运算,将该物体的碰撞掩模与其他物体的类别掩码进行比较。如果结果为非零值,则此主体受到碰撞的影响。每个身体独立地选择是否想要受到另一个身体的影响。例如,您可以使用它来避免碰撞计算,这会对身体的速度产生微不足道的变化。
默认值为0xFFFFFFFF(设置所有位)。
状况 适用于iOS 7.0及更高版本。 也可以看看 @property categoryBitMask 宣告进入 SKPhysicsBody.h
*** contactTestBitMask
一个遮罩,用于定义哪些类别的物体会导致与此物理体的交叉通知。
@property(assign,nonatomic)uint32_t contactTestBitMask 讨论 当两个实体共享相同的空间时,通过执行逻辑AND操作,针对另一个主体的接触掩码测试每个主体的类别掩码。如果任一比较结果为非零值,则创建SKPhysicsContact对象并将其传递给物理世界的委托。为获得最佳性能,只需在联系人掩码中设置您感兴趣的交互位。
默认值为0x00000000(清除所有位)。
状况 适用于iOS 7.0及更高版本。 也可以看看 @property categoryBitMask 宣告进入 SKPhysicsBody.h