Создание основанного на физике указателя для вращения колеса - PullRequest
0 голосов
/ 06 апреля 2019

Я пытаюсь сделать вращение стандартного колеса фортуны с помощью движущегося указателя.У меня есть колесо, которое вращается и приземляется по мере необходимости с подросткой, но я застрял в том, как получить точный и убедительный указатель выбора, который перемещается при прохождении каждого колышка на колесе.

Как лучше всего это сделать?Есть ли простой способ сделать это с помощью кода, основанного на физике, или есть другой способ попытаться подделать его?Я не могу найти какие-либо учебники, где бы это объясняло это простое поведение.

Первоначально я пытался запустить цикл for на каждом колышке, чтобы проверить наличие столкновений при ударе, затем указав саму точку на угол, чтобы указать на колышек,Это создает 2 проблемы:

• Колесо может вращаться слишком быстро, полностью пропуская столкновение.Принуждение к написанию кода для имитации удара, если колесо повернуло на X градусов за время Y.

• При столкновении указатель имеет толщину.Точка, в которой он соединяется, смещена относительно центра в зависимости от того, где он попал или обнаружен, и произойдет щелчок, а также неубедительный эффект при нажатии колышка на указатель (будет некоторое перекрытие или другие визуальные проблемы)

скриншот

package {

    public class Main extends MovieClip {

        var numSegment: Number;
        var numResult: Number;
        var numRotation: Number;
        var spinTime: Number;
        var pointerMax: Number;

        public function Main() {
            // constructor code
            menu_mc.spin_btn.addEventListener(MouseEvent.CLICK, spinFunc);
        }

        public function spinFunc(e: Event): void {

            //reset wheel
            wheel_mc.rotation = 0;

            //parse values from menu
            numSegment = parseInt(menu_mc.segment_txt.text);
            numResult = parseInt(menu_mc.result_txt.text);
            numRotation = parseInt(menu_mc.rotation_txt.text);
            spinTime = parseInt(menu_mc.time_txt.text);

            //Find angle of desired segment and randomize within the range
            var segAngle: Number = 360 / numSegment;
            var myResult: Number = -(numResult - 1) * (segAngle);
            var randAngle: Number = Math.random() * segAngle;
            myResult += randAngle - (segAngle / 2);

            function startSpin(): void {
                var myTween: Tween = new Tween(wheel_mc, "rotation", Regular.easeInOut, wheel_mc.rotation, 20, 1, true);
                myTween.addEventListener(TweenEvent.MOTION_FINISH, endSpin);
            }

            function endSpin(): void {
                var myTween_spin: Tween = new Tween(wheel_mc, "rotation", Regular.easeInOut, wheel_mc.rotation, -((360 * numRotation) - myResult), spinTime - .4, true);
            }

            pointer_mc.addEventListener(Event.ENTER_FRAME, hitCheck);

            function hitCheck(e: Event): void {

                var dx: Number;
                var dy: Number;
                var trueX: Number;
                var trueY: Number;
                var angle: Number;
                var hitDetect: Boolean = false;

                for (var i: Number = 1; i < numSegment + 1; i++) {

                    trueX = wheel_mc["hitBox_" + i].localToGlobal(new Point(0, 0)).x;
                    trueY = wheel_mc["hitBox_" + i].localToGlobal(new Point(0, 0)).y;

                    if (pointer_mc.hitTestPoint(trueX, trueY, true)) {

                        hitDetect = true;

                        dx = trueX - pointer_mc.x;
                        dy = trueY - pointer_mc.y;
                    } 
                }

                if (hitDetect == true) {
                    //Store angle in angle variable
                    angle = Math.atan2(dy, dx) * 180 / Math.PI;

                    //Apply angle
                    pointer_mc.rotation = angle - 90;
                } else {
                    if ((pointer_mc.rotation - 2) >= 0) {

                        pointer_mc.rotation -= 2;
                    } else {
                        pointer_mc.rotation = 0;
                    }
                }
            }
            startSpin();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...