저는 진지한 프로그래밍에 익숙하지 않으므로 제 멍청이를 용서해주십시오.하지만 혼자서는 이것을 이해하지 못했습니다.안전하게 NSMutableSet (cocos2d-iphone)에서 객체를 제거하는 방법
나는 cocos2d-iphone으로 게임을 만들고 있습니다. 단위체, 건물, 로켓트 등 여러 가지 NSMutableSets가있는 장면 개체가 있습니다. 이러한 NSMutableSets에서 개체를 제거하는 데 문제가 있습니다. 총알 객체가 다른 것들 사이를-ED를 init이 될 때이 같은 손상을해야 할 대상 검색 : 그것은 손상을 유지하기 위해 충분한 HP가없는 경우
...
for (RXUnit * unit in targetSet) {
if (ccpDistance(unit.position, rayPoint) < 20) {
...
[unit damageSelfBy:damage];
...
}
}
...
[unit damageSelfBy:damage]
방법은 단위를 죽인다. 당시 총에 맞은 총알이 단위는
[scene.units removeObject:self];
이 줄을 사용할 때마다
(scene.units 위의 루프에서 targetSet 같은 NSMutableSet입니다) : 무엇보다도 이것이 않습니다 세트에서 제거되면 제대로 초기화되지 않습니다. bullet init 메소드는 위에 표시된 for 루프까지 실행합니다 (예, 단위가 손상되어 이전 글 머리 기호에 의해 제거됩니다). 그러나 init 메소드에서이 루프 다음에 오는 다른 것은 실행되지 않습니다.
놀랍게도 응용 프로그램은 그 총알이 붙은 것을 제외하고는 눈에 띄는 효과가 없으므로 정상적으로 계속 실행됩니다. 콘솔에 경고/오류가 표시되지 않고 컴파일 중 경고가 표시되지 않습니다.
장면의 업데이트 메서드에 실제 제거 코드를 넣어서 장치가 집합에서 제거되는 시간을 지연 시키려고했으나 도움이되지 않습니다.
나는이 문제를 숨기기 위해 못생긴 해킹을 만들 수 있다고 생각하지만, 나중에 엉덩이에 나를 물릴 것이라고 확신한다. 그리고 무엇이 어떻게 진행되고 있고, 어떻게 적절히 대처할 수 있는지 이해하고 싶습니다.
어떤 도움이나 아이디어라도 높이 평가합니다. NSMutableSets에 게임 객체를 저장하지 않아야할까요?
그래서, 나는 또 다른 간접 추가 지금 죽어가는 유닛이 코드 장면 객체의 메소드를 호출 '[objectsToRemove addObject :있는 NSArray의 arrayWithObjects : aObject, ASET, 전무]]에서 다음' 그리고' [장면 업데이트 : (ccTime) dt]'첫 줄은 다음과 같습니다. for (NSArray * array in objectsToRemove) { [array objectAtIndex : 1] removeObject : [array objectAtIndex : 0]]; } [objectsToRemove removeAllObjects]; ' 아직도이 특별한 트릭이 왜 작동하는지 모르지만 문제가 해결됩니다. 추신 : – raquo
죄송합니다. 코드 블록 서식이 작동하지 않는 이유를 알아 내려고 노력했지만 주석을 편집 할 수 없게되었습니다. 도와 주셔서 감사합니다! – raquo