Sky*_*ler 1 iphone 2d core-animation calayer quartz-graphics
我想为一个游戏制作动画片,我想让这些片段向不同的方向移动,这样我现在的动画整个视图的方法将不再适用.
我想知道一次动画多个项目的最佳做法是什么.(注意我在2d渲染所以我目前对3d解决方案不感兴趣.)
谢谢!
一次动画多个2-D对象相对容易.有两种方法可以解决它:动画UIViews或动画CALayers.在我的测试中,我发现在动画两者时性能上几乎没有差别(两者似乎都支持在iPhone上以60 FPS同时移动约50个物体).
要协调一系列UIViews的动画,您需要在开始/提交动画块中包含对视图几何的任何更改:
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:ANIMATIONDURATIONINSECONDS];
view1.frame = CGRectMake(newX1, newY1, view1Width, view1Height);
view2.frame = CGRectMake(newX2, newY2, view2Width, view2Height);
// Add other views here
[UIView commitAnimations];
Run Code Online (Sandbox Code Playgroud)
这将在ANIMATIONDURATIONINSECONDS秒的持续时间内将两个或多个视图的直线运动协调到新位置.如果希望视图彼此独立移动,请为每个视图创建单独的动画块.
要更好地控制动画或创建跨平台的Mac/iPhone UI代码,您可能希望使用Core Animation CALayers.CALayers默认设置动画,所以通过设置
layer.position = CGPointMake(newX, newY);
Run Code Online (Sandbox Code Playgroud)
您的图层将自动设置为新位置的动画.请注意,默认情况下,图层的位置相对于其中心,您可以通过将其anchorPoint属性设置为0,0将其更改为正常原点位置.
您可以使用CATransaction协调图层动画:
[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithFloat:ANIMATIONDURATIONINSECONDS] forKey:kCATransactionAnimationDuration];
layer1.position = CGPointMake(newX1, newY1);
layer2.position = CGPointMake(newX2, newY2);
[CATransaction commit];
Run Code Online (Sandbox Code Playgroud)
对于更高级的动画,您可以创建CABasicAnimations和CAKeyframeAnimations并将其应用于图层,以便在具有特定时间和加速/减速的复杂路径上移动它们.