我發現一些作品的標準Chipmunk的物理引擎。
TL;博士
的基本思路是,以保持精靈的位置跟蹤自己,然後定期檢查他們是否有任何人因爲他們是最後一次檢查已經轉移。
加長版
我創建CCNode與類名Piece
一個子類。
這些是我添加到物理世界的物體。
@implementation Piece {
float _previousX;
float _previousY;
}
-(void)updatePreviousScreenXandY{
_previousX = self.position.x;
_previousY = self.position.y;
}
-(BOOL)hasntMoved{
float currentX = self.position.x;
float currentY = self.position.y;
if (currentX == _previousX && currentY == _previousY) {
return TRUE;
}else{
return FALSE;
}
}
這是我的CCNode充當遊戲場景
-(void)doStuffAfterPiecesStopMoving:(NSTimer*)timer{
BOOL noPiecesHaveMoved = TRUE;
for (int i = 0; i < [[_physicsWorld children] count]; i++) {
if ([[_physicsWorld children][i] hasntMoved] == FALSE) {
noPiecesHaveMoved = FALSE;
break;
}
}
if (noPiecesHaveMoved) {
[timer invalidate];
NSLog(「Pieces have stopped moving」);
}else{
NSLog(「Pieces are still moving」);
[self updateAllPreviousPiecePositions];
}
}
-(void)updateAllPreviousPiecePositions{
for (int i=0; i < [[_physicsWorld children] count]; i++) {
Piece *piece = (Piece*)[_physicsWorld children][i];
[piece updatePreviousScreenXandY];
}
}
所有我需要做的就是
[NSTimer scheduledTimerWithTimeInterval:TIME_BETWEEN_CHECKS
target:_gamePlay
selector:@selector(doStuffAfterPiecesStopMoving:)
userInfo:nil
repeats:YES];
,它會所有的片之後,運行我想要的任何代碼節點已停止移動。
使其正常工作的關鍵是獲取Chipmunk空間的sleepTimeThreshold值和上面定時器的值儘可能低。
我運行實驗表明以下設置工作還行,但任何降低都會導致問題(即碰撞沒有發生正常):
sleepTimeThreshold = 0.15
我的定時器= 0.05
如果有人對上述代碼有不同的/更好的解決方案或改進,請發佈。