Libgdx spritebatch не рисование на основе происхождения текстуры

Я рисую коллекцию спрайтов здесь, используя меньшую (4×4) текстуру при увеличении масштаба и большую (16×16) текстуру при увеличении. Когда уровень масштабирования достигает порога, происходит обмен.

Однако для того, чтобы это был плавный переход, спрайты (расположенные в [x, y]) должны быть нарисованы с их началом, являющимся центром спрайта. В настоящее время они рисуются на основании их нижнего левого угла. Поэтому, когда происходит смена текстуры, спрайт слегка спрыгивает, поскольку исходные данные не совпадают.

Я создал некоторые переменные для отладки и убедитесь, что они верны.

TextureRegion sprite = null; boolean useHighResTexture = (_gameRef.cameraZoom < CAMERA_ZOOM_SWITCH_LO_RES); if (useHighResTexture) { //Zoomed in, Hi res, Use animation sprite = animation.getKeyFrame(animationStateTime, true); } else { //Zoomed out, lo-res, Use static image sprite = Assets.instance.getSmall(); } float spriteWidth = sprite.getRegionWidth(); float spriteHeight = sprite.getRegionHeight(); float spriteOriginX = spriteWidth/2; float spriteOriginY = spriteHeight/2; //Draw(TEXTURE, x, y, originx, originy, // width, height, scaleX, scaleY, rotation, // srcX, srcY, // srcWidth, srcHeight, boolflipX, boolflipY //this.setCenter(spriteOriginX, spriteOriginY); batch.draw(sprite.getTexture(), this.x, this.y, spriteOriginX, spriteOriginY, spriteWidth, spriteHeight, 1.0f, 1.0f, this.directionFaced, sprite.getRegionX(), sprite.getRegionY(), sprite.getRegionWidth(), sprite.getRegionHeight(), false, false); 

Вы можете видеть, что я использую анимацию увеличенной версии (16×16) и статического изображения в увеличенной версии (4×4) с помощью AssetsManager.

Переменные spriteWidth , spriteHeight являются правильными как на 16, так и на 4 в зависимости от того, увеличен или увеличен масштаб.

Переменные spriteOriginX и spriteOriginY верны (я полагаю) как на 8, так и на 2, зависящих от того, увеличен или увеличен.

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

Является ли мой вызов в batch.draw() правильным?

Большое спасибо, J

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

 batch.draw(sprite.getTexture(), this.x - spriteOriginX, this.y - spriteOriginY, spriteOriginX, spriteOriginY, spriteWidth, spriteHeight, 1.0f, 1.0f, this.directionFaced, sprite.getRegionX(), sprite.getRegionY(), sprite.getRegionWidth(), sprite.getRegionHeight(), false, false ); 

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

Опять же: источник используется только для вращения и масштабирования. Если вы установите поворот в методе draw() он будет повернут вокруг источника (в вашем случае – в середине).

Intereting Posts
Дизайн макета, как диалоговое окно, происходит с нижней стороны в android WifiManager reconnect возвращает true, но не подключается Android BroadcastReceiver: запустить его по умолчанию или в новом? Средство sdk-платформы (23.1) слишком устарело, чтобы проверять API, скомпилированные с API 24; пожалуйста обновите Должен ли я импортировать android.graphics.camera или android.hardware.camera? Запись и чтение файла с SD-карты на Android Выполнять команды оболочки и получать выходные данные в TextView Нужно идентификатор изображения из атрибутов xml custom custom widget Силовой макет для обновления / перерисовки андроида? AppCompatActivity.onCreate можно вызывать только из одной и той же группы библиотек NoClassDefFoundError для приложений, у которых нет новой установки Android Wear 5.1 API жестов запястья? Как определить, что мобильный не работает? Использование класса PdfDocument для старой версии для Android Время для одноразовых покупок с помощью биллинга в Google Play In-App