Я пытаюсь сделать вращение стандартного колеса фортуны с помощью движущегося указателя.У меня есть колесо, которое вращается и приземляется по мере необходимости с подросткой, но я застрял в том, как получить точный и убедительный указатель выбора, который перемещается при прохождении каждого колышка на колесе.
Как лучше всего это сделать?Есть ли простой способ сделать это с помощью кода, основанного на физике, или есть другой способ попытаться подделать его?Я не могу найти какие-либо учебники, где бы это объясняло это простое поведение.
Первоначально я пытался запустить цикл 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();
}
}
}