Учебник по Cocos2D-x. Положение цели

У меня возникли проблемы с пониманием математики, стоящей за фрагментом кода учебника по cocos2d. Этот фрагмент кода предназначен для получения положения цели пули.

void HelloWorld::ccTouchesEnded(CCSet* touches, CCEvent* event)
{
    // Choose one of the touches to work with
    CCTouch* touch = (CCTouch*)( touches->anyObject() );
    CCPoint location = touch->getLocationInView();
    location = CCDirector::sharedDirector()->convertToGL(location);

    // Set up initial location of projectile
    CCSize winSize = CCDirector::sharedDirector()->getWinSize();
    CCSprite *projectile = CCSprite::create("Projectile.png", CCRectMake(0, 0, 20, 20));
    projectile->setPosition( ccp(20, winSize.height/2) ); 

    // Determinie offset of location to projectile
    int offX = location.x - projectile->getPosition().x;
    int offY = location.y - projectile->getPosition().y;

    // Bail out if we are shooting down or backwards
    if (offX <= 0) return;

    // Ok to add now - we've double checked position
    this->addChild(projectile);

    // Determine where we wish to shoot the projectile to
    int realX = winSize.width + (projectile->getContentSize().width/2);
    float ratio = (float)offY / (float)offX;
    int realY = (realX * ratio) + projectile->getPosition().y;
    CCPoint realDest = ccp(realX, realY);

    // Determine the length of how far we're shooting

    // My comment: if in the next two lines we use (offX, offY) instead of (realX, realY)
    // bullet direction looks ok

    int offRealX = realX - projectile->getPosition().x;
    int offRealY = realY - projectile->getPosition().y;
    float length = sqrtf((offRealX * offRealX) + (offRealY * offRealY));
    float velocity = 480/1; // 480pixels/1sec
    float realMoveDuration = length/velocity;

    // Move projectile to actual endpoint
    projectile->runAction(  CCSequence::create( CCMoveTo::create(realMoveDuration, realDest),
                            CCCallFuncN::create(this, callfuncN_selector(HelloWorld::spriteMoveFinished)), 
                            NULL) );

    // Add to projectiles array
    projectile->setTag(2);
    _projectiles->addObject(projectile);  
}

Чего я не понимаю, так это расчета «реального». Похоже, что он умножает «коэффициент» как тангенс.

Большое спасибо заранее


person user1625678    schedule 18.09.2013    source источник


Ответы (1)


Кажется, это связано с каким-либо влиянием на игровой дизайн, для которого был написан этот код.

Исходное положение снаряда: 20 пикселей в середине экрана. Может быть, здесь и нарисована "пушка"?

Положение касания: может быть где угодно. Я предполагаю, что позиции касания сообщаются в пикселях.

Смещение: нарисуйте линию между начальным положением и точкой касания.

Если пользователь коснулся слева от пистолета («назад»), мы ничего не делаем.

realX : независимо от того, где пользователь коснулся, мы хотим, чтобы пуля прошла всю ширину экрана. Поэтому установите координату «x» того места, где мы хотим перейти к этому значению.

Но теперь, если мы хотим отправить пулю под углом или по траектории, указанной пользователем, нам нужно увеличить координату Y пункта назначения. Отношение — это масштабный коэффициент, который говорит нам, как Y должен измениться относительно положения пистолета для заданного X. Мы умножаем желаемый пункт назначения X на этот наклон и добавляем его к начальной точке пули (в середине экрана) и у нас есть некоторая «пункт назначения», которая, скорее всего, находится за кадром, но в том же направлении, что и сенсорная координата.

person Mikeb    schedule 18.09.2013
comment
Спасибо за быстрый ответ. Да, 20 пикселей — это то место, где должен быть нарисован пистолет. Во всяком случае, использовать realX и realY действительно необходимо? У нас уже есть вектор от начального положения пули до цели (offX, offY). Если я использую эти значения, направление пули выглядит одинаково. - person user1625678; 18.09.2013
comment
Не видя всего кода, я не знаю. Я бы предположил из этого фрагмента, что пуля останавливается в месте касания без этой экстраполяции. - person Mikeb; 18.09.2013
comment
Я отредактировал код с полным телом функции, что вы думаете? - person user1625678; 18.09.2013
comment
Если вы замените только realX / realY там, где вы указали, вы только измените расчет продолжительности; шаг анимации по-прежнему использует целевой объект, который имеет координаты realX, realY, поэтому он все равно будет перемещаться за пределы экрана. Изменяя продолжительность, вы эффективно ускоряете процесс. - person Mikeb; 18.09.2013
comment
Да, это то, что происходит, меня беспокоило только направление пули, если линии, вычисляющие realX и realY, действительно имели какое-то отношение к направлению пули, потому что, если бы я использовал offX и offY, у меня было бы то же направление. Большое спасибо за вашу помощь :) - person user1625678; 18.09.2013