Pregunta

I seem to have some problems with getting the position of a physicsBody.

I want to set the position of a physicsBody (bodyA) to the position of an other physicsBody (bodyB), when this one collides with a third one.

I tried using _bodyA.position = _bodyB.position; but this doesn't work.

The problem is, that the physicsBody I want to get the position of is moving around all the time. So I might need a method that checks the position of the physicsBody in every frame and when the physicsBody collides, the method returns the CGPoint.

This might be a simple task, but I can't figure it out. Thanks for help!

¿Fue útil?

Solución

I did up a quick sample project for you to take a look at. You can fine tune the code to fit your exact needs but it will show you how to do what you asked.

Tap anywhere on the screen to launch the blue square into the red square. Once the two make contact, the green square's position will change to the red square.

Another alternative to the way I wrote the code is to have the sprites added to an array but that all depends on how your code is set up.

Side note - you cannot update a sprite's position in the didBeginContact: section because it will not work. That is why I created the CGPoint to store the position and update Object C during the next cycle in update:

Here is the code:

#import "MyScene.h"

 typedef NS_OPTIONS(uint32_t, CNPhysicsCategory)
{
    Category1  = 1 << 0,
    Category2  = 1 << 1,
    Category3  = 1 << 2,
};

@interface MyScene()<SKPhysicsContactDelegate>
@end

@implementation MyScene
{
    SKSpriteNode *objectA;
    SKSpriteNode *objectB;
    SKSpriteNode *objectC;

    CGPoint newPositionForObjectC;
}

-(id)initWithSize:(CGSize)size
{
    if (self = [super initWithSize:size])
    {
        self.physicsWorld.contactDelegate = self;

        objectA = [SKSpriteNode spriteNodeWithColor:[SKColor redColor] size:CGSizeMake(30, 30)];
        objectA.position = CGPointMake(110, 20);
        objectA.name = @"objectA";
        objectA.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:objectA.size];
        objectA.physicsBody.categoryBitMask = Category1;
        objectA.physicsBody.collisionBitMask = Category2;
        objectA.physicsBody.contactTestBitMask = Category2;
        objectA.physicsBody.affectedByGravity = NO;
        [self addChild:objectA];

        objectB = [SKSpriteNode spriteNodeWithColor:[SKColor blueColor] size:CGSizeMake(30, 30)];
        objectB.position = CGPointMake(100, 200);
        objectB.name = @"objectB";
        objectB.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:objectB.size];
        objectB.physicsBody.categoryBitMask = Category2;
        objectB.physicsBody.collisionBitMask = Category1;
        objectB.physicsBody.contactTestBitMask = Category1;
        objectB.physicsBody.affectedByGravity = NO;
        [self addChild:objectB];

        objectC = [SKSpriteNode spriteNodeWithColor:[SKColor greenColor] size:CGSizeMake(30, 30)];
        objectC.position = CGPointMake(250, 250);
        objectC.name = @"objectC";
        objectC.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:objectC.size];
        objectC.physicsBody.categoryBitMask = Category3;
        objectC.physicsBody.collisionBitMask = 0;
        objectC.physicsBody.contactTestBitMask = 0;
        objectC.physicsBody.affectedByGravity = NO;
        [self addChild:objectC];

        newPositionForObjectC = CGPointMake(0, 0);
    }
    return self;
}

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

    if (collision == (Category1 | Category2))
    {
        newPositionForObjectC = CGPointMake(contact.bodyA.node.position.x, contact.bodyA.node.position.y);
    }
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [objectA.physicsBody applyImpulse:CGVectorMake(0, 5)];
}

-(void)update:(CFTimeInterval)currentTime
{
    if(newPositionForObjectC.x > 0)
    {
        objectC.position = newPositionForObjectC;
        newPositionForObjectC = CGPointMake(0, 0);
    }
}

@end
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top