заменить анимацию UIview на анимацию таймера - PullRequest
0 голосов
/ 28 июня 2011

ну вот мой код:

- (CGPoint)randomPointSquare {
CGRect frame = [[self view] frame];

//CGFloat rand_x = ((float)arc4random() / (float)UINT_MAX) * (float)_window.frame.size.width;

NSInteger side = arc4random() / (UINT_MAX/4);
CGFloat offset = 0;

switch(side) {
    case 0: /* top */
        offset = ((float)arc4random() / (float)UINT_MAX) * (float)frame.size.width;
        return CGPointMake(offset, -10);

    case 1: /* bottom */
        offset = ((float)arc4random() / (float)UINT_MAX) * (float)frame.size.width;
        return CGPointMake(offset, frame.size.height-150);

    case 2: /* left */
        offset = ((float)arc4random() / (float)UINT_MAX) * (float)frame.size.height;
        return CGPointMake(-10, offset);

    default:
    case 3: /* right */
        offset = ((float)arc4random() / (float)UINT_MAX) * (float)frame.size.height;
        return CGPointMake(frame.size.width+170, offset);
}
}



-(void)createNewImageView {
UIImage * image = [UIImage imageNamed:@"abouffer_03.png"];
imageView = [[UIImageView alloc] initWithImage:image];


// Add it at a random point
[imageView setCenter:[self randomPointSquare]];
[[self view] addSubview:imageView];

// Animate it into place
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:8.0f];
[imageView setCenter:CGPointMake(240, 160)];
[UIView commitAnimations];
 [imageView release];
}

ТАК, как вы можете видеть, есть UIView анимация, но теперь я хочу изменить и заменить ее таймером. Но я не знаю, как это сделать. Что ж, если вы знаете, как это сделать, не забудьте, что я хочу, чтобы imageView создавался в произвольной позиции, а затем перемещался в центр экрана. спасибо

Ответы [ 2 ]

0 голосов
/ 28 июня 2011

Вместо того, чтобы писать весь код для вас, я дам вам несколько советов, которые могут помочь вам изменить его (я думаю, это лучший способ обучения).

Во-первых, когда вы создаете позицию ввызов randomPointSqaure, сохраните точку, созданную как переменную экземпляра.

theLocation = [self randomPointSquare];

Затем установите расположение imageView таким:

[imageView setCenter:theLocation];

Рассчитайте, как далеко находится объектот точки, которую вы хотите, чтобы это было (240, 160) и разделите это на количество времени, которое вы хотите, чтобы он переместился.Например, если ваше местоположение (0, 160), то оно будет путешествовать 240 пикселей.Если вы хотите более 10 секунд, это будет 24 пикселей в секунду.Сохраните это в переменной экземпляра как «delta»

. Теперь создайте таймер, который вызывает метод для обновления позиции

[NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(updatePosition) userInfo:nil repeats:YES];

, а затем создайте метод updatePosition

- (void)updatePosition {
    ...
    // Calculate the new position
    // delta is divided by 100 as the timer runs every 0.01 second
    // and delta was calculated previously as being distance per second
    theLocation = theLocation + (delta / 100);
    ...
    [imageView setCenter:theLocation];

    // Check if the location is at the "collision point" and do whatever if it is
    if (theLocation.x == 240 && theLocation.y == 160) {
       // We've hit the "collision point"
    }
}

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

0 голосов
/ 28 июня 2011

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

1)

Прежде всего, после того, как вы создадите функцию вызова представления изображения ниже:

-(void)randomlySetImage{
    int x = arc4random() % (int)self.view.frame.size.width;
    int y = arc4random() % (int)self.view.frame.size.height;

   imageView.center = CGPointMake(x,y);

   [NSTimer scheduledTimerWithTimeInterval:1.0f
                                    target:self 
                                  selector:@selector(randomlySetImage) 
                                  userInfo:nil 
                                   repeats:YES];
}

2)

[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithFloat:2.0f] forKey:kCATransactionAnimationDuration];

CAKeyframeAnimation *positionAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
CGMutablePathRef positionPath = CGPathCreateMutable();
CGPathMoveToPoint(positionPath, NULL, randomX ,  randomY );
CGPathAddLineToPoint(positionPath, NULL, self.view.center.x , self.view.center.y);
positionAnimation.path = positionPath;

[[imageView layer] addAnimation:positionAnimation forKey:@"PositionAnimation"];

[CATransaction commit];

Надеюсь, это поможет

...