iOS -- SpriteKit架構之SKPhysicsBody的移動和串連

來源:互聯網
上載者:User

標籤:ios   esb   分析   mit   最大   get   table   eid   sbo   


 

 

SKPhysicsBody的受力移動SKPhysicsBody對象不同於SKSpriteNode對象.SKSpriteNode對象可以通過添加動作來進行移動,SKPhysicsBody對象卻沒有移動這一說法,那麼我們該如何移動SKPhysicsBody對象呢?這就需要我們使用到力的作用.用力讓物理體產生運動效果.下面我們看一下給物理體添加作用力的方法.

 

方法 功能
- (void)applyForce:(CGVector)force; 施加一個均勻作用於物理體的拉力
- (void)applyTorque:(CGFloat)torque; 施加一個作用於物理體的側向推力
- (void)applyImpulse:(CGVector)impulse; 施加一個均勻作用於物理體的推力
- (void)applyAngularImpulse:(CGFloat)impulse; 向物理體施加一個角推力

 

下面我們看看具體的樣本,如下所示.

首先我讓整個情境的物理世界的重力加速為0,也就是說沒有重力加速度.

-(instancetype)initWithSize:(CGSize)size{    if (self = [super initWithSize:size]) {        //設定情境的物理世界        self.physicsWorld.gravity = CGVectorMake(0.0, 0.0);    }    return self;}

接下來就是設定背景和實驗體精靈以及情境的邊界.代碼如下所示.

-(void)didMoveToView:(SKView *)view{    [self backgroundNode];    [self planeNode];    //設定邊界    self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:CGRectMake(self.frame.origin.x, self.frame.origin.y, self.size.width, self.size.height)];}#pragma mark ----建立背景-----(void)backgroundNode{    SKSpriteNode *backgroundNode = [SKSpriteNode spriteNodeWithImageNamed:@"bg_02.jpg"];    backgroundNode.position = CGPointZero;    backgroundNode.zPosition = 0;    backgroundNode.anchorPoint = CGPointZero;    backgroundNode.size = self.size;    [self addChild:backgroundNode];}#pragma mark ---- 建立飛船 -----(void)planeNode{    SKSpriteNode *planeNode = [SKSpriteNode spriteNodeWithImageNamed:@"飛機.png"];    planeNode.position = CGPointMake(self.size.width/2, self.size.height/2);    planeNode.anchorPoint = CGPointMake(0.5, 0.5);    planeNode.zPosition = 1;    planeNode.name = @"plane";    [self addChild:planeNode];}

下面,我們在touchBegan裡面建立物理體,並且給它一個水平向右的1000N拉力.代碼如下

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{    SKSpriteNode *planeNode = (SKSpriteNode *)[self childNodeWithName:@"plane"];    planeNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:planeNode.size];    planeNode.physicsBody.restitution = 0;    [planeNode.physicsBody applyForce:CGVectorMake(1000, 0)];}

接下來,小葵花牌媽媽開課了!!!我們就對上面的物理體進行受力分析,我們知道物體受到一個水平向右的1000N拉力,由於線性阻尼沒有進行設定,預設為0.2.所以物體同時受到一個水平向左的摩擦力,這樣物體就做一個減速運動.


 

我們看一下直接的.


其他的幾個受力情況由於類似,所以這裡就不一一說明.

 

SKPhysicsBody的串連物理體的串連,其實就是把兩個物理體用一定的方式串連在一起.串連方式總共有五種如所示.
物理體串連方式
功能
SKPhysicsJointFixed 固定聯合在某個參考點混合兩個主體在一起.固定聯合用於建立以後可以打散的複雜形狀
SKPhysicsJointSliding 滑動聯合允許兩個主體的錨點沿選定的軸滑動
SKPhysicsJointSpring 彈簧聯合就想彈簧那樣,它的長度是兩個主體之間的初始距離
SKPhysicsJointLimit 界限聯合限定了兩個主體之間的最大距離,就想它們使用繩子串連那樣
SKPhysicsJointPin 針聯合與必須兩個主體獨立地繞錨點旋轉,就像釘在一起那樣

下面我們就以彈簧聯合來做一個樣本.首先,我們先把準備工作做好.建立情境,在情境中建立兩個正方體,代碼如下所示.

#import "GameScene.h"@implementation GameScene-(instancetype)initWithSize:(CGSize)size{    if (self = [super initWithSize:size]) {        self.backgroundColor = [SKColor whiteColor];//        self.physicsWorld.gravity = CGVectorMake(0, 0);    }    return self;}-(void)didMoveToView:(SKView *)view{    [self cubeNode];    //設定邊界    self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:CGRectMake(self.frame.origin.x, self.frame.origin.y, self.size.width, self.size.height)];}#pragma mark ----建立兩個正方體 --- -(void)cubeNode{    SKSpriteNode *cubeNode = [SKSpriteNode spriteNodeWithImageNamed:@"正方體.png"];    cubeNode.position = CGPointMake(self.size.width/2, self.size.height/2+200);    cubeNode.anchorPoint = CGPointMake(0.5, 0.5);    cubeNode.zPosition = 1;    cubeNode.name = @"cubeNode";    [self addChild:cubeNode];    SKSpriteNode *cubeNode1 = [SKSpriteNode spriteNodeWithImageNamed:@"正方體.png"];    cubeNode1.position = CGPointMake(self.size.width/2, self.size.height/2);    cubeNode1.anchorPoint = CGPointMake(0.5, 0.5);    cubeNode1.zPosition = 1;    cubeNode1.name = @"cubeNode1";    [self addChild:cubeNode1];}

我們依然是在touchBegan方法中進行操作,在方法中,我們個兩個正方體節點建立對應的物理體,然後建立兩個物理體的彈簧聯合方式以及設定聯合方式的屬性,並且添加到情境的物理世界中.代碼如下所示.

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{    SKSpriteNode *cubeNode = (SKSpriteNode *)[self childNodeWithName:@"cubeNode"];    cubeNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:cubeNode.size];    SKSpriteNode *cubeNode1 = (SKSpriteNode *)[self childNodeWithName:@"cubeNode1"];    cubeNode1.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:cubeNode1.size];    SKPhysicsJointSpring *springPhysicsJoint = [SKPhysicsJointSpring jointWithBodyA:cubeNode.physicsBody bodyB:cubeNode1.physicsBody anchorA:cubeNode.position anchorB:cubeNode1.position];    //彈簧的阻尼    springPhysicsJoint.damping  = 0.2;    //彈簧的震動頻率    springPhysicsJoint.frequency = 2.0;    [self.physicsWorld addJoint:springPhysicsJoint];}

那麼,小葵花牌媽媽又開課了,我們看一下,一旦touchBegan方法被觸發,那麼兩個物體就會做自由落體運動.掉落到情境的邊界之後,反彈,同時彈簧發生震動.由於摩擦力的存在,最後,全部靜止.不懂的童鞋可以去看下高中的物理必修一,力那一章??.


 

整體的如下.


 

好了,SKPhysicsBody的移動和串連就說到這了,希望這篇SKPhysicsBody的移動和串連能對您有所協助.最後雙手奉上SKPhysicsBody的移動和串連的Demo.這裡是整合版吆~
-->SKPhysicsBody的移動和串連Demo ??

 

iOS -- SpriteKit架構之SKPhysicsBody的移動和串連

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.