Animando un sprite a través de un MKMapView

votos
2

Sin entrar en OpenGL (Quartz 2D está bien):

  1. Digamos que tengo una imagen que quiero mover a través de un mapa de una manera fluida. Por ejemplo, una imagen de un avión volando a través del mapa. Pude hacer esto usando una MKAnnotation, un NSTimer y jugando con la tasa de cambio lat / lon y la velocidad del temporizador. Sin embargo, supongo que esto no es ideal, aunque los resultados parecen bastante decentes. ¿Puedes pensar en una mejor manera?

  2. Ahora digamos que quiero que esta imagen sea animada (piense: gif animado). No puedo hacer lo usual UIImageViewcon una serie de animationFramesporque todo a lo que tengo acceso en MKAnnotationView es a UIImage. ¿Cómo podrían abordar esto?

Me doy cuenta de que # 2 podría manejarse con UIImageView en la parte superior del mapa que contiene las imágenes animadas. Sin embargo, tendría que manejar manualmente la traducción del movimiento del avión o cohete o lo que sea según la región de la vista del mapa cambiada, dependiendo de los movimientos del usuario en el mundo real o del zoom del usuario (no se permite el desplazamiento en mi aplicación).

¿Qué piensas?

Publicado el 20/08/2009 a las 04:06
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
5

Creo que encontré una solución para el # 2. Subclassed MKAnnotationView y escribí un código para agregar un UIImageView (con imágenes de animación) como una subvista.

//AnimatedAnnotation.h

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface AnimatedAnnotation : MKAnnotationView
{
    UIImageView* _imageView;
    NSString *imageName;
    NSString *imageExtension;
    int imageCount;
    float animationDuration;
}

@property (nonatomic, retain) UIImageView* imageView;
@property (nonatomic, retain) NSString* imageName;
@property (nonatomic, retain) NSString* imageExtension;
@property (nonatomic) int imageCount;
@property (nonatomic) float animationDuration;


- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier imageName:(NSString *)name imageExtension:(NSString *)extension imageCount:(int)count animationDuration:(float)duration
;

@end

//AnimatedAnnotation.m

#import "AnimatedAnnotation.h"

@implementation AnimatedAnnotation
@synthesize imageView = _imageView;
@synthesize imageName, imageCount, imageExtension,animationDuration;

- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier imageName:(NSString *)name imageExtension:(NSString *)extension imageCount:(int)count animationDuration:(float)duration
{
    self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
    self.imageCount = count;
    self.imageName = name;
    self.imageExtension = extension;
    self.animationDuration = duration;
    UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"%@0.%@",name,extension]];
    self.frame = CGRectMake(0, 0, image.size.width, image.size.height);
    self.backgroundColor = [UIColor clearColor];


    _imageView = [[UIImageView alloc] initWithFrame:self.frame];
    NSMutableArray *images = [[NSMutableArray alloc] init];
    for(int i = 0; i < count; i++ ){
        [images addObject:[UIImage imageNamed:[NSString stringWithFormat:@"%@%d.%@", name, i, extension]]];
    }


    _imageView.animationDuration = duration;
    _imageView.animationImages = images;
    _imageView.animationRepeatCount = 0;
    [_imageView startAnimating];

    [self addSubview:_imageView];

    return self;
}

-(void) dealloc
{
    [_imageView release];
    [super dealloc];
}


@end
Respondida el 20/08/2009 a las 05:42
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more