我已多次尝试为我的新迷宫游戏实施D-Pad,但我遇到了麻烦。我是以4 UIButtons的风格进行的,如果你按下一个,它会向上,向下,向左或向右移动另一个图像。我尝试过使用quartzcore和CAAnimation,但只知道有限的代码。
我声明了方法和按钮,但无法编写工作代码。
我在做:
-(IBAction)Up:(id)sender{
CGPoint origin1 = self.Player.center;
CGPoint target1 = CGPointMake(self.Player.center.x, self.Player.center.y-124);
CABasicAnimation *bounce1 = [CABasicAnimation animationWithKeyPath:@"position.y"];
bounce1.duration = 0.1;
bounce1.fromValue = [NSNumber numberWithInt:origin1.y];
bounce1.toValue = [NSNumber numberWithInt:target1.y];
[self.Player.layer addAnimation:bounce1 forKey:@"position"];
}
鬼魂向下移动,但立即重新开始。我被困了好几个小时,脸上可能会瞪着我,但请理解我的无聊。
答案 0 :(得分:1)
在Core Animation中,有两个层次结构:一个是模型图层,另一个是表示图层。你看到的是表现层;模型层是您经常在代码中交互的内容。这种分离是有价值的,因为它可以让你创建隐式动画 - 例如设置图层的位置,它将为新点设置动画。 (但是,如果您为position
指定一个值,那么您希望它是您之后立即读回的值,即使动画仍在进行中。)
当您使用addAnimation:forKey:
时,您正在影响演示文稿,而不是模型。因此,在动画期间,您会看到播放器图层移动,但该图层“真的”仍然在您离开的位置。一旦动画结束,它就会从图层中移除,因此演示文稿会再次与模型匹配 - 您可以在原始位置看到它。
如果您希望模型位置也发生变化,则需要单独更改:
self.player.layer.position = CGPointMake(self.player.layer.position.x, target1.y);
您可以在添加动画后立即更新模型(您将在动画完成后看到更改),或使用完成块在动画结束时安排它。 There are subtleties to consider for either approach.
但是,如果您只想为这样的特定更改设置动画,尤其是UIView
的主要图层,则在UIView
上使用隐式动画API会更简单:
[UIView animateWithDuration:0.1 animations: ^{
self.player.center = CGPointMake(self.player.center.x, target1.y);
}];
这将更新模型值并创建并运行动画,以便从当前位置移动到目标位置。
顺便说一句:它有助于遵循Cocoa代码样式约定:仅对类名或其他类型名称使用初始上限,对变量/属性/方法名称使用小写。