Интерактивное изображение - PullRequest
0 голосов
/ 21 июля 2009

Это сообщество очень помогло мне во многих отношениях. Первый вопрос (для меня), и он легкий. Я работаю по кривой обучения iPhone SDK, с хорошей скоростью ... но время от времени я сталкиваюсь с проблемой, которая, несмотря на ее простоту, легче задавать и работать над чем-то другим, чем тратить другое час на чтение.

У меня есть 2D-игра, в которой транспортное средство движется по поверхности, вращаясь в направлении движения. Я определил, что Core Animation - мой лучший подход. Автомобиль это изображение. Он интерактивен для пользовательского ввода (сенсорный).

Я на правильном пути? UIView (в качестве ответчика), содержащий дерево CALayer, которое включает изображение (из файла). Текущий файл в формате GIF. Это позволило легко сделать раму прозрачной, оставив только изображение автомобиля.

Как загрузить изображение gif в слой из подкласса UIView?

Звучит просто, поэтому я подумал ...

Приветствие.

Ответы [ 2 ]

0 голосов
/ 22 июля 2009

Вы находитесь на правильном пути с Core Animation. CAKeyFrameAnimation имеет свойство path, которое вы будете широко использовать. В следующем примере кода (не проверено) используются прямые пути, но также можно использовать изогнутые пути:

UIImage *carImage = [UIImage imageNamed:@"car.png"];
carView = [[UIImageView alloc] initWithImage:carImage];

[mapView addSubview:carView];

CAKeyframeAnimation *carAnimation = [CAKeyframeAnimation 
    animationWithKeyPath:@"position"];

carAnimation.duration = 5.0;

// keep the car at a constant velocity
carAnimation.calculationMode = kCAAnimationPaced;

// Rotate car relative to path
carAnimation.rotationMode = kCAAnimationRotateAuto;

// Keep the final animation
carAnimation.fillMode = kCAFillModeForwards;
carAnimation.removedOnCompletion = NO;

CGMutablePathRef carPath = CGPathCreateMutable();
CGPathMoveToPoint(carPath, NULL, 0.0, 0.0);

CGPathAddLineToPoint(carPath, NULL, 100.0, 100.0);
CGPathAddLineToPoint(carPath, NULL, 100.0, 200.0);
CGPathAddLineToPoint(carPath, NULL, 200.0, 100.0);

carAnimation.path = carPath;
CGPathRelease(carPath);

[carView.layer addAnimation:carAnimation forKey:@"carAnimation"];
0 голосов
/ 21 июля 2009

Есть ли причина, по которой вы не можете просто создать подкласс UIImageView для обработки ваших сенсорных методов? Мне кажется, что создание представления изображения с вашим изображением и использование переопределенных методов UIResponder для управления движением транспортного средства и всем, что вам нужно, было бы намного проще, чем ручное управление деревом CALayer.

Вы можете сделать это следующим образом:

UIImage *vehicleImage = [UIImage imageNamed:@"vehicle.gif"];
VehicleImageView *vehicleView = [[[VehicleImageView alloc]
                                  initWithImage:vehicleImage] autorelease];

Тогда подкласс VehicleImageView UIImageView:

@interface VehicleImageView : UIImageView
// Your stuff
@end

@implementation VehicleImageView
// Your stuff

// UIResponder methods
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    // Custom implementation
}

// Other touch methods...
@end

Похоже, вы на правильном пути, потому что вам нужен UIResponder где-то в иерархии просмотра / просмотра вашего транспортного средства для сенсорных методов.

Подробнее:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...