說明
- 本系列文章的學(xué)習(xí)首先要感謝史前圖騰的共享精神,在他的系列文章中有詳細(xì)的解釋,但是他的代碼都是Swift寫的.并且代碼的解釋比較少,
- 在這里我提供了demo-OC版供大家參考和學(xué)習(xí),基礎(chǔ)知識會一一為大家解釋,但是OC版的demo只提供最終合集,方便一次到位減少打開工程的次數(shù)
- demo地址:
OC-地址
swif-地址
知識點(diǎn)
-
SCNView
有一個(gè)delegate屬性,需要遵守SCNSceneRendererDelegate
協(xié)議,這樣就可以在每幀畫面的動(dòng)畫和渲染過程中收到代理方法的調(diào)用.
scenView.delegate = self;
/*
注意
默認(rèn)情況下,如果一個(gè)場景中沒有任何改變時(shí),Scene Kit會進(jìn)入"paused"(暫停)狀態(tài),渲染循環(huán)暫停后代理方法將不會繼續(xù)調(diào)用,為了防止這種情況,需要在創(chuàng)建SCNView實(shí)例時(shí)設(shè)置playing屬性為true 這樣渲染循環(huán)的代理就會一直調(diào)用
*/
scenView.playing = true;
SCNSceneRendererDelegate
/*
該方法調(diào)用非常頻繁 - 一般是 屏幕渲染一次就會調(diào)用一次 具體你可以打印看一下
可以在這里寫一些基礎(chǔ)邏輯,比如添加或移除node節(jié)點(diǎn).
*/
- (void)renderer:(id <SCNSceneRenderer>)renderer updateAtTime:(NSTimeInterval)time API_AVAILABLE(macosx(10.10));
/*!
時(shí)場景中所有節(jié)點(diǎn)在這一幀的actions(動(dòng)作)和animations(動(dòng)畫)都已經(jīng)更新完成.
*/
- (void)renderer:(id <SCNSceneRenderer>)renderer didApplyAnimationsAtTime:(NSTimeInterval)time API_AVAILABLE(macosx(10.10));
/*!
此時(shí)物理效果模擬已經(jīng)完成,可以在這里添加和物理效果有關(guān)的代碼,比如node在受到一個(gè)力影響后改
*/
- (void)renderer:(id <SCNSceneRenderer>)renderer didSimulatePhysicsAtTime:(NSTimeInterval)time API_AVAILABLE(macosx(10.10));
/*!
此時(shí)即將要渲染場景,可以在這里對場景做最后的更改
*/
- (void)renderer:(id <SCNSceneRenderer>)renderer willRenderScene:(SCNScene *)scene atTime:(NSTimeInterval)time;
/*!
它標(biāo)識著一個(gè)渲染循環(huán)的結(jié)束,可以寫一些邏輯更新代碼在這里,比如游戲中血量增減
*/
- (void)renderer:(id <SCNSceneRenderer>)renderer didRenderScene:(SCNScene *)scene atTime:(NSTimeInterval)time;
以下是運(yùn)行的效果圖 做到到了對已不在屏幕中心顯示的節(jié)點(diǎn)進(jìn)行了移除操作 避免內(nèi)存的持續(xù)增長
Untitled.gif