0

我很难理解 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);  
}

我不明白的是“realY”的计算。看起来它将“比率”乘以一个切线。

首先十分感谢

4

1 回答 1

0

这似乎与编写代码的游戏设计影响有关。

弹丸的初始位置:20 像素,屏幕中间。也许这就是画“枪”的地方?

触摸位置:可以在任何地方。我假设触摸位置以像素为单位报告。

偏移量:在初始位置和触摸点之间画一条线。

如果用户触摸了枪的左侧(“向后”),那么我们什么也不做。

realX :无论用户触摸到哪里,我们都希望子弹穿过屏幕的整个宽度。所以将我们想要去的地方的“x”坐标设置为这个值。

但是现在如果我们想沿着用户触摸指示的角度或轨迹发送子弹,我们需要放大目标的 Y 坐标。该比率是一个比例因子,它告诉我们相对于枪的位置,对于给定的 X,Y 必须如何变化。我们将所需的 X 目标乘以该斜率,并将其添加到子弹的起点(屏幕的一半)和我们有一些“目的地”很可能在屏幕外,但与触摸坐标的方向相同。

于 2013-09-18T13:53:48.460 回答