저는 raywnderlich 의 샘플 프로젝트 를 따라 첫 번째 cocos2d 애플리케이션을 시작했습니다.
그 응용 프로그램에서 이동 대상은 아래와 같이 추가됩니다.
-(void)addMonster
{
__strong CCSprite * monster = [CCSprite spriteWithFile:@"monster.png"];
CGSize winSize=[CCDirector sharedDirector].winSize;
int minY=monster.contentSize.height/2;
int maxY=winSize.height-minY;
int rangY=maxY-minY;
int actualY=(arc4random()%rangY)+minY;
monster.position=ccp(winSize.width+monster.contentSize.width, actualY);
[self addChild:monster];
monster.tag=1;
int minDuration=2.0;
int maxDuration=4.0;
int actualDuration=(arc4random()%(maxDuration-minDuration))+minDuration;
CCMoveTo *actionMove=[CCMoveTo actionWithDuration:actualDuration
position:ccp(-monster.contentSize.width/2, actualY)];
CCCallBlock *actionDone=[CCCallBlock actionWithBlock:^(CCSprite *node){
[node removeFromParentAndCleanup:YES];// crashed at this point
[_monsters removeObject:node];
}];
[monster runAction:[CCSequence actions:actionMove,actionDone,nil]];
[_monsters addObject:monster];
}
그리고 CCLayerColor 하위 클래스 (장면)의 -init 메서드에서 위의 메서드를 아래와 같이 예약합니다.
-(id)init
{
// player adding code
[self schedule:@selector(gameLogic) interval:1.0];
}
-(void)gameLogic
{
[self addMonster];
}
즉, ipad 화면의 왼쪽에서 오른쪽 끝으로 이동
내 문제는 노드 개체에 액세스하는 동안 응용 프로그램이 CCCallBlock에서 충돌하는 것입니다.
소스를 다운로드하는 대신 시작 지점에서 단계를 복제하려고 계획했지만 여전히 릴리스되는 위치를 찾을 수 없습니다. 동료들을 도와주세요
업데이트 :-충돌시 스크린 샷을 게시했습니다.
문제는 사용중인 블록이 예상되는 인터페이스를 따르지 않는다는 것입니다. 이 CCCallBlock
동작은 매개 변수가없는 블록을 예상하지만 매개 변수 (노드)를 수신하도록 블록을 정의했습니다. 이것이 컴파일된다는 것에 놀랐습니다. 물론 전달 된 노드는 가비지 포인터가되고 액세스 할 때 충돌합니다.
CCCallBlockN
블록이 CCNode*
포인터를 매개 변수로 사용 하는 이 사용을 수정하려면 :
CCCallBlockN *actionDone = [CCCallBlockN actionWithBlock:^(CCNode *node){
// ...
}];
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다