2015-12-21 81 views
0

我想給球增加重力,所以它會上下跳動,稍微向右或向左,在哪個角度球彈起,我不想失去球的能量,所以它總是在相同的高度反彈。對於每一個方向,現在球反彈並停止即使我設置摩擦0上我的代碼這裏有點少分鐘後:Sprite套件球彈跳物理目標c

ball.position = CGPointMake(self.frame.size.width/4 +arc4random() % ((int)self.frame.size.width/2), 
           self.frame.size.height/2 +arc4random() % ((int)self.frame.size.height/2)); 
    [self addChild:ball]; 

    ball.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:ball.frame.size.width/3]; 
    ball.physicsBody.friction = 0.0f; 
    ball.physicsBody.restitution = 1.0f; 
    ball.physicsBody.linearDamping = 0.0f; 
    ball.physicsBody.allowsRotation = YES; 
    [ball.physicsBody applyImpulse:CGVectorMake(50.0f, -50.0f)]; 
+0

這取決於你的衝動,現在烏爾apllying impule在croos direction.So你AR ehitting球在橫向 –

回答

0

如果你不希望球在每個方向反彈,那麼你應該打球在直線方向。

如果你想保持恆定的速度throught出局了,那麼你需要確保你保持速度:

if(myNode.physicsBody.velocity.dx < 30) 
myNode.physicsBody.velocity = CGVectorMake(30, myNode.physicsBody.velocity.dy); 

這適用於速度30,當您的節點速度小於30

您可以使用此方法:

-(void)addBallOfType:(NSString *)imageName ofSize:(CGSize) size addSpriteName:(NSString *)name atPoint:(CGPoint)point withBounce:(BOOL) bounce withVelocity:(CGVector)velocity andHitCategory:(int) category addEmitter:(BOOL) addEmitter{ 


    SKSpriteNode * ball = [SKSpriteNode spriteNodeWithImageNamed:imageName]; 
    ball.name=name; 
    ball.size=size; 
    ball.anchorPoint=CGPointMake(0, 0); 

    ball.physicsBody=[SKPhysicsBody bodyWithCircleOfRadius:ball.frame.size.width/2]; 
    ball.physicsBody.categoryBitMask=category; 
    ball.physicsBody.collisionBitMask=youCollisionBitMask; 
    ball.physicsBody.contactTestBitMask= youCollisionBitMask; 

    ball.physicsBody.dynamic=YES; 
    ball.physicsBody.affectedByGravity=NO; 
    ball.physicsBody.restitution=1.0; 
    ball.physicsBody.friction=0.0; 
    ball.physicsBody.linearDamping=0.0; 
    ball.physicsBody.angularDamping=0.0; 

    ball.position=point; 
    [self addChild:ball]; 

    if (addEmitter) { 
     _emitterNodePath = 
     [[NSBundle mainBundle] pathForResource:@"RParticle" ofType:@"sks"]; 
     SKEmitterNode *burstEmitter = 
    [NSKeyedUnarchiver unarchiveObjectWithFile:_emitterNodePath]; 
    [ball addChild:burstEmitter]; 
    } 



    if (bounce) { 
     CGVector impulse = velocity; 
     [ball.physicsBody applyImpulse:impulse]; 

    } 


} 

擊中不同的方向:

-(CGVector)hitToLeftWithSpeed:(float)speed{ 

    return CGVectorMake(-speed, 0); 
} 

-(CGVector)hitToRightWithSpeed:(float)speed{ 

    return CGVectorMake(speed, 0); 
} 

-(CGVector)hitTotopWithSpeed:(float)speed{ 

    return CGVectorMake(0, speed); 
} 

-(CGVector)hitToBottomWithSpeed:(float)speed{ 

    return CGVectorMake(0, -speed); 
} 

-(CGVector)forwardCrossHitWithSpeed:(float)speed{ 

    return CGVectorMake(speed, speed); 
} 

-(CGVector)backwardCrossHitWithSpeed:(float)speed{ 

    return CGVectorMake(-speed, -speed); 
} 

對於定位球:

-(CGPoint)addBallAtCenterWithOffsetX:(int)x withOffsetY:(int)y{ 

    return CGPointMake(100+x, 100+y); 
} 
-(CGPoint)addBallAtTopLeftWithOffsetX:(int) x withOffsetY:(int)y{ 

    return CGPointMake(200+x, 100+y); 
} 

-(CGPoint)addBallAtTopRightWithOffsetX:(int)x withOffsetY:(int)y{ 

    return CGPointMake(100+x, 100+y); 
} 

-(CGPoint)addBallAtBottomRightWithOffsetX:(int)x withOffsetY:(int)y{ 

    return CGPointMake(100+x, 2100+y); 
} 

-(CGPoint)addBallAtBottomLeftWithOffsetX:(int)x withOffsetY:(int)y{ 

    return CGPointMake(100+x, 200+y); 
} 

,您可以通過調用它:

[self addBallOfType:hBlueBall ofSize:CGSizeMake(75, 75) addSpriteName:@"greenball" atPoint:CGPointMake(100, 100) withBounce:YES withVelocity:[self hitTotopWithSpeed:50] andHitCategory:blueBallHitCategory addEmitter:YES]; 
+0

有沒有更簡單的方法?我的意思是,我不明白這個代碼的一半 – artG

+0

你不需要複製粘貼所有這些代碼。我發佈了輔助方法,以便您可以引用這些方法。 –

+0

我不明白,我不復制,我從中學習 – artG