трансформировать изображение, когда оно достигает края экрана в iOS

У меня есть 10 светлячков, которые я заставляю «летать» по экрану, используя приведенный ниже код. Код также служит для удержания светлячков на экране.

- (void)viewDidLoad
{
    [super viewDidLoad];

NSArray *blueArray = [NSArray array];
blueArray = [[NSArray alloc] initWithObjects:
             [UIImage imageNamed:@"blue1.png"],
             [UIImage imageNamed:@"blue2.png"], nil];

blue.animationImages = blueArray;
blue.animationDuration = 0.20;
blue.animationRepeatCount = -1;
[blue startAnimating]; 

    bluepos =CGPointMake(2.0, 1.5);
}


-(void) someMethod {
    endingAnimationTimer = [NSTimer scheduledTimerWithTimeInterval:(0.03) target:self selector:@selector(makeFly) userInfo:nil repeats:YES];
}


-(void) makeFly {

    blue.center = CGPointMake(blue.center.x+bluepos.x, blue.center.y+bluepos.y);{
        if(blue.center.x > 480 || blue.center.x <0)
            bluepos.x = -bluepos.x;

        if(blue.center.y > 320 || blue.center.y <0)
            bluepos.y = -bluepos.y;
    }
}

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

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

Я пробовал это:

In .h

@property (nonatomic, assign) BOOL blueIsFacingRight;

In .m

 @synthesize blueIsFacingRight;


-(void) makeFly {

    blue.center = CGPointMake(blue.center.x+bluepos.x, blue.center.y+bluepos.y); {
        if(blue.center.x > 480 ) {
            if (blueIsFacingRight == YES) {
                blue.transform = CGAffineTransformMakeScale(-1, 1);
                blueIsFacingRight = NO;
            }
            bluepos.x = -bluepos.x;


        }

        if(blue.center.x <0) {
            bluepos.x = -bluepos.x;

            if (blueIsFacingRight == NO) {
                blue.transform = CGAffineTransformMakeScale(1, 1);
                blueIsFacingRight = YES;
            }
        }

        if(blue.center.y > 320 )
            bluepos.y = -bluepos.y;

        if( blue.center.y <0)
            bluepos.y = -bluepos.y;
    }
}

Я думал, что это сработает, но изображение не переворачивается, когда оно попадает в «стену».

Может ли кто-нибудь объяснить, почему это не работает, и если есть лучший способ добиться эффекта, который я ищу?

введите здесь описание изображения


person Wesley Smith    schedule 03.02.2013    source источник


Ответы (2)


Вы устанавливаете значение преобразования X равным -1 в обоих случаях. Когда он обращен вправо, вы должны установить преобразование, подобное этому CGAffineTransformMakeScale(1, 1);

blue.center = CGPointMake(blue.center.x+bluepos.x, blue.center.y+bluepos.y); {
if(blue.center.x > 480 ) {
    if (blueIsFacingRight == YES) {
        blue.transform = CGAffineTransformMakeScale(-1, 1);
        blueIsFacingRight = NO;
    }
    bluepos.x = -bluepos.x;


}

if(blue.center.x <0) {
    bluepos.x = -bluepos.x;

    if (blueIsFacingRight == NO) {
        blue.transform = CGAffineTransformMakeScale(1, 1);
        blueIsFacingRight = YES;
    }
}
person Sohaib    schedule 03.02.2013
comment
Ваше право, копирование и вставка привели меня к этому. Тем не менее, исправление, которое не решило проблему, изображение по-прежнему не меняется, см. мое редактирование выше, UIImageView на самом деле представляет собой массив изображений, поэтому похоже, что крылья светлячка хлопают, будет ли массив причиной того, что преобразование не работает? - person Wesley Smith; 03.02.2013

**blue.transform =CGAffineTransformIdentity;**

Вышеупомянутое было в моем методе makeFly с кучей других вещей выше, где я переворачивал изображение, поэтому я отменял изменение при следующем вызове метода (0,03 позже)

Человек, я чувствую себя глупо

person Wesley Smith    schedule 04.02.2013