2009-07-21 4 views
0

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

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

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

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

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

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

ответ

0

Вы находитесь на правильном пути с 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

Это, безусловно, помогло, и он проверяет нормально. Это также дало мне небольшое направление для чтения на QuartzCore. Спасибо за помощь! – SYF970

0

Есть ли причина, по которой вы не можете просто подклассифицировать 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

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

Подробнее:

  • UIImageView (специально initWithImage:)
  • UIImage (в частности imageNamed:)
  • UIResponder (специально touchesEnded:withEvent:)
+0

Я просмотрел в просто используя UIImageView и сделанные допущения его ограничение. Потребность в CA (для меня) исходила из этого требования: Автомобиль отправляется из CGPoint в CGPoint, пока он «буксирует» другие транспортные средства (например, поезд). Когда вы добираетесь до путевой точки, она не может просто поворачиваться и указывать на следующую ... ей нужно вычислить дугу для отслеживания, пока ее подшипник не выстроится со следующей путевой точкой ... к которой он движется. Это гарантирует, что «задние» транспортные средства не «джек-нож». Я не знаю, может ли UIViews удовлетворить этот тип движения.ЭТО послужило причиной для изучения API CA/CG. – SYF970

+0

Hm. Возможно, вы могли бы изучить функциональность кривой Quartz 2D Bezier, доступную на iPhone, но вы правы - я не уверен, что UIViews поддерживают такой переход изначально (я не настолько глубоко разбираюсь в Core Animation или Quartz). Я уверен, что вы можете самостоятельно выполнить математику и просто изменить анимационные свойства представления, но, вероятно, меньше проблем смотреть в интерфейсах Core Animation/Graphics API. – Tim

Смежные вопросы