2014-09-26 5 views
0

Я пытаюсь получить доступ к локальной переменной объекта из метода didBeginContact. Как это возможно?Доступ к локальной переменной объекта из метода Objective-c

Предположим, у меня есть объект шара, и всякий раз, когда он отскакивает от игрока, этот мяч отскочил от переменной get, это идентификатор игрока.

Это мой метод initBall, который инициализирует мяч. Он называется каждые 3-5 (случайных) секунд.

-(void)initBall { 
NSString *bouncedFrom; 
bouncedFrom = @""; 

ball = [SKSpriteNode spriteNodeWithImageNamed:@"ball"]; 
ball.name = ballCategoryName; 
ball.zPosition = 0; 
int cannonPos = (arc4random() % 3) + 1; 
SKSpriteNode *cannon = (SKSpriteNode *)[self childNodeWithName:[NSString stringWithFormat:@"%i",cannonPos]]; 
ball.zPosition = 3; 
ball.position = cannon.position; 
ball.physicsBody.categoryBitMask = ballCategory; 
ball.physicsBody.contactTestBitMask = wallCategory; 
ball.physicsBody.collisionBitMask = wallCategory; 
ball.physicsBody.usesPreciseCollisionDetection = YES; 
[self addChild:ball]; 

ball.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:ball.frame.size.width/2]; 
ball.physicsBody.friction = 0.0f; 
//Bounce back 
ball.physicsBody.restitution = 1.0f; 
// 
ball.physicsBody.linearDamping = 0.0f; 
ball.physicsBody.allowsRotation = NO; 
switch (cannonPos) { 
    case 1: 
     ball.position = CGPointMake(ball.position.x+20, ball.position.y+20); 
     [ball.physicsBody applyImpulse:CGVectorMake(-1.0,1.0)]; 
     break; 
    case 2: 
     ball.position = CGPointMake(ball.position.x-20, ball.position.y+15); 
     [ball.physicsBody applyImpulse:CGVectorMake(-1.0,1.0)]; 
     break; 
    case 3: 
     ball.position = CGPointMake(ball.position.x-20, ball.position.y-15); 
     [ball.physicsBody applyImpulse:CGVectorMake(-1.0,-1.0)]; 
     break; 
    case 4: 
     ball.position = CGPointMake(ball.position.x+20, ball.position.y-20); 
     [ball.physicsBody applyImpulse:CGVectorMake(-1.0,-1.0)]; 
    default: 
     break; 
} 

То, что я хочу что-то вроде этого в didBeginContact:

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

if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) { 
    firstBody = contact.bodyA; 
    secondBody = contact.bodyB; 
} else { 
    firstBody = contact.bodyB; 
    secondBody = contact.bodyA; 
} 

if ((firstBody.categoryBitMask & ballCategory) !=0) { 
    SKNode *ball = contact.bodyB.node; 
    SKNode *player = contact.bodyA.node; 

    ball.bouncedFrom = PlayerCategory; 


} 

if ((firstBody.categoryBitMask & wallCategory) !=0) { 
    SKNode *ball = contact.bodyB.node; 
    SKAction *addScore = [SKAction runBlock:^{ 
     if (ball.position.y < 0) playerScore--; 
     if (ball.position.x < 0) cpu2Score--; 
     if (ball.position.y > self.frame.size.height) cpu1Score--; 
     if (ball.position.x > self.frame.size.width) cpu3Score--; 
     }]; 
    SKAction *removeNode = [SKAction removeFromParent]; 
    SKAction *sequence = [SKAction sequence:@[addScore, removeNode]]; 
    [ball runAction:sequence]; 
} 
} 

Оба мяча и xCategories объявлены как статические переменные в верхней части моего кода. Возможно ли это?

+0

Вы слышали о Ивар, да? Если нет: http://stackoverflow.com/questions/9086736/why-would-you-use-an-ivar и https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/EncapsulatingData /EncapsulationData.html – LearnCocos2D

ответ

0

Моя первая мысль заключается в том, что вы должны объявить bumpedFrom как переменную класса в .h, а не объявлять ее в методе init:.

так в .h должен выглядеть

@interface Ball: NSObject{<br> 
    NSString *bouncedFrom;<br> 
} 

@end 
+0

Хорошо, допустим, я сделал объявление Ball: SKSpriteNode. , допустим, я сделал объявление в моем .m файле: static Ball * ball; Как я могу получить к нему доступ из didBeginContact? – Zh4rsiest

+0

Когда я пытаюсь получить к нему доступ из didBeginContact, я пробую вот так: Ball * ball = contact.bodyB.node; Но я получаю эту ошибку: Несовместимые типы указателей initiazing 'BALL *' с выражением типа 'SKNode *' – Zh4rsiest

+0

Это предупреждает вас, потому что вы не можете быть уверены, что contact.bodyB.node имеет тип BALL. Вы пытаетесь назначить суперкласс для подкласса ... Но вы можете избавиться от предупреждения с помощью литья 'Ball * ball = (Ball *) contact.bodyB.node;' или если мяч уже объявлено статически: 'ball = (Ball *) contact.bodyB.node;' –

Смежные вопросы