вектор — C ++ Увеличить центр экрана в 2D-координатах

У меня возникают трудности при разработке правильных вычислений, чтобы увеличить центр экрана в 2D-координатах, сохраняя при этом все в правильном масштабе.

У меня есть вектор, который я использую для перемещения моего редактора карт следующим образом:

scroll = sf::Vector2<float>(-640.0f, -360.0f);

Он установлен на -640.0f, -360.0f, чтобы при инициализации сделать центр экрана равным 0,0 (для моего окна 1280×720).

Мое значение масштабирования варьируется от 0,1f до 2,0f, и оно увеличивается или уменьшается с шагом 0,05:

zoomScale = zoomScale + 0.05;

При рисовании элементов на экране они рисуются с использованием следующего кода:

sf::Rect<float> dRect;
dRect.left = (mapSeg[i]->position.x - scroll.x) * (layerScales[l] * zoomScale);
dRect.top = (mapSeg[i]->position.y - scroll.y) * (layerScales[l] * zoomScale);
dRect.width = (float)segDef[mapSeg[i]->segmentIndex]->width;
dRect.height = (float)segDef[mapSeg[i]->segmentIndex]->height;

sf::Sprite segSprite;
segSprite.setTexture(segDef[mapSeg[i]->segmentIndex]->tex);
segSprite.setPosition(dRect.left, dRect.top);
segSprite.setScale((layerScales[l] * zoomScale), (layerScales[l] * zoomScale));
segSprite.setOrigin(segDef[mapSeg[i]->segmentIndex]->width / 2, segDef[mapSeg[i]->segmentIndex]->height / 2);
segSprite.setRotation(mapSeg[i]->rotation);
Window.draw(segSprite);

layerScales — это значение, используемое для масштабирования слоев сегментов для параллаксной прокрутки.

Кажется, это работает нормально при увеличении и уменьшении, но центральная точка, кажется, смещается (элемент, который, как я знаю, всегда должен быть в 0,0, будет расположен в разных координатах, как только я увеличу масштаб). Я использую следующее, чтобы вычислить, какая позиция у мыши, чтобы проверить это следующим образом:

mosPosX = ((float)input.mousePos.x + scroll.x) / zoomScale)
mosPosY = ((float)input.mousePos.y + scroll.y) / zoomScale)

Я уверен, что есть расчет, который я должен сделать для вектора «прокрутки», чтобы учесть этот масштаб, но я не могу заставить его работать правильно.

Я попытался реализовать что-то вроде ниже, но это не дало правильных результатов:

scroll.x = (scroll.x - (SCREEN_WIDTH / 2)) * zoomScale - (scroll.x - (SCREEN_WIDTH / 2));
scroll.y = (scroll.y - (SCREEN_HEIGHT / 2)) * zoomScale - (scroll.y - (SCREEN_HEIGHT / 2));

Есть идеи, что я делаю не так?

0

Решение

Я сделаю это простым способом (не самым эффективным, но прекрасно работает) и только для одной оси (вторая тоже)

лучше иметь смещение без масштабирования:

scaledpos = (unscaledpos*zoomscale)+scrolloffset

Знайте, что центральная точка не должна двигаться после изменения масштаба (0 означает до 1 означает после):

scaledpos0 == scaledpos1

так сделайте это:

scaledpos0 = (midpointpos*zoomscale0)+scrolloffset0; // old scale
scaledpos1 = (midpointpos*zoomscale1)+scrolloffset0; // change zoom only
scrolloffset1+=scaledpos0-scaledpos1;                  // correct offset so midpoint stays where is ... i usualy use mouse coordinate instead of midpoint so i zoom where the mouse is

когда вы не можете изменить уравнение масштабирования, просто сделайте то же самое с вашим

scaledpos0 = (midpointpos+scrolloffset0)*zoomscale0;
scaledpos1 = (midpointpos+scrolloffset0)*zoomscale1;
scrolloffset1+=(scaledpos0-scaledpos1)/zoomscale1;

Надеюсь, я не сделал глупой ошибки (запись по памяти). Для получения дополнительной информации см.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]