我曾多次尝试为我的新迷宫游戏实现D-Pad,但都遇到了问题。我是以4个UI按钮的样式来实现的,如果你按下一个,它会向上、向下、向左或向右移动另一个图像。我尝试过使用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"];
}
鬼魂向下移动,但立即反弹。我被难住了好几个小时,它可能会瞪着我的脸,但请理解我的愚蠢。
在核心动画中,有两个层次结构:一个是模型层,另一个是演示。展示层就是你所看到的;模型层是您在代码中经常与之交互的内容。这种分离很有价值,因为它可以创建隐式动画——例如,设置层的位置,它将动画化到新的点。(但是,如果为position
指定一个值,则即使动画仍在进行中,也希望该值是此后立即读取的值。)
当您使用addAnimation:forKey:
时,您影响的是演示文稿,而不是模型。因此,在动画过程中,您可以看到Player层在移动,但该层"实际上"仍在您离开它的位置。动画一结束,它就会从层中删除,因此演示文稿将再次与模型匹配——您可以在其原始位置看到它。
如果你想让模型位置也改变,你需要单独改变:
self.player.layer.position = CGPointMake(self.player.layer.position.x, target1.y);
可以在添加动画后立即更新模型(在动画完成后会看到更改),也可以在动画结束时使用完成块对其进行调度。这两种方法都有微妙之处需要考虑。
然而,通常情况下,如果您只想动画化这样的特定更改,特别是对于UIView
的主层,那么在UIView
:上使用隐式动画API会更简单
[UIView animateWithDuration:0.1 animations: ^{
self.player.center = CGPointMake(self.player.center.x, target1.y);
}];
这将更新模型值,并创建和运行从当前位置移动到目标位置的动画。
BTW:它有助于遵循Cocoa代码样式约定:仅对类名或其他类型名使用首字母大写,对变量/属性/方法名使用小写。