iOS中的物理引擎,iOS物理引擎

來源:互聯網
上載者:User

iOS中的物理引擎,iOS物理引擎

目前知名的2D物理引擎有 Box2d,和Chipmunk,這些是跨平台的。但蘋果本身也封裝了一個物理引擎, UIDynamic是從iOS 7開始引入的一種新技術,隸屬於UIKit架構。這可以讓開發人員可以在遠離物理學公式的情況下,實現炫酷的物理模擬效果。在遊戲開發中會經常用到。本文主要是玩一些較淺的功能,就不說那些遊戲中架構中的進階用法了。畢竟我也入門這個沒多久啊只會些簡單點的,可以用在普通應用介面中偶爾炫酷一下足矣。

如果你不是在董鉑然部落格園看到本文,請點擊查看原文

主要的步驟就三步1.建立一個物理模擬器。設定模擬範圍2.建立相應的物理模擬行為,添加物理模擬元素3.將物理模擬行為添加到模擬器中開始模擬。

 

懶載入方法建立 物理模擬器

- (UIDynamicAnimator *)animator{    if (!_animator) {        // 建立一個物理模擬器        _animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];    }    return _animator;}

 

類比重力行為  UIGravityBehavior

重力行為有一個屬性是重力加速度,設定越大速度增長越快。預設是1

gravity.magnitude = 100;

 

添加元素,告訴模擬器哪些元素可以重力行為

    [gravity addItem:self.sxView];

 

簡單示範:

    // 建立重力行為    UIGravityBehavior *gravity = [[UIGravityBehavior alloc] init];    // magnitude越大,速度增長越快    gravity.magnitude = 100;    [gravity addItem:self.sxView];    // 添加到模擬器中開始模擬    [self.animator addBehavior:gravity];

 

 可以看到只是掉下,(注意這不是勻速動畫,他是類比物體以重力加速度落下的)

 

類比碰撞行為  UICollisionBehavior

碰撞行為需要先添加元素,告訴物理模擬器哪些元素允許碰撞。如

[collision addItem:self.sxView];

其次是設定碰撞的邊界,有個參數預設是以螢幕為邊界。

collision.translatesReferenceBoundsIntoBoundary = YES;

 

把碰撞行為和重力行為結合示範

    // 1.建立重力行為    UIGravityBehavior *gravity = [[UIGravityBehavior alloc] init];    // magnitude越大,速度增長越快    gravity.magnitude = 2;    [gravity addItem:self.sxView];        // 2.建立碰撞行為    UICollisionBehavior *collision = [[UICollisionBehavior alloc] init];    [collision addItem:self.sxView];    [collision addItem:self.bigBlock];    [collision addItem:self.smallBlock];    // 設定碰撞的邊界    collision.translatesReferenceBoundsIntoBoundary = YES;        // 3.開始模擬    [self.animator addBehavior:gravity];    [self.animator addBehavior:collision];

 

(圖中之所以那兩個控制項會往上飄,是因為他們雖然都添加了碰撞行為,但是沒有添加重力行為)

如果覺得螢幕作為邊界不好,可以自己設定一條邊可以是普通的邊

[collision addBoundaryWithIdentifier:@"line2" fromPoint:CGPointMake(self.view.frame.size.width, 0) toPoint:CGPointMake(self.view.frame.size.width, 400)];

 

也可以是個貝塞爾路徑。(注意這裡的路徑是不會顯示的,想要能看見得在view中畫一個和你設定的邊界一樣的圖形)

    UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:    CGRectMake(0,150, self.view.frame.size.width, self.view.frame.size.width)];    [collision addBoundaryWithIdentifier:@"circle" forPath:path];

 效果

 

 類比捕捉行為 UISnapBehavior

捕捉行為需要在建立時就給與一個點。

UISnapBehavior *snap = [[UISnapBehavior alloc] initWithItem:self.sxView snapToPoint:point];

 捕捉行為有一個防震係數屬性,設定的越大,振幅就越小

snap.damping = 1;

 因為預設只能移動一次,如果想多次移動,就在類比模擬前清空之前的模擬器

[self.animator removeAllBehaviors];

 

結合示範,滑鼠點哪,移動到哪

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{    // 1.獲得手指對應的觸摸對象    UITouch *touch = [touches anyObject];        // 2.獲得觸摸點    CGPoint point = [touch locationInView:self.view];        // 3.建立捕捉行為    UISnapBehavior *snap = [[UISnapBehavior alloc] initWithItem:self.sxView snapToPoint:point];    // 防震係數,damping越大,振幅越小    snap.damping = 1;        // 4.清空之前的並再次開始    [self.animator removeAllBehaviors];    [self.animator addBehavior:snap];}

 

 

還有一些在此就不一一示範了 標頭檔都很簡單能看懂的。

UIGravityBehavior:重力行為UICollisionBehavior:碰撞行為UISnapBehavior:捕捉行為UIPushBehavior:推動行為UIAttachmentBehavior:附著行為UIDynamicItemBehavior:動力元素行為所有物理模擬行為都繼承自UIDynamicBehavior所有的UIDynamicBehavior都可以獨立進行組合使用多種行為時,可以實現一些比較複雜的效果  如果你不是在董鉑然部落格園看到本文,請點擊查看原文

比如重力還可以設定重力方向,碰撞還能監聽整個碰撞過程,附著動畫類似於iOS8的iMessage簡訊聊天介面(上下拖動)等等,有興趣的可以自行研究,偶爾在應用中做個“撒紅包”“砸金蛋” 等動畫啥的可以用這些方法。

歡迎關注。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.