public void collideWithPaddle(Paddle paddle) { CCRect paddleRect = paddle.rect(); paddleRect.Origin.X += paddle.Position.X; paddleRect.Origin.Y += paddle.Position.Y; float lowY = paddleRect.MinY; float midY = paddleRect.MidY; float highY = paddleRect.MaxY; float leftX = paddleRect.MinX; float rightX = paddleRect.MaxX; if (Position.X > leftX && Position.X < rightX) { bool hit = false; float angleOffset = 0.0f; if (Position.Y > midY && Position.Y <= highY + radius()) { Position = new CCPoint(Position.X, highY + radius()); hit = true; angleOffset = (float)Math.PI / 2; } else if (Position.Y < midY && Position.Y >= lowY - radius()) { Position = new CCPoint(Position.X, lowY - radius()); hit = true; angleOffset = -(float)Math.PI / 2; } if (hit) { float hitAngle = (paddle.Position - Position).Angle + angleOffset; float scalarVelocity = m_velocity.Length * 1.05f; float velocityAngle = -m_velocity.Angle + 0.5f * hitAngle; m_velocity = CCPoint.ForAngle(velocityAngle) * scalarVelocity; } } }