У меня возникают трудности при разработке правильных вычислений, чтобы увеличить центр экрана в 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));
Есть идеи, что я делаю не так?
Я сделаю это простым способом (не самым эффективным, но прекрасно работает) и только для одной оси (вторая тоже)
лучше иметь смещение без масштабирования:
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;
Надеюсь, я не сделал глупой ошибки (запись по памяти). Для получения дополнительной информации см.
Других решений пока нет …