2013-07-02 2 views
0

내가 연구하고있는 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; 

폭발 위험 반경 손상을 계산하는 방법에 대한 정보를 찾고 있습니다.

+0

이 입력을 계속 찾고 있습니다. –

답변

0

당신은 ccpDistance를 사용하여 물체의 거리를 확인할 수 있습니다

float distance = ccpDistance(sprite1.position, sprite2.position); 

내가 ccpDistance는 항상 양의 값을 반환합니다 생각합니다. 그러나 그럴 수 없다면 절대 값을 얻으십시오 : fabsf(distance)

+0

예 게시 된 코드에 ccpDistance를 사용하고 있습니다. 또한 긍정적 인 값만 반환한다고 가정했습니다. 이것은 점검 할만한 가치가있을 수 있으며 손상 계산에 대해 부정적인 결과가 나타나는 이유 일 수 있습니다. 직사각형의 어느 구석/측면을 기준으로 거리를 알아야하기 때문에 간단한 ccpDistance 호출을 할 수 없다고 생각합니다. 내 스프라이트에는 모두 (0,0)의 앵커가 있습니다. 그래서 폭발이 스프라이트의 오른쪽에있을 때 왼쪽 모서리와의 거리를 비교하고 싶지는 않습니다. –