反弹小球和加速度传感器的使用


反弹小球和加速度传感器的使用(UIAccelerometer)

序言:

       我们都见过人家做的小球运动,现在我们一起也做一个自己的小球运动。

今天的小球的效果是:程序运行后,将在画面中间,有一个小球,然后,你倾斜手机,小球将向着手机倾斜的方向飞移动,碰到四壁的时候将会反弹回来。


正文:

首先,我们要讲一下思路;

第一: 在UIViewController的子类里追加UIAccelerometerDelegate的协议,只有这样画面才能接收到速度的通知。接着我们创建小球的对象,和两个方向的加速度值;

代码如下:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UIAccelerometerDelegate>

{
   //我们创建3个对象
    
    UIImageView*_imageView;
    
    //小球X方向的速度
    
    UIAccelerationValue  _speedX;
    
     //小球Y方向的速度
    
    UIAccelerationValue  _speedY;

    
    
}
@end

第二:在-(void)viewDidLoad中创建小球的对象并实现。代码

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

-(void)makeUI
{
     self.view.backgroundColor=[UIColor greenColor];
     //追加球体
     UIImage * image=[UIImage imageNamed:@"qiu.png"];
     _imageView=[[UIImageView alloc]initWithImage:image];
     _imageView.center=self.view.center;
    //让小球自适应
    _imageView.autoresizingMask=UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleBottomMargin|UIViewAutoresizingFlexibleTopMargin;
     [self.view addSubview:_imageView];
 }

第三:我们在-(void)viewWillAppear:(BOOL)animated中开始加速度传感器的使用。首先用UIAccelerometer中的定义的sharedAccelerometer方法获取UIAccelerometerd的单一实例;设置次实例的updateInterval属性设置未SELF ,这样-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration 方法就能接收到加速度通知的信息。  代码:

-(void)viewWillAppear:(BOOL)animated{
    
    [super viewWillAppear:animated];
    
    
    //开始获取加速度传感器传过来的值
    UIAccelerometer*accelermeter=[UIAccelerometer sharedAccelerometer];
    accelermeter.updateInterval=1.0/60.0;//《60HZ
    accelermeter.delegate=self;
    
}


第四:小球的处理。。。代码:

//处理从加速度传感器接收来的通知
-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
    
    
   //在X轴上附加X轴上的加速度
    _speedX+=acceleration.x;
    
    //在Y轴上附加Y轴上的加速度
    
    _speedY+=acceleration.y;
    
    
    
    CGFloat  posX=_imageView.center.x+_speedX;
    //根据速度调整球体位置的坐标
    CGFloat  posY=_imageView.center.y-_speedY;
    
    
    
    
    
    
    //根据速度调整球体的做标
    if (posX<.0) {
        
        
        //碰到边框反弹的处理
        
        posX=.0;
        
        _speedX*=-0.4;//返回的加速度
        
        
        
        
    }else if (posX>self.view.bounds.size.width)
    {
        
        
        
        
        posX=self.view.bounds.size.width;
        _speedX=-.4;
    }
    
    
    
    
    if (posY<.0) {
        
        posY=.0;
        _speedY=.0;
    }else if (posY>self.view.bounds.size.height)
    {
        
        
        
        
        posY=self.view.bounds.size.height;
        _speedY*=-1.5;//碰到下边框1.5倍返回
    }
    
    
    
    
    _imageView.center=CGPointMake(posX, posY);
    
    

    
    
}

第五:当画面消失的时候,代码

-(void)viewWillDisappear:(BOOL)animated{
    
    [super viewWillDisappear:animated];
    
    
    _speedX=_speedY=.0;
    //结束从加速传感器取值
    UIAccelerometer*accelerometer=[UIAccelerometer sharedAccelerometer];
    accelerometer.delegate=nil;
 }


第六:我们已经完成。下面是效果展示:

反弹小球和加速度传感器的使用_第1张图片     反弹小球和加速度传感器的使用_第2张图片 反弹小球和加速度传感器的使用_第3张图片



完整代码:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UIAccelerometerDelegate>

{
   //我们创建3个对象
    
    UIImageView*_imageView;
    
    //小球X方向的速度
    
    UIAccelerationValue  _speedX;
    
     //小球Y方向的速度
    
    UIAccelerationValue  _speedY;

    
    
}
@end


#import "ViewController.h"
#import "Mylabel.h"

@implementation ViewController
-(void)viewDidLoad{
     [super viewDidLoad];
    [self makeUI];
 }

-(void)makeUI
{
     self.view.backgroundColor=[UIColor greenColor];
     //追加球体
     UIImage * image=[UIImage imageNamed:@"qiu.png"];
     _imageView=[[UIImageView alloc]initWithImage:image];
     _imageView.center=self.view.center;
    //让小球自适应
    _imageView.autoresizingMask=UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleBottomMargin|UIViewAutoresizingFlexibleTopMargin;
     [self.view addSubview:_imageView];
 }
-(void)viewWillAppear:(BOOL)animated{
    
    [super viewWillAppear:animated];
    
    
    //开始获取加速度传感器传过来的值
    UIAccelerometer*accelermeter=[UIAccelerometer sharedAccelerometer];
    accelermeter.updateInterval=1.0/60.0;//《60HZ
    accelermeter.delegate=self;
    
}

-(void)viewWillDisappear:(BOOL)animated{
         [super viewWillDisappear:animated];
         _speedX=_speedY=.0;
    //结束从加速传感器取值
    UIAccelerometer*accelerometer=[UIAccelerometer sharedAccelerometer];
    accelerometer.delegate=nil;
 }
//处理从加速度传感器接收来的通知
-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
        //在X轴上附加X轴上的加速度
    _speedX+=acceleration.x;
         //在Y轴上附加Y轴上的加速度
         _speedY+=acceleration.y;
          CGFloat  posX=_imageView.center.x+_speedX;
    //根据速度调整球体位置的坐标
    CGFloat  posY=_imageView.center.y-_speedY;
    
    //根据速度调整球体的做标
    if (posX<.0) {
                //碰到边框反弹的处理
                 posX=.0;
         _speedX*=-0.4;//返回的加速度
          }else if (posX>self.view.bounds.size.width)
    {
               posX=self.view.bounds.size.width;
        _speedX=-.4;
    }
        if (posY<.0) {
        
        posY=.0;
        _speedY=.0;
    }else if (posY>self.view.bounds.size.height)
    {
                posY=self.view.bounds.size.height;
        _speedY*=-1.5;//碰到下边框1.5倍返回
    }
    
          _imageView.center=CGPointMake(posX, posY);
    
     }

 @end

友情快递:

 UITextView的监视状态

UITextViewDelegate协议的方法列表
方法名
调用时机
-(BOOL)textViewShouldBeginEditing:(UITextView *)textView
编辑开始前被调用。如果返回NO,编辑将不会开始。
-(BOOL)textViewShouldEndEditing:(UITextView *)textView


编辑结束前被调用,如果返回NO编辑不会结束。
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text


改变文本前被调用,向range中设置变化范围,text中设置变化后的字符串。返回NO变化不会反应。
-(void)textViewDidBeginEditing:(UITextView *)textView


编辑开始前被调用。UITextView *变成第一相应着时被调用。
-(void)textViewDidEndEditing:(UITextView *)textView


编辑结束后,被调用,UITextView *失去第一相应着时被调用。
-(void)textViewDidChange:(UITextView *)textView


文本变更时被调用。结果是没输入一个字符都会被调用
-(void)textViewDidChangeSelection:(UITextView *)textView
游标移动,选着范围变化时调用


你可能感兴趣的:(传感器,触摸,加速度,加速度传感器,反弹小球)