IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> IOS开发之——硬件开发-加速计应用实例(04) -> 正文阅读

[游戏开发]IOS开发之——硬件开发-加速计应用实例(04)

一 概述

加速计的作用 :用于 检测设备的运动(比如摇晃)。本文介绍相关的两个示例

  • 控制小球的移动
  • 摇一摇

二 控制小球的移动

2.1 项目描述

  • Storyboard上事先放置一个Ball
  • 随着手机的移动,小球随着上下左右移动
  • 超出边界检测(上下左右边界 ),放置到上下左右边界处

2.2 代码

项目代码

#import "ViewController.h"
#import <CoreMotion/CoreMotion.h>
#import "UIView+Extension.h"

@interface ViewController ()
//小球
@property (strong, nonatomic) IBOutlet UIView *imageBall;
//保存速度
@property(nonatomic,assign) CGPoint velocity;
@property(nonatomic,strong) CMMotionManager *mgr;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   [self push];
}

//-push方式采集
-(void)push
{
    //1-创建CoreMotion管理者
    //CMMotionManager *mgr=[[CMMotionManager alloc]init];
    self.mgr=[[CMMotionManager alloc]init];
    //2-判断加速计 是否可用
    if (self.mgr.isAccelerometerActive) {
        //3-设置采样时间
        self.mgr.accelerometerUpdateInterval=1/30.0;
        
        //4-开始采样
        [self.mgr startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
            //这个block是采集到数据时就会调用
            if (error) return;
            CMAcceleration acceleration=accelerometerData.acceleration;
            NSLog(@"x=%f,y=%f,z=%f",acceleration.x,acceleration.y,acceleration.z);
            //移动速度
            _velocity.x+=acceleration.x;
            _velocity.y-=acceleration.y;
            
            //移动距离
            self.imageBall.x+=_velocity.x;
            self.imageBall.y+=_velocity.y;
            
            //边界检测
            if (self.imageBall.x<=0) {
                //矫正小球当前的位置
                self.imageBall.x=0;
                //超出了屏幕的左边
                _velocity.x*=-0.5;
            }
            if (self.imageBall.y<=0) {
                //矫正小球当前的位置
                self.imageBall.y=0;
                //超出屏幕的顶部
                _velocity.y*=-0.5;
            }
            if (CGRectGetMaxY(self.imageBall.frame)>=self.view.height) {
                //矫正小球当前的位置
                self.imageBall.y=self.view.height-self.imageBall.height;
                //超出屏幕的底部
                _velocity.y*=-0.5;
            }
            if (CGRectGetMaxX(self.imageBall.frame)>=self.view.width) {
                //矫正小球当前的位置
                self.imageBall.x=self.view.width-self.imageBall.width;
                //超出屏幕的右边
                _velocity.x*=-0.5;
            }
        }];
        
    }else{
        NSLog(@"加速计不可用");
    }
}
@end

UIView+Extension.h

#import <UIKit/UIKit.h>

@interface UIView (Extension)
@property (nonatomic, assign) CGFloat x;
@property (nonatomic, assign) CGFloat y;
@property (nonatomic, assign) CGFloat maxX;
@property (nonatomic, assign) CGFloat maxY;
@property (nonatomic, assign) CGFloat centerX;
@property (nonatomic, assign) CGFloat centerY;
@property (nonatomic, assign) CGFloat width;
@property (nonatomic, assign) CGFloat height;
@property (nonatomic, assign) CGSize size;
@end

UIView+Extension.m

#import "UIView+Extension.h"

@implementation UIView (Extension)

- (void)setX:(CGFloat)x
{
    CGRect frame = self.frame;
    frame.origin.x = x;
    self.frame = frame;
}

- (CGFloat)x
{
    return self.frame.origin.x;
}

- (void)setMaxX:(CGFloat)maxX
{
    self.x = maxX - self.width;
}


- (CGFloat)maxX
{
    return CGRectGetMaxX(self.frame);
}

- (void)setMaxY:(CGFloat)maxY
{
    self.y = maxY - self.height;
}

- (CGFloat)maxY
{
    return CGRectGetMaxY(self.frame);
}

- (void)setY:(CGFloat)y
{
    CGRect frame = self.frame;
    frame.origin.y = y;
    self.frame = frame;
}

- (CGFloat)y
{
    return self.frame.origin.y;
}

- (void)setCenterX:(CGFloat)centerX
{
    CGPoint center = self.center;
    center.x = centerX;
    self.center = center;
}

- (CGFloat)centerX
{
    return self.center.x;
}

- (void)setCenterY:(CGFloat)centerY
{
    CGPoint center = self.center;
    center.y = centerY;
    self.center = center;
}

- (CGFloat)centerY
{
    return self.center.y;
}

- (void)setWidth:(CGFloat)width
{
    CGRect frame = self.frame;
    frame.size.width = width;
    self.frame = frame;
}

- (CGFloat)width
{
    return self.frame.size.width;
}

- (void)setHeight:(CGFloat)height
{
    CGRect frame = self.frame;
    frame.size.height = height;
    self.frame = frame;
}

- (CGFloat)height
{
    return self.frame.size.height;
}

- (void)setSize:(CGSize)size
{
//    self.width = size.width;
//    self.height = size.height;
    CGRect frame = self.frame;
    frame.size = size;
    self.frame = frame;
}

- (CGSize)size
{
    return self.frame.size;
}

@end

2.3 预览

暂无设备,自行测试

三摇一摇

3.1 说明

  • 在AppDelegate中重写:motionBegan(摇晃开始)、motionEnded(摇晃结束)、motionCancelled(摇晃取消)相关方法
  • 安装到手机中,晃动手机,查看方法的执行结果

3.2 代码

#import "AppDelegate.h"

@interface AppDelegate ()
@end
@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    return YES;
}

#pragma mark -摇一摇
//摇一摇开始
-(void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    NSLog(@"%s",__func__);
    
}
//摇一摇结束
-(void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    NSLog(@"%s",__func__);
}
//摇一摇取消
-(void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
    NSLog(@"%s",__func__);
}
@end
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-04-09 18:49:29  更:2022-04-09 18:50:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/16 20:48:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码