2012-04-12 2 views
0

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

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

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

Я еще новичок в Objective C ... и программирование вообще ...

@implementation randomPosition 

NSMutableArray *positionsArrayPlayer1; 


    +(NSValue *) givePosition:(int)player forRadius: (CGFloat) radius 

    { 

     if (player == 1) 
     { 
      //set range for arc4random 
      int fromNumberY = 550; 
      int toNumberY = 950; 

      //set range for arc4random 
      int fromNumberX = 0; 
      int toNumberX = 700; 


      BOOL far_enough_away = NO; 
      CGPoint newpoint; 

      while(!far_enough_away) 
      { 

       newpoint = CGPointMake((arc4random()%(toNumberX-fromNumberX+1))+fromNumberX, 
             (arc4random()%(toNumberY-fromNumberY+1))+fromNumberY); 
       far_enough_away = YES; 


       for(NSValue *existing in positionsArrayPlayer1) 
       { 
        NSLog(@"test"); 

        CGPoint pointb = [existing CGPointValue]; 
        CGFloat deltay = pointb.y-newpoint.y; 
        CGFloat deltax = pointb.x-newpoint.x; 
        CGFloat distance = sqrt(pow(deltax,2) + pow(deltay,2)); 

        //fail if closer than desired radius 
        if(distance < radius) 
        { 
         far_enough_away = NO; 

         NSLog(@"test"); 
         break; 
        } 
        [positionsArrayPlayer1 addObject:[NSValue valueWithCGPoint:newpoint]]; 

       } 
       NSLog(@"%@",positionsArrayPlayer1); 
      } 

      return [NSValue valueWithCGPoint:newpoint]; 

     } else if (player == 2){ 



      //more stuff to come here.... 



     } else { 


      NSLog(@"player invalid"); 

     } 

     return nil; 
    } 

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

- (void) positionCirclesPlayer1 
{ 

    radius = 70; 
    CGRect position; 

    for (int i = 0; i < [colors count];i++) 
    { 

    CGRect positionCircleInCenter = CGRectMake(self.view.frame.size.width/2-35, self.view.frame.size.height/2-35, radius, radius); 

    Circle *myCircle = [[Circle alloc] initWithFrame:positionCircleInCenter radius:radius color:[colors objectAtIndex:i]]; 
    myCircle.label.text = [NSString stringWithFormat:@"%i", i]; 
    myCircle.alpha = 0; 
    myCircle.userInteractionEnabled = NO; 


    theNewPointPlayer1 = [randomPosition givePosition:1 forRadius:radius]; 

    position = CGRectMake(theNewPointPlayer1.CGPointValue.x, theNewPointPlayer1.CGPointValue.y, 70, 70); 


    [UIView animateWithDuration:0.4 delay:0 options:UIViewAnimationCurveEaseIn animations:^{ 
      myCircle.frame = position; myCircle.alpha = 1;} completion:nil]; 

    [playerOneCircles addObject:myCircle]; 
    [self.view addSubview:myCircle]; 

    } 


} 
+1

Что вы хотите - это «статический» или «одиночный». Или используйте поле в делегате приложения. –

ответ

1

Перед изучением Obj-C, вероятно, вы должны узнать что-то о C :)


+(NSValue*)givePosition:(int)player forRadius:(CGFloat)radius { 
    //this is executed when the method is called for the first time 
    static NSMutableArray *positionsArrayPlayer1 = nil; 

    if (positionsArrayPlayer1 == nil) { //checking if this is the first time execution 
    positionsArrayPlayer1 = [[NSMutableArray alloc] init]; 
    } 

} 

или



//global variable accessible only from this file 
static NSMutableArray *positionsArrayPlayer1; 

@implementation randomPosition 

//this method is called when the class is loaded. 
+(void)initialize { 
    positionsArrayPlayer1 = [[NSMutableArray alloc] init]; 
} 

+(NSValue*)givePosition:(int)player forRadius:(CGFloat)radius { 
    //do something with the array 
} 

@end 

Обратите внимание, что реализация этой функции с помощью методов класса, вероятно, не очень хорошая архитектура.

+0

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

+0

У вас нет причин делать это статичным. У вас возникнут проблемы, если вы хотите сбросить массив (метод другого класса?). Особый класс ('PositionGenerator') будет лучше. Возможно, вы, возможно, поделитесь доступом к классу. – Sulthan

Смежные вопросы