Создание круглой кости и определение числа, которое появляется в результате в указанной позиции, когда кости перестают катиться

Я разрабатываю приложение, в котором есть один круглый кубик, например: когда я нажимаю на центр изображения, он вращается

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

При нажатии кнопки я делаю: -

создать случайное число, которое действует как угол. и поверните изображение на этот угол.

-(IBAction)diceButtonClicked:(id)sender
{
    float angle=arc4random()%360;
    NSLog(@"%f",angle);
    toAngle=angle;
    if (fromAngle+toAngle<360) {
        toAngle=fromAngle+toAngle;
    }
    else
    {
        if (toAngle<30) {

            toAngle=angle+30;
        }
        else
        {
            toAngle=angle;
        }
    }
     [self rotateDiceMethod];

  }


My logic for image rotation:-

  [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.5];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; 
   diceNumbers.transform = CGAffineTransformRotate(startTransform,toAngle);
    [UIView commitAnimations];
    startTransform=diceNumbers.transform;
    fromAngle=toAngle; 

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

Любые предложения будут высоко оценены. Заранее спасибо!


person Gypsa    schedule 28.05.2012    source источник


Ответы (1)


Вы знаете точное значение угла поворота. Самый простой способ - определить угол поворота и получить соответствующее значение.

Например:

- (int)getDiceValue  {
   // Total 6 number, so 360/6 = 60 deg for each number and make sure totalRotatedAngle is from 0 to 359
   if (totalRotatedAngle < 30 || totalRotatedAngle >= 300)  {return 1;}
   else if (totalRotatedAngle >= 30 && totalRotatedAngle < 90)  {return 6;}
   ...
}

Еще одна вещь, CGAffineTransformRotate принимает значения в радианах в качестве аргумента. Таким образом, вы должны преобразовать угол поворота из градусов в радианы перед преобразованием.

person Hanon    schedule 28.05.2012
comment
спасибо за вашу быструю помощь. Можете ли вы рассказать все условия, я не понимаю, как установить другие условия, подобные этому: - else if (totalRotatedAngle ›= 30 && totalRotatedAngle ‹ 90) {return 6;} - person Gypsa; 28.05.2012
comment
Угол начинается от вашей стрелки по часовой стрелке. Так как у вас 6 секторов и каждый сектор по 60 град. Ваше начальное число — 1. Оно находится в диапазоне от 330 до 30. Таким образом, для числа 6 диапазон должен быть от 30 до 90; число 4 от 90 до 150 и т. д. Вы должны быть в состоянии рассчитать остальные :) - person Hanon; 28.05.2012
comment
Привет, я также рассчитал другие условия: -- (int)getDiceValue { // Всего 6 чисел, поэтому 360/6 = 60 градусов для каждого числа, и убедитесь, что totalRotatedAngle находится в диапазоне от 0 до 359 if (toAngle ‹ 30 || toAngle ›= 300) {возврат 1;} else if (toAngle ›= 30 && toAngle ‹ 90) {return 6;} else if (toAngle ›= 90 && toAngle ‹ 150) {return 4;} else if (toAngle ›= 150 && toAngle ‹ 210) {возврат 3;} else if (toAngle ›= 210 && toAngle ‹ 270) {return 5;} else if (toAngle ›= 270 && toAngle ‹ 330) {return 2;} } - person Gypsa; 28.05.2012
comment
когда я проверил, значение становится неправильным. Как и для угла 183, указатель показывает значение 6, а значение, полученное из метода, возвращает 3. Пожалуйста, посмотрите, не сделал ли я неправильную пару условий. - person Gypsa; 28.05.2012
comment
CGAffineTransformRotate принимает значения в радианах в качестве аргумента. Таким образом, вы должны преобразовать угол поворота из градусов в радианы перед преобразованием. радианы = общий угол поворота/180,0*M_PI; - person Hanon; 28.05.2012