在xcode 6之后没有调用didBeginContact

时间:2014-11-15 01:30:29

标签: sprite-kit

我一直遇到xcode问题。例如,NSLog没有打印,case语句不能正常工作等等。我在xcode 6出来之前创建了这个项目,并且认为如果我将它切换到xcode 6中的新文件,这些东西将被修复。到目前为止,它们已被修复。但是,发生了更多问题。一个主要的问题是现在没有调用didBeginContact方法。我已经尝试过一切来解决它。我更改了类别掩码,它们的值,collisionBitMask,contactBitMask,放入了不同的基础,但还没有任何工作。它适用于xcode 6发布之前的文件,但不适用于xcode 6。

应该在玩家和对手之间检测到接触,但它不再起作用。 我把断点放在didBeginContact方法和它应该在玩家和对手之间有联系时调用的方法,但程序没有退出。

提前致谢!

GameScene.m:

#import "GameScene.h"

@interface GameScene ()


@end


@implementation GameScene

- (void)didMoveToView:(SKView *)view
{
    if (!self.contentCreated)
    {
        [self createSceneContents];
        self.contentCreated = YES;

        [self addplatform];
        [self addPlayer];
        [self addButtons];
        [self addOpponent];

    }
}

typedef NS_OPTIONS(uint32_t, CollisionCategory) {
    CollisionCategoryPlayer     = 1 << 0,
    CollisionCategoryOpponent     = 1 << 1,
    CollisionCategoryPlatform   = 1 << 2,
    CollisionCategoryPlatformBorder = 1 << 3,
};


//static inline CGFloat skRandf() {
//  return rand() / (CGFloat) RAND_MAX;
//}

- (void)createSceneContents
{
    self.backgroundColor = [SKColor purpleColor];
    self.scaleMode = SKSceneScaleModeAspectFit;
    self.multipleTouchEnabled = YES;

}

-(id)initWithSize:(CGSize)size
{
    if (self = [super initWithSize:size])
    {

        self.physicsWorld.contactDelegate = self;

    }
    return self;
}

- (SKSpriteNode *)addPlayer {

    self._player = [SKSpriteNode spriteNodeWithTexture: [SKTexture textureWithImageNamed:@"TurnipSmall"]];
    self._player.position = CGPointMake(100,450);
    self._player.anchorPoint = CGPointMake(0.5,0.5);
    self._player.physicsBody = [SKPhysicsBody bodyWithTexture:self._player.texture size:self._player.texture.size];
    self._player.name = @"player";
    self._player.physicsBody.dynamic = YES;
    self._player.physicsBody.allowsRotation = FALSE;
    self._player.physicsBody.affectedByGravity = TRUE;
    self._player.physicsBody.friction = 5;
    self._player.physicsBody.mass = 10;
    self._player.physicsBody.usesPreciseCollisionDetection = YES;
    self._player.physicsBody.restitution = 0.0;
    self._player.physicsBody.categoryBitMask = CollisionCategoryPlayer;
    self._player.physicsBody.collisionBitMask = CollisionCategoryPlayer | CollisionCategoryOpponent | CollisionCategoryPlatform;
    self._player.physicsBody.contactTestBitMask = CollisionCategoryPlayer | CollisionCategoryOpponent | CollisionCategoryPlatform;
    self.playerPunching = false;
    [self addChild:self._player];

    return self._player;
}

- (SKSpriteNode *)addOpponent {

    self._opponent = [SKSpriteNode spriteNodeWithTexture: [SKTexture textureWithImageNamed:@"Tomato"]];
    self._opponent.position = CGPointMake(300, 450);
    self._opponent.anchorPoint = CGPointMake(0.5, 0.5);
    self._opponent.physicsBody = [SKPhysicsBody bodyWithTexture:self._opponent.texture size:self._opponent.texture.size];
    self._opponent.name = @"opponent";
    self._opponent.physicsBody.dynamic = YES;
    self._opponent.physicsBody.allowsRotation = NO;
    self._opponent.physicsBody.affectedByGravity = YES;
    self._opponent.physicsBody.friction = 5;
    self._opponent.physicsBody.mass = 10;
    self._opponent.physicsBody.density = 5;
    self._opponent.physicsBody.usesPreciseCollisionDetection = YES;
    self._opponent.physicsBody.restitution = 0;
    self._opponent.physicsBody.velocity = CGVectorMake(0, 0);
    self._opponent.physicsBody.categoryBitMask = CollisionCategoryOpponent;
    self._opponent.physicsBody.collisionBitMask = CollisionCategoryPlatform| CollisionCategoryPlayer;
    self._opponent.physicsBody.contactTestBitMask = CollisionCategoryPlayer | CollisionCategoryPlatform;
    [self addChild:self._opponent];


    return self._opponent;
}

- (void)didBeginContact:(SKPhysicsContact *)contact
{
    SKPhysicsBody *firstBody, *secondBody;

    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
    {
        firstBody = contact.bodyA;
        secondBody = contact.bodyB;
    }
    else
    {
        firstBody = contact.bodyB;
        secondBody = contact.bodyA;
    }
    if ((firstBody.categoryBitMask & CollisionCategoryPlayer) != 0 && (secondBody.categoryBitMask & CollisionCategoryOpponent))
    {
        [self playerTouchingOpponent];
    }

}

GameScene.h:

//
//  GameScene.h
//  TEST
//

//  Copyright (c) 2014 G Hui. All rights reserved.
//

#import <SpriteKit/SpriteKit.h>

@interface GameScene : SKScene <SKPhysicsContactDelegate>
@property bool multipleTouchEnabled;
@property BOOL contentCreated;
@property SKSpriteNode * _donut;
@property SKSpriteNode * _player;
@property SKSpriteNode * _opponent;
@property SKSpriteNode *platform1Scene1;
@property BOOL movementBegins;
@property NSArray *level1;
@property BOOL playerPunching;
@property bool alreadyPunching;
@property float characterNumber;
@property SKSpriteNode *platform2Scene1;
@property SKSpriteNode *platform3Scene1;
@property float playerHealth;
@property SKSpriteNode *_healthBar;
@property SKSpriteNode *rightplatformBorder;
@property SKSpriteNode *mask;
@property SKNode *_playerHealthBar;
@property SKNode *_opponentHealthBar;
@property SKNode *_playerPowerUpBar;
@property SKNode *_opponentPowerUpBar;
@property int _playerHP;
@property int _opponentHP;
@property const int MaxHP;
@property int _playerPowerUp;
@property int _opponentPowerUp;
@property const int MaxPowerUp;
@property const float healthBarWidth;
@property const float healthBarHeight;
@property const float powerBarWidth;
@property const float powerBarHeight;
@property bool touchingPlatform;
@property SKSpriteNode *sideBorder;
@property SKSpriteNode *frontBorder;
@property BOOL playerOpponentContact;
@property float distanceBetweenPlayerAndOpponent;
@property float distanceBetweenOpponentAndPlayer;
@end

1 个答案:

答案 0 :(得分:0)

固定! 这是因为联系代表在initWithSize中,由于某种原因没有被调用...