重力感应 加速计- By严焕培
// 加速计-传统用法
//
// Created by 严焕培 on 15-05-19.
// Copyright (c) 2015年 sibu. All rights reserved.
//
#import "MainViewController.h"
#import <QuartzCore/QuartzCore.h>
@interface MainViewController () <UIAccelerometerDelegate>
{
// 小球图像
UIImageView *_ball;
// 小球速度
CGPoint _ballVelocity;
// 游戏时钟
CADisplayLink *_gameTimer;
}
@end
@implementation MainViewController
/*
使用DEPRECATED描述符的方法和对象,是不推荐使用的,同时也是官方停止更新的方法
但是,只要存在,就能使用!
提示:加速剂默认是不工作,因为工作会耗电,当设置了采样频率,加速剂开始工作,同时将采样获得的数据
通过代理方法,发送给调用方
UIAcceleration的说明
* timestamp 数据采样发生的时间
* x x 方向的加速度
* y y 方向的加速度
* z z 方向的加速度
}
*/
- (void)viewDidLoad
{
[super viewDidLoad];
UIImage *image = [UIImage imageNamed:@"black.png"];
_ball = [[UIImageView alloc]initWithImage:image];
[_ball setCenter:self.view.center];
[self.view addSubview:_ball];
// 小球初始静止
_ballVelocity = CGPointZero;
// 加速计
// 1. 实例化加速计,因为在手机上有且仅有一个芯片,因此使用单例来访问加速计
UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];
// 2. 设置更新频率(采样频率)
[accelerometer setUpdateInterval:1 / 30.0];
// 3. 设置代理
[accelerometer setDelegate:self];
// 游戏时钟
// 1. 实例化
_gameTimer = [CADisplayLink displayLinkWithTarget:self selector:@selector(step)];
// 2. 主运行循环
[_gameTimer addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
}
#pragma mark - 时钟监听方法
- (void)step
{
[self updateBallLocation];
}
#pragma mark - 更新小球位置
- (void)updateBallLocation
{
// 根据小球位置调整中心点位置
CGPoint center = _ball.center;
// 判断小球的位置是否超出边界,如果超出边界,将小球的方向求反
// 1) 水平方向
// 如果小球的最小x值,小于0,表示左边出界
// CGRectGetMinX(_ball.frame) = _ball.frame.origin.y
// 如果小球的最大x值,大于viewW,表示右边边出界
if (CGRectGetMinX(_ball.frame) < 0 || CGRectGetMaxX(_ball.frame) > self.view.bounds.size.width) {
_ballVelocity.x *= -0.8;
// 修复小球位置
if (CGRectGetMinX(_ball.frame) < 0) {
center.x = _ball.bounds.size.width / 2;
} else {
center.x = self.view.bounds.size.width - _ball.bounds.size.width / 2;
}
}
// 2)垂直方向
if (CGRectGetMinY(_ball.frame) < 0 || CGRectGetMaxY(_ball.frame) > self.view.bounds.size.height) {
_ballVelocity.y *= -0.8;
// 修复小球位置
if (CGRectGetMinY(_ball.frame) < 0) {
center.y = _ball.bounds.size.height / 2;
} else {
center.y = self.view.bounds.size.height - _ball.bounds.size.height / 2;
}
}
center.x += _ballVelocity.x;
center.y += _ballVelocity.y;
[_ball setCenter:center];
}
#pragma mark - 加速计代理方法
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
// 使用加速度调整小球速度
_ballVelocity.x += acceleration.x;
_ballVelocity.y -= acceleration.y;
// 让加速剂仅负责采样数据,更新速度
[self updateBallLocation];
}
@end
重力感应 加速计- By严焕培的更多相关文章
- xcode 常用插件 加快开发速度 --严焕培
1.KSImageNamed-Xcode 为项目中使用的UIImage的imageNamed提供文件名自动补全功能.使用[UIImage imageNamed:@"xxx"]时,该 ...
- h5手机摇一摇功能实现:基于html5重力感应DeviceMotionEvent事件监听手机摇晃
DeviceMotionEven是html5提供的一个用来获取设备物理方向及运动的信息(比如陀螺仪.罗盘及加速计)的Dom事件,事件描述如下: deviceorientation:提供设备的物理方向信 ...
- cocos2dx 3.x(让精灵随着重力感应的方向移动而移动)
// // GameScene.hpp // HelloWord // // Created by apple on 2017/1/7. // // #ifndef GameScene_hpp #de ...
- H5案例分享:html5重力感应事件
html5重力感应事件 一.手机重力感应图形分析 1.设备围绕z轴的旋转角度为α,α角度的取值范围在[0,360). 设备在初始位置,与地球(XYZ)和身体(XYZ)某个位置对齐. 设备围绕z轴的旋转 ...
- 【Android开发学习笔记】【第九课】重力感应
概念 使用重力感应技术的Android游戏已经屡见不鲜,不知道自己以后会不会用到,所以先研究了一下. 在网上学习了一下,貌似没有api,所以得自己去分析手机处在怎样状态下.注意: 下面提供的demo程 ...
- Cocos2D-X2.2.3学习笔记9(处理重力感应事件,移植到Android加入两次返回退出游戏效果)
这节我们来学习Cocos2d-x的最后一节.怎样处理重力感应事件.移植到Android后加入再按一次返回键退出游戏等.我这里用的Android.IOS不会也没设备呃 效果图不好弄,由于是要移植到真机上 ...
- iOS 重力感应 学习1 陀螺仪 水平仪 指南针
小球可以随着重力感应 四处乱撞. 放大了坐标位移 就可以看见小球动了. 然后规定小球的路径 当滑到中间时候 弹出一张图片 作为提示. 我做了一个小demo 效果不错哦 CMMotionManager ...
- 移动终端学习2:触屏原生js事件及重力感应
如今智能移动设备已经渗透到人们生活的方方面面,用户数量也在不断迅速增长(市场研究机构 eMarketer 在今年初发表的趋势报告中预测,2014年至2018年,中国智能手机用户从总人口的 38.3%增 ...
- Android重力感应开发
http://blog.csdn.net/mad1989/article/details/20848181 一.手机中常用的传感器 在Android2.3 gingerbread系统中,google提 ...
随机推荐
- C#中的显式转换
大多数编程语言都支持显示转换,也称为强制转换,它与隐式转换相呼应,比如,一般的,整型可以通过隐式转换成浮点型,而浮点型需要通过强制转换成整型: int i = 32; double d = i;//整 ...
- linux安全篇:禁止频繁访问的ip访问nginx
实验环境 版本:redhat6.5ip:172.16.1.100,172.16.10软件:nginx 172.16.1.10部署nginx [root@localhost tools]# lsngin ...
- Elasticsearch打造全文搜索引擎(一)
带着问题上路--ES是如何产生的? (1)思考:大规模数据如何检索? 如:当系统数据量上了10亿.100亿条的时候,我们在做系统架构的时候通常会从以下角度去考虑问题: 1)用什么数据库好?(mysq ...
- Leetcode系列之两数之和
Leetcode系列之两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标.你可以假设每种输入只会对应一个答案.但是,你 ...
- 解决maven每次更新都编程java1.5
Maven: 每次更新Maven Project ,JAVA 版本都变为1.5 本文转载自:http://www.cnblogs.com/Hxinguan/p/6132446.html 问题: 1.创 ...
- js对象数组多字段排序
来源:js对象数组按照多个字段进行排序 一.数组排序 Array.sort()方法可以传入一个函数作为参数,然后依据该函数的逻辑,进行数组的排序. 一般用法:(数组元素从小大进行排序) var a = ...
- 安装JavaJDK没有jre环境的解决办法 错误: C:\Program Files\Java\jdk-11.0.7\jre
安装JDK11 发先没有jre解决办法 在安装目录下执行 bin\jlink.exe --module-path jmods --add-modules java.desktop --output j ...
- CobaltStrike简介与安装
CobaltStrike的安装我踩了不少坑,所以我将正确的安装及启动过程跟大家分享一下,以免大家走一些不必要的弯路 Cobaltstrike简介 Cobalt Strike是一款美国Red Team开 ...
- Docker 与 K8S学习笔记(十 二)容器间数据共享
数据共享是volume的关键特性,今天我们来看一下通过volume实现容器与host.容器与容器之间共享数据. 一.容器与host共享数据 在上一篇中介绍到的bind mount和docker man ...
- tomcat容器启动失败疑难问题解决方案
严重: 子容器启动失败java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: 初始化组件[or ...