第5個(gè)Demo,這次我們來(lái)做第一個(gè)真實(shí)可玩的玩意兒暖侨。
BowlingDemo
這章用到了物體的概念提前,如果沒(méi)基礎(chǔ),建議隨時(shí)查閱這篇SCNPhysicsBody旋廷。還不懂的話請(qǐng)惡補(bǔ)物理知識(shí)先鸠按。
先看效果圖:
很簡(jiǎn)略的一個(gè)保齡球游戲。實(shí)現(xiàn)了保齡球按位置柳洋、角度待诅、旋轉(zhuǎn)方向、力度等不同條件擊打的效果熊镣。一共也就50來(lái)行代碼。(其實(shí)涉及到新知識(shí)的就1行)
1、場(chǎng)景建模
同樣可視化完成
與之前不同的是绪囱,我們對(duì)節(jié)點(diǎn)設(shè)置了物理屬性
在這里再簡(jiǎn)單說(shuō)一下(詳細(xì)介紹見(jiàn)這里)测蹲,從上到下,
Physice Body
:分為三種鬼吵,動(dòng)態(tài)扣甲、靜態(tài)、和運(yùn)動(dòng)齿椅。
動(dòng)態(tài)表示會(huì)根據(jù)受力情況運(yùn)動(dòng)的琉挖,靜態(tài)表示不會(huì)動(dòng)的,運(yùn)動(dòng)表示不會(huì)受力但是會(huì)對(duì)其他物體發(fā)力的涣脚。
Settings
:從上到下依次為“摩擦力”示辈、“彈性”、“滾動(dòng)摩擦”遣蚀、“移動(dòng)阻力”矾麻、“旋轉(zhuǎn)阻力”、“電荷”芭梯、“是否受重力”险耀、“是否允許靜止”。
Bit masks
:從上到下依次為“物體本身分類(lèi)”玖喘、“會(huì)發(fā)生碰撞的物體分類(lèi)”甩牺、“會(huì)監(jiān)聽(tīng)碰撞的分類(lèi)”。這些分類(lèi)都是位累奈,可以通過(guò)位運(yùn)算同時(shí)設(shè)置多個(gè)贬派。
Physics shape
:物體的形狀
在我們的Demo里,場(chǎng)地是不會(huì)動(dòng)的费尽,所以設(shè)置為staticBody
赠群,球和瓶子都是會(huì)受力而運(yùn)動(dòng)的,所以設(shè)置為dynamicBody
旱幼。在該例中不存在kinematicBody
查描。
摩擦力阻力根據(jù)實(shí)際效果微調(diào),這些值沒(méi)必要實(shí)際測(cè)量柏卤。最終效果是根據(jù)相對(duì)值而不是絕對(duì)值冬三。
我們?cè)诖a中需要獲取到我們的球只需要:
SCNScene *scene = [SCNScene sceneNamed:@"SceneKit Scene.scn"];
self.scnView.scene = scene;
_bowlingBall = [scene.rootNode childNodeWithName:@"bowling" recursively:NO];
2、UI及控制
建模完成后缘缚,我們的Demo實(shí)際上已經(jīng)完成80%了勾笆。
UI布局,storyboard桥滨、xib窝爪、code都可以弛车,這個(gè)不多說(shuō)。我說(shuō)一下我的兩個(gè)監(jiān)聽(tīng)蒲每。
一個(gè)是位置調(diào)整:
-(IBAction)positionDidChanged:(UISlider *)sender {
SCNVector3 position = _bowlingBall.position;
position.x = sender.value;
_bowlingBall.position = position;
}
一個(gè)是投擲:
-(IBAction)throwing {
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(powerChanging) object:nil];
SCNVector3 force = SCNVector3Make(_anglesSlider.value*5, 0, -(15+_power*10));
SCNVector3 postion = SCNVector3Make(_rotatesSlider.value, 0, 0);
[_bowlingBall.physicsBody applyForce:force atPosition:postion impulse:YES];
}
核心是這個(gè)方法:- (void)applyForce:(SCNVector3)direction atPosition:(SCNVector3)position impulse:(BOOL)impulse;
給物體的某個(gè)位置施加一個(gè)力或沖量纷跛。
在這我簡(jiǎn)單說(shuō)明一下:(上文提到的文章中有詳細(xì)說(shuō)明)
force
參數(shù),是一個(gè)沖量的矩陣邀杏,和SCNNode
的坐標(biāo)系一樣贫奠,往前就是-z軸,往左就是-x軸望蜡,往上是+y軸唤崭,值越大,沖量越大脖律。所以我們這里的力量就是z的值谢肾,角度就是x的值。
position
參數(shù)状您,是施力的位置勒叠,根據(jù)位置的不同,可以使球的旋轉(zhuǎn)方向發(fā)生變化膏孟。
以上眯分,簡(jiǎn)單實(shí)現(xiàn)了類(lèi)似保齡球的效果。
慢慢地開(kāi)始有意思起來(lái)了哦柒桑。如果有什么不對(duì)的地方弊决,謝謝斧正。