要完全理解这个问题,需要提供一些信息。我哥哥和我正在为iOS开发游戏。游戏中有人物从屏幕右侧向左侧行走(动画)。这些对象是作为UIImageView的子类创建的。例如,我们有一个CharacterImageView,它是在视图控制器上的计时器期间通过其初始化程序创建的。因此,当计时器运行时,我们将变量增加1。当变量达到一定数量时,它将创建一个对象并将其添加到超级视图,如[[CharacterImageView alloc] init];但是,我们使用自定义初始化程序:
当我们初始化这个对象时,我们传递了多个属性,其中一个是CGRect来设置它的框架。我们在任何给定级别创建同一类的多个实例。因此,CharacterImageView可能有30个以上的对象,使用六个可能的起始CGRect之一进行初始化。这些对象立即在其初始化程序中创建一个计时器并开始运行它。计时器管理动画,设置如下:
- (void)characterTimerFired:(NSTimer *)newTimer
{
// Get the presentationLayer coordinates
CALayer *characterLayer = self.layer.presentationLayer;
CGPoint currentPoint;
currentPoint.x = characterLayer.position.x;
currentPoint.y = characterLayer.position.y;
// If there are no animation keys, begin a new animation
if (!self.layer.animationKeys)
{
[CharacterImageView animationWithDuration:3.0
delay:0.0
options:UIViewAnimationOptionBeginFromCurrentState
animations:^{
CABasicAnimation *characterWalking = [CABasicAnimation animationWithKeyPath:@"position"];
CGPoint newPoint;
newPoint.x = currentPoint.x - 100;
newPoint.y = currentPoint.y;
[characterWalking setFromValue:[NSValue valueWithCGPoint:currentPoint];
[characterWalking setToValue:[NSValue valueWithCGPoint:newPoint];
[characterWalking setDuration:3.0];
[self setAnimationImages:walkingImageArray];
[self setAnimationRepeatCount:3];
[self setAnimationDuration:1.0];
[self startAnimating];
[[self layer] addAnimation:characterWalking forKey:@"position"];
[CharacterImageView commitAnimations];
[[self layer] setPosition:newPoint];
}
completion:nil];
}
好的,现在已经给出了基本信息,这就是问题所在。每隔一段时间,CharacterImageView就不会在它的正确位置启动。相反,它开始并完成它在iDevice(横向)左上角的动画。任何信息都将非常感激,如果我需要更详细或提供更多代码,请告诉我。
游戏是可玩的,100到200个角色的创作通常只发生一次。但它仍然需要纠正,因为它会干扰游戏玩法。