Физика игры в понг

Я проходил обучение и большую часть понял. Я хочу спросить 1 вещь. Это учебник, которому я следую:

https://noobtuts.com/unity/2d-pong-game

Это метод, который называется функцией HitFactor.

if (col.gameObject.name == "RacketLeft") {
        // Calculate hit Factor
        float y = hitFactor(transform.position, col.transform.position, col.collider.bounds.size.y);

        // Calculate direction, make length=1 via .normalized
        Vector2 dir = new Vector2(1, y).normalized;

        // Set Velocity with dir * speed
        GetComponent<Rigidbody2D>().velocity = dir * speed;
    }

И метод Hit Factor

   float hitFactor(Vector2 ballPos, Vector2 racketPos,
                    float racketHeight) {
        // ascii art:
        // ||  1 <- at the top of the racket
        // ||
        // ||  0 <- at the middle of the racket
        // ||
        // || -1 <- at the bottom of the racket
        return (ballPos.y - racketPos.y) / racketHeight;
    }

Может ли кто-нибудь объяснить мне это на примере?

(ballPos.y - racketPos.y) / racketHeight;

Изображение положения мяча и ракетки по оси Y

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


person user5234003    schedule 23.08.2018    source источник
comment
Ну, работай пример. Предположим, что ракетка имеет длину 100 пикселей, мяч находится в позиции y 220, а середина ракетки находится в позиции y 200. Где мяч как доля длины ракетки, как описано в комментарии?   -  person Eric Lippert    schedule 23.08.2018
comment
Большое спасибо, Эрик. col.transform.position даст среднее (y) положение ракетки?   -  person user5234003    schedule 23.08.2018


Ответы (1)


Физика игры описана в туториале.

Физика игры в понг

  • Если ракетка ударяет по мячу в верхний угол, то он должен отскакивать к нашей верхней границе.
  • Если ракетка попадает по мячу в центр, то он должен отскакивать вправо, а вовсе не вверх или вниз.
  • Если ракетка ударяет по мячу в нижний угол, то он должен отскакивать к нашей нижней границе.

Это означает, что направление определяется ударной точкой ракетки. Вот что такое формула

(ballPos.y - racketPos.y) / racketHeight

выражает. Если ballPos.y и racketPos.y равны, то ракетка попадает в центр и мяч должен лететь вертикально (направление Y равно 0). Если ракетку ударить по верхнему углу, мяч должен полететь под углом 45° вверх (Y равен 1, см. рисунок ASCII), а если ракетку ударить по нижнему углу, мяч должен полететь под углом 45° вниз ( Y равно -1, см. ASCII art). Угол 45° (вверх или вниз) достигается за счет того, что компоненты скорости по осям X и Y имеют одинаковое абсолютное значение. Все, что находится между ними, даст значения где-то посередине.

Поскольку это поведение не зависит от размеров ракетки, расстояние мяча от центра ракетки делится на длину ракетки (на самом деле я думаю, что она должна быть равна половине размера, так как в противном случае верхняя часть будет .5 и днище - .5).

person Paul Kertscher    schedule 23.08.2018
comment
если мяч y равен 2 и ракетка y равна 2, то столкнуться могут только они. как imgur.com/a/8aOEZXR - person user5234003; 23.08.2018
comment
@user5234003 user5234003 Что ты хочешь сказать мне этим изображением? - person Paul Kertscher; 23.08.2018
comment
то же самое / ч всегда ?? Это? я действительно не знаю. спасибо Павел заранее. - person user5234003; 23.08.2018
comment
@ user5234003 Я действительно не понимаю, о чем вы говорите. Не могли бы вы попробовать написать целые предложения вместо тарабарщины? - person Paul Kertscher; 23.08.2018