Я довольно новичок в программировании libgdx и android в целом. У меня возникли проблемы с созданием анимации на основе спрайтов и получением ее того же размера на разных размерах экрана.libgdx sprite-sheet основанное масштабирование анимации
Если я запустил следующий код на моей ноте 4, анимация довольно маленькая, то на Zenfone 2 она довольно большая, и, наконец, на моем ноутбуке это настолько маленькое, что ее едва можно увидеть.
Я действительно не понимаю, почему это происходит, и как сделать то же самое на двух телефонах. Я думал, что использование орфографической камеры с игровыми модулями и видовым окном будет выполнять эту работу, но я могу делать что-то неправильно, потому что это не так.
Я следую за книгой "libgdx кросс-платформенной разработки игры повара".
Я бы очень признателен за любую помощь в том, как правильно использовать в игровых устройствах, чтобы игра была одинаковой на разных размерах экрана, так что изображение размером 512x512 пикселей не было маленьким на заметке4 и огромным на Zenfone (каждый кадр моей анимации составляет 512 пикселей в квадрате).
И что касается ПК, я просто понятия не имею, что происходит, я был бы очень признателен за любое объяснение, почему это происходит!
Спасибо всем!
package com.mygdxGame;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Animation;
import com.badlogic.gdx.graphics.g2d.Animation.PlayMode;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.graphics.g2d.TextureAtlas.AtlasRegion;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.viewport.FitViewport;
import com.badlogic.gdx.utils.viewport.Viewport;
import java.util.Comparator;
public class MyGdxGame extends ApplicationAdapter {
private static final float WORLD_TO_SCREEN = 1.0f/100.0f;
private static final float SCENE_WIDTH = 12.80f;
private static final float SCENE_HEIGHT = 7.20f;
private static final float FRAME_DURATION = 1.0f/20.0f;
private TextureAtlas techmanAtlas;
private Animation techmanRun;
private float animationTime;
private OrthographicCamera camera;
public Viewport viewport;
public SpriteBatch batch;
@Override
public void create(){
camera = new OrthographicCamera();
viewport = new FitViewport(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), camera);
batch = new SpriteBatch();
animationTime = 0.0f;
techmanAtlas = new TextureAtlas(Gdx.files.internal("TechMan.atlas"));
Array<TextureAtlas.AtlasRegion> techmanRegions = new Array<TextureAtlas.AtlasRegion>(techmanAtlas.getRegions());
techmanRegions.sort(new RegionComparator());
techmanRun = new Animation(FRAME_DURATION, techmanRegions, PlayMode.LOOP);
camera.position.set(SCENE_WIDTH * 0.5f, SCENE_HEIGHT * 0.5f, 0.0f);
}
@Override
public void dispose(){
batch.dispose();
techmanAtlas.dispose();
}
@Override
public void render(){
Gdx.gl.glClearColor(1, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
animationTime += Gdx.graphics.getDeltaTime();
camera.update();
batch.setProjectionMatrix(camera.combined);
batch.begin();
TextureRegion techmanFrame = techmanRun.getKeyFrame(animationTime);
int width = techmanFrame.getRegionWidth();
int height = techmanFrame.getRegionWidth();
float originX = width * 0.5f;
float originY = height * 0.5f;
batch.draw(techmanFrame,
1.0f - originX, 3.70f - originY,
originX, originY,
width, height, //width, height
WORLD_TO_SCREEN, WORLD_TO_SCREEN,
0.0f);
batch.draw(techmanRun.getKeyFrame(animationTime), 100.0f, 275.0f);
batch.end();
}
@Override
public void resize(int width, int height){
viewport.update(width, height, false);
}
private static class RegionComparator implements Comparator<AtlasRegion> {
@Override
public int compare(AtlasRegion region1, AtlasRegion region2){
return region1.name.compareTo(region2.name);
}
}
}
Спасибо! Пропустили бы «SCENE_WIDTH» и «SCENE_HEIGHT» в работе окна просмотра? И в batch.draw должен первый параметр быть «techman.Frame», а затем просто ширина height x y? –
@ EdoardoPona да, это сработает. Вы должны выбрать мировые координаты, которые упрощают вычисление в вашем мире (я рекомендую ту же резолюцию, в которой вы создаете концептуальное искусство). И да, я исправил ошибку в методе рисования, спасибо –
да! это сработало! Мне пришлось добавить еще одну вещь, но в методе Gdx.gl.clclear: «| GL20.GL_DEPTH_BUFFER_BIT», спасибо! –