내가 연구하고있는 Cocos2D 게임 중 하나는 원형 폭발 효과가 있습니다. 이러한 폭발 효과는 폭발 반지름 내에서 모든 게임 캐릭터 (문제의 대상이 탱크 인 사각형 경계 상자로 표시됨)에 설정된 최대 피해의 일정 비율을 처리해야합니다. 그래서 이것은 직사각형 충돌에 동그라미를 그리며 원의 반경이 가장 가까운 직사각형 모서리에서 얼마나 멀리 떨어져 있는지를 나타냅니다. 나는 어제 밤 이것을 알아 내는데 찌르다가 더 좋은 방법이있을 것이라고 믿는다. 특히, 계산 된 거리를 기반으로 적용 할 손상의 비율을 결정하는 가장 좋은 방법을 알지 못합니다.폭발 반경 손상 확인 - 원에서 사각형 2D
참고 : 모든 탱크 객체의 고정 점은 (0,0)이므로 위치는 경계 상자의 왼쪽 하단 모서리에 따릅니다. 폭발 지점은 원형 폭발의 중심 지점입니다.
TankObject * tank = (TankObject*) gameSprite;
float distanceFromExplosionCenter;
// IMPORTANT :: All GameCharacter have an assumed (0,0) anchor
if (explosionPoint.x < tank.position.x) {
// Explosion to WEST of tank
if (explosionPoint.y <= tank.position.y) {
//Explosion SOUTHWEST
distanceFromExplosionCenter = ccpDistance(explosionPoint, tank.position);
} else if (explosionPoint.y >= (tank.position.y + tank.contentSize.height)) {
// Explosion NORTHWEST
distanceFromExplosionCenter = ccpDistance(explosionPoint,
ccp(tank.position.x, tank.position.y + tank.contentSize.height));
} else {
// Exp center's y is between bottom and top corner of rect
distanceFromExplosionCenter = tank.position.x - explosionPoint.x;
} // end if
} else if (explosionPoint.x > (tank.position.x + tank.contentSize.width)) {
// Explosion to EAST of tank
if (explosionPoint.y <= tank.position.y) {
//Explosion SOUTHEAST
distanceFromExplosionCenter = ccpDistance(explosionPoint,
ccp(tank.position.x + tank.contentSize.width,
tank.position.y));
} else if (explosionPoint.y >= (tank.position.y + tank.contentSize.height)) {
// Explosion NORTHEAST
distanceFromExplosionCenter = ccpDistance(explosionPoint,
ccp(tank.position.x + tank.contentSize.width,
tank.position.y + tank.contentSize.height));
} else {
// Exp center's y is between bottom and top corner of rect
distanceFromExplosionCenter = explosionPoint.x - (tank.position.x + tank.contentSize.width);
} // end if
} else {
// Tank is either north or south and is inbetween left and right corner of rect
if (explosionPoint.y < tank.position.y) {
// Explosion is South
distanceFromExplosionCenter = tank.position.y - explosionPoint.y;
} else {
// Explosion is North
distanceFromExplosionCenter = explosionPoint.y - (tank.position.y + tank.contentSize.height);
} // end if
} // end outer if
if (distanceFromExplosionCenter < explosionRadius) {
/*
Collision :: Smaller distance larger the damage
*/
int damageToApply;
if (self.directHit) {
damageToApply = self.explosionMaxDamage + self.directHitBonusDamage;
[tank takeDamageAndAdjustHealthBar:damageToApply];
CCLOG(@"Explsoion-> DIRECT HIT with total damage %d", damageToApply);
} else {
// TODO adjust this... turning out negative for some reason...
damageToApply = (1 - (distanceFromExplosionCenter/explosionRadius) * explosionMaxDamage);
[tank takeDamageAndAdjustHealthBar:damageToApply];
CCLOG(@"Explosion-> Non direct hit collision with tank");
CCLOG(@"Damage to apply is %d", damageToApply);
} // end if
} else {
CCLOG(@"Explosion-> Explosion distance is larger than explosion radius");
} // end if
} // end if
질문 :
1)이 원 충돌 알고리즘이 더 잘 할 사각형 할 수 있습니까? 수표가 너무 많습니까?
2) 백분율 기준 손상을 계산하는 방법은 무엇입니까? 내 현재 메서드는 때때로 음수를 생성하고 왜 (어쩌면 더 많은 수면이 필요합니다!) 이해가 안 돼요. 그러나 if if 문에서 폭발 거리 반경 <이 맞는지 물어 봅니다. 통제가 끝나면 거리/반경은 < 1이어야합니다. 맞습니까? 따라서 1 - 중간 계산이 부정적이어서는 안됩니다.
인해 잘못된 괄호에 어떤 도움/조언편집
내 가끔 부정적인 결과가 있었다을 주셔서 감사합니다.
damageToApply = (1 - (distanceFromExplosionCenter/explosionRadius)) * explosionMaxDamage;
폭발 위험 반경 손상을 계산하는 방법에 대한 정보를 찾고 있습니다.
이 입력을 계속 찾고 있습니다. –