2015-10-03 2 views
0

Я довольно новичок в программировании 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); 
    } 
} 

} 

ответ

0

Это не правильный способ использования видового экрана:

viewport = new FitViewport(Gdx.graphics.getWidth(),Gdx.graphics.getHeight(), camera); 

Вы должны инициализировать окно просмотра с постоянными значениями, 800х600, например, и использовать их при написании кода:

viewport = new FitViewport(WORLD_WIDTH,WORLD_HEIGHT, camera); 

Изображение будет растянуто/изменено автоматически при рендеринге, вам не нужно это делать:

batch.draw(techman.Frame,x,y,width,height); 

PS: Не вызывайте batch.setProjectionMatrix(camera.combined); внутри метода render(). Вам нужно сделать это только один раз.

Документация:

+0

Спасибо! Пропустили бы «SCENE_WIDTH» и «SCENE_HEIGHT» в работе окна просмотра? И в batch.draw должен первый параметр быть «techman.Frame», а затем просто ширина height x y? –

+0

@ EdoardoPona да, это сработает. Вы должны выбрать мировые координаты, которые упрощают вычисление в вашем мире (я рекомендую ту же резолюцию, в которой вы создаете концептуальное искусство). И да, я исправил ошибку в методе рисования, спасибо –

+0

да! это сработало! Мне пришлось добавить еще одну вещь, но в методе Gdx.gl.clclear: «| GL20.GL_DEPTH_BUFFER_BIT», спасибо! –

Смежные вопросы