2014-12-19 5 views
0

Я использую следующий код, чтобы мяч падал, и всякий раз, когда я нажимаю его, он должен прыгать назад, следовательно, применять импульс в моем методе touchhesBegan. Однако, когда я запускаю этот код, мяч начинает падать, но когда я нажимаю на него, он просто падает. Что я делаю не так?Применить импульс не работает

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
/* Called when a touch begins */ 
[ball.physicsBody applyImpulse:CGVectorMake(0, 8)]; 
} 

-(void) addBall 
{ 
SKShapeNode *ball; 
ball = [SKShapeNode shapeNodeWithCircleOfRadius:30]; 
ball.strokeColor = [SKColor colorWithRed:114.0f/255.0f green:84.0f/255.0f blue:123.0f/255.0f alpha:1.0]; 
ball.fillColor = [SKColor colorWithRed:114.0f/255.0f green:84.0f/255.0f blue:123.0f/255.0f alpha:1.0]; 
ball.position = CGPointMake(self.size.width/2,self.size.height/2); 

//add physics body 
ball.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:30]; 


[self addChild:ball]; 
} 

-(void)didMoveToView: (SKView *)view 
{ 
self.backgroundColor = [UIColor colorWithRed:113.0f/255.0f green:255.0f/255.0f blue:248.0f/255.0f alpha:1.0]; 
//add phsyics body to the scene 
self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame]; 

//change gravity 
self.physicsWorld.gravity = CGVectorMake(0, -6); 



[self addBall]; 
} 

-(void)update:(CFTimeInterval)currentTime { 
/* Called before each frame is rendered */ 
} 

ответ

1

Значение вашего импульса очень низкое. Увеличьте его или уменьшите гравитацию, попробуйте этот код.

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
/* Called when a touch begins */ 
for (SKSpriteNode *node in self.children) { 
    if ([node.name isEqualToString:@"ball"]) 
     [node.physicsBody applyImpulse: 
     CGVectorMake(0, 100)]; 
     NSLog(@"tapped ball"); 
} 
} 

-(void)didMoveToView: (SKView *)view 
{ 
self.backgroundColor = [UIColor colorWithRed:113.0f/255.0f green:255.0f/255.0f blue:248.0f/255.0f alpha:1.0]; 
//add phsyics body to the scene 
self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame]; 

//change gravity 
self.physicsWorld.gravity = CGVectorMake(0, -6); 



[self addBall]; 
} 

-(void) addBall { 
    ball = [SKShapeNode shapeNodeWithCircleOfRadius:30]; 
    ball.fillColor = [SKColor colorWithRed:225.0f/255.0f green:76.0f/255.0f blue:76.0f/255.0f alpha:1.0]; 
    ball.strokeColor = [SKColor colorWithRed:225.0f/255.0f green:76.0f/255.0f blue:76.0f/255.0f alpha:1.0]; 
    ball.position = CGPointMake(self.size.height/2, self.size.width/2); 
    ball.name = @"ball"; 
    ball.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:30]; 

    [self addChild:ball]; 
} 
+0

Он по-прежнему не применяет импульс с этим кодом. –

+0

Я поставил инструкцию NSLog, чтобы проверить, вообще ли он регистрирует кран, но он просто не применяет этот импульс. –

+0

Я протестировал его. Вы добавили имя на свой бал? как этот ball.name = @ "ball"; –

-1

ball создать и добавить физику тела в addBall не то же самое один вы подаете импульс в touchesBegan. В addBall это локальная переменная. Может быть, вы хотите сделать его собственностью? Затем обратитесь к нему как self.ball в обоих местах.

+0

Ну, я полагаю, что это над линией @implementation: SKShapeNode * ball; Так что должно работать так же хорошо? –

0

Используемый для использования импульс.

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

UITouch *touch = [touches anyObject]; 
CGPoint location = [touch locationInNode:self]; 
SKNode *node = [self nodeAtPoint:location]; 

// if ball is tapped apply impulse 
if ([node.name isEqualToString:@"ball"]) { 
    [node.physicsBody applyImpulse: 
    CGVectorMake(0, 80)]; 

    NSLog(@"ball pressed"); 
} 
} 


-(void) addBall 
{ 
SKShapeNode *ball; 
ball = [SKShapeNode shapeNodeWithCircleOfRadius:30]; 
ball.strokeColor = [SKColor colorWithRed:114.0f/255.0f green:84.0f/255.0f blue:123.0f/255.0f alpha:1.0]; 
ball.fillColor = [SKColor colorWithRed:114.0f/255.0f green:84.0f/255.0f blue:123.0f/255.0f alpha:1.0]; 
ball.position = CGPointMake(self.size.width/2,self.size.height/2); 
ball.name = @"ball"; 
//add physics body 
ball.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:30]; 

[self addChild:ball]; 
} 
+2

Можете ли вы объяснить, что делает ваш код решением? например В чем проблема в исходном коде и что вы изменили, чтобы заставить его работать правильно. Код только ответ считается низким качеством и иногда закрыты. – Dijkgraaf

+0

Код в первой части вопроса является правильным, за исключением того, что я не назначал ни одного имени моему шаровому узлу. В решении я добавил «ball.name = @» ball »; к методу addBall. Я сделал это, чтобы мой код в методе didBeginContact распознал имя того, что я использую как мяч, чтобы он мог нормально реагировать. –

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