Я создал метод класса, который возвращает случайную позицию в качестве объекта 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];
}
}
Что вы хотите - это «статический» или «одиночный». Или используйте поле в делегате приложения. –