문제

패들에 부딪 치는 위치에 따라 공을 각도로 편향하고 싶습니다. 지금은 Y 좌표 만 변경하여 흥미롭지 않은 편향이 발생합니다. 패들에 대한 충격 위치에서는 각도이지만 독립적입니다. 더 재미있는 것을 원합니다. 속도, 운동량, 질량 및 기타 요인을 고려할 필요가 없습니다. 패들의 충격 위치에 따라 각도. 나는 이것을 읽었다 iPhone 앱에서 충돌 감지를 수행하는 숫자 오류 (NAN) 그러나 내가 찾고있는 것에 지나치게 복잡해 보입니다. 편향을 계산하는 더 간단한 방법이 있습니까?

객체는 두 개의 uiimageview입니다.

도움이 되었습니까?

해결책

글쎄, 현실적인 것은 없지만 아웃 바운드 각도가 패들의 적중에만 의존하도록 무언가를 할 수 있습니다.

나는 iPhone 또는 객관적인 C 코딩을 한 적이 없으므로 의사/C 코드로 무언가를 작성하겠습니다.

먼저 속도 벡터의 길이 인 속도를 계산하거나 :

double speed = sqrt(velX * velX + velY * velY); // trigonometry, a^2 + o^2 = h^2

그런 다음 패들을 때리는 위치에 따라 새로운 각도를 계산하려고합니다. ImpactX에 x 충돌과 패들 길이를 패들 길이로 저장한다고 가정 할 것입니다. 그렇게하면 아웃 바운드 각도를 계산할 수 있습니다. 먼저 -1에서 1 사이의 값을 얻도록 범위를 계산하는 방법을 알아 봅시다.

double proportionOfPaddle = impactX / (double) paddleLength; // between 0 and 1
double impactRange = proportionOfPaddle * 2 - 1; // adjust to -1 and 1

우리가 공을 측면으로 완전히 편향시키고 싶지 않다고 가정 해 봅시다. 왜냐하면 그것은 회복하기가 매우 어려울 것이기 때문입니다. Impactrange를 New Vely로 사용하므로 -0.9 ~ 0.9로 확장 할 것입니다.

impactRange = impactRange * 0.9;

이제 속도가 일정하도록 VELX를 계산해야합니다.

double newVelX = impactRange;
double newVelY = sqrt(speed * speed - newVelX * newVelX); // trigonometry again

이제 Newvelx와 Newvely를 반환하면 영향과 속도 의존 바운스가 있습니다.

행운을 빕니다!

(여기서 버그가 잘 될 수도 있고 x 또는 y를 반전했을 수도 있지만 일반적인 아이디어를 얻기를 바랍니다).

편집하다: ImpactX를 얻는 것에 대한 생각을 추가합니다.

Ball.center.x와 Paddle.center.x를 가지고 있다고 가정 해 봅시다 (당신이 그것을 부르는 것을 모르지만 Paddle.center.x가 패들의 중심을 줄 것이라고 가정 해 봅시다). 그것으로부터 절정을 계산하십시오.

우리는 또한 볼 반경 (ball.width를 직경으로 가정 할 것임)과 패들 크기 (패들 .width?)도 필요합니다.

int ballPaddleDiff = paddle.center.x - ball.center.x;
int totalRange = paddle.width + ball.width;

야구장의 가장 작은 값은 공이 패들의 측면에 닿을 때입니다. 그 야구장은 패들 .Width/2 + ball.width/2입니다. 따라서 새로운 불변은 그럴 것입니다

double impactRange = ballPaddleDiff / (double) totalRange / 2;

공이 별이나 무언가로 튀어 나오지 않도록 실제로 -1에서 1 사이에 있도록 Impactrange를 점검해야 할 것입니다.

다른 팁

당신은 반드시 현실적인 것을 원하지 않고 재미를 원합니다. 그것들은 항상 하나가 아니고 동일하지는 않습니다. 현실적을 원한다면 속도, 모멘텀, 질량 등을 버릴 수 없습니다. 탁구의 일반적인 게임에서 패들에 부딪 치는 지점은 실제로 중요하지 않습니다. 테니스 라켓과 같은 달콤한 지점은 없습니다. .

출력 벡터 또는 속도 및 단위 벡터를 반환하는 수학적 함수를 개발하여 볼의 출력 각도 및 속도를 나타내고 입력 각도, 속도, 패들의 충격 지점 및 패들의 속도를 공급합니다.

우리는 이미 출력 각도 = -1 * 입력 각도를 기대합니다. 출력 속도는 또한 입력 속도 인 -1 * 일 것으로 예상됩니다. 따라서 혼합하려면 조정하십시오. 패들 중심으로부터의 거리에 비례하여 출력 각도를 늘릴 수 있습니다. 또한 패들의 히트에 비례하여 각도 또는 속도를 높일 수 있습니다.

당신이 그렇게 할 수있는 방법이 많이 있습니다. 그래서 당신이 어떤 기능을 사용할 것인지 정확히 말할 수는 없습니다. 테스트와 재생으로 그것을 알아 내야 할 것입니다. 여전히 더 많은 정보가 필요한 경우 질문에 더 자세한 내용을 추가하십시오.

다음 코드 (C ++이지만 OBJC로 변환하기에 충분히 쉬운)는 들어오는 2D 벡터를 취하고 표면 정상 (Pong Bat의 얼굴)을 기반으로 반영합니다.

'스칼라'에 적용되는 오프셋을 무작위로 무작위로 추가하여 속도를 변경하거나 표면에 반사 각도를 변경하여 임의의 'Fun Factor'를 추가 할 수 있습니다.

나는 이것을 iPhone 프로젝트에서 사용하고 있으며 잘 작동합니다 :)

void vec2ReflectScalar(vec2& vResult, const vec2& v1, const vec2& normal, float scalar)
{
    vec2  _2ndotvn;
    float dotVal = vec2DotProduct(v1, normal); 

    vec2Scale(_2ndotvn, normal, scalar * 2.f * dotVal);
    vec2Subtract(vResult, v1, _2ndotvn); 
}

void vec2Reflect(vec2& vResult, const vec2& v1, const vec2& normal)
{
    vec2ReflectScalar(vResult, v1, normal, 1.f);
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top