《iOS 6高级开发手册(第4版)》——1.8节使用加速度移动屏幕上的对象
本节书摘来自异步社区《iOS 6高级开发手册(第4版)》一书中的第1章,第1.8节使用加速度移动屏幕上的对象,作者 【美】Erica Sadun,更多章节内容可以访问云栖社区“异步社区”公众号查看
1.8 使用加速度移动屏幕上的对象
iOS 6高级开发手册(第4版)
借助一点编程工作,iPhone的机载加速计就可以使对象在屏幕上四处“移动”,实时响应用户倾斜手机的方式。秘诀1-4创建了一只动画式的蝴蝶,用户可以使之快速移过屏幕。
使之工作的秘密在于:向程序中添加一个所谓的“物理计时器”。它不是直接响应加速中的变化,而是像秘诀1-3所做的那样,加速计回调用于测量当前的力。它取决于计时器例程随着时间的推移通过改变它的画面对蝴蝶应用那些力。下面列出了一些要记住的关键点。
只要力的方向仍然保持相同,蝴蝶就会加速。它的速度会依据加速力在x或y方向上的量度成比例地提高。
由计时器调用的tick例程将通过向蝴蝶的原点添加速度向量来移动蝴蝶。
蝴蝶移动的范围是有界限的。因此,当它撞到某个边缘时,将会停止在那个方向上移动。这可以一直把蝴蝶保留在屏幕上。tick方法将会检查界限条件。例如,如果蝴蝶撞到垂直边缘,那它仍然可以在水平方向上移动。
蝴蝶会改变它自身的方向,使之总是“下落”。可以在tick方法中应用一个简单的旋转变换来实现这一点。在使用变换时,还要关注画面或中心偏移。在应用偏移之前,总是要重置数学处理,然后重新应用任何角度改变。不这样做的话,可能导致画面出人意料地放大、收缩或扭曲。
注意:
{计时器在自然状态下不会处理块。如果你愿意使用基于块的设计,可以查询github,找到它的解决办法。} 秘诀1-4 基于加速计的反馈移动屏幕上的对象
- (void)accelerometer:(UIAccelerometer *)accelerometer
didAccelerate:(UIAcceleration *)acceleration
{
// Extract the acceleration components
float xx = -acceleration.x;
float yy = acceleration.y;
// Store the most recent angular offset
mostRecentAngle = atan2(yy, xx);
// Has the direction changed?
float accelDirX = SIGN(xvelocity) * -1.0f;
float newDirX = SIGN(xx);
float accelDirY = SIGN(yvelocity) * -1.0f;
float newDirY = SIGN(yy);
// Accelerate. To increase viscosity lower the additive value
if (accelDirX == newDirX) xaccel =
(abs(xaccel) + 0.85f) * SIGN(xaccel);
if (accelDirY == newDirY) yaccel =
(abs(yaccel) + 0.85f) * SIGN(yaccel);
// Apply acceleration changes to the current velocity
xvelocity = -xaccel * xx;
yvelocity = -yaccel * yy;
}
- (void) tick
{
// Reset the transform before changing position
butterfly.transform = CGAffineTransformIdentity;
// Move the butterfly according to the current velocity vector
CGRect rect = CGRectOffset(butterfly.frame, xvelocity, 0.0f);
if (CGRectContainsRect(self.view.bounds, rect))
butterfly.frame = rect;
rect = CGRectOffset(butterfly.frame, 0.0f, yvelocity);
if (CGRectContainsRect(self.view.bounds, rect))
butterfly.frame = rect;
// Rotate the butterfly independently of position
butterfly.transform =
CGAffineTransformMakeRotation(mostRecentAngle + M_PI_2);
}
- (void) initButterfly
{
CGSize size;
// Load the animation cells
NSMutableArray *butterflies = [NSMutableArray array];
for (int i = 1; i <= 17; i++)
{
NSString *fileName = [NSString stringWithFormat:@"bf_%d.png", i];
UIImage *image = [UIImage imageNamed:fileName];
size = image.size;
[butterflies addObject:image];
}
// Begin the animation
butterfly = [[UIImageView alloc]
initWithFrame:(CGRect){.size=size}];
[butterfly setAnimationImages:butterflies];
butterfly.animationDuration = 0.75f;
[butterfly startAnimating];
// Set the butterfly's initial speed and acceleration
xaccel = 2.0f;
yaccel = 2.0f;
xvelocity = 0.0f;
yvelocity = 0.0f;
// Add the butterfly
butterfly.center = RECTCENTER(self.view.bounds);
[self.view addSubview:butterfly];
// Activate the accelerometer
[[UIAccelerometer sharedAccelerometer] setDelegate:self];
// Start the physics timer
[NSTimer scheduledTimerWithTimeInterval: 0.03f
target: self selector: @selector(tick)
userInfo: nil repeats: YES];
}
获取这个秘诀的代码
{要查找这个秘诀的完整示例项目,可以浏览https://github.com/erica/iOS-6-Advanced-Cookbook,并进入第1章的文件夹。}
获取这个秘诀的代码
要查找这个秘诀的完整示例项目,可以浏览 https://github.com/erica/iOS-6-Advanced-Cookbook , 并进入第 1 章的文件夹。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
《CCNP TSHOOT 300-135认证考试指南》——2.3节利用Cisco IOS验证和定义故障问题
本节书摘来自异步社区《CCNP TSHOOT 300-135认证考试指南》一书中的第2章,第2.3节利用Cisco IOS验证和定义故障问题,作者 【加】Raymond Lacoste , 【美】Kevin Wallace,更多章节内容可以访问云栖社区“异步社区”公众号查看 2.3 利用Cisco IOS验证和定义故障问题CCNP TSHOOT 300-135认证考试指南接到故障工单后的首要任务就是验证并定义故障问题,利用一些相对简单的任务即可确认所报告的故障问题,并且在大多数情况下有助于聚焦故障排查工作。Cisco IOS内置了三款易于使用的工具(ping、Telnet和traceroute),可以帮助验证网络连接性并明确定义故障问题。本节将讨论利用ping、Telnet和traceroute等工具验证故障问题并聚焦故障排查工作的方式。 关键 检测网络连接性的最常用命令就是ping。第1章曾经说过,ping测试成功表示OSI的第一层、第二层、第三层工作均正常,因而可以将排障重心集中到更高的OSI层,反之,如果ping测试不成功,那么就可以将排障重心集中到较低的OSI层。 基本的pin...
-
下一篇
《Android 应用测试指南》——第2章,第2.8节其他命令行选择
本节书摘来自异步社区《Android 应用测试指南》一书中的第2章,第2.8节其他命令行选择,作者 【阿根廷】Diego Torres Milano(迭戈 D.),更多章节内容可以访问云栖社区“异步社区”公众号查看 2.8 其他命令行选择之前已经提到了,am instrument命令中接收输入<名称,值>的键值对,含义如表2.11中所示。 表2.11 am instrument命令的其他选项
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- MySQL8.0.19开启GTID主从同步CentOS8
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装