標籤: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的移動和串連