移动libgdx时精灵闪烁 [英] Sprite flicker while moving libgdx

查看:111
本文介绍了移动libgdx时精灵闪烁的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

此代码使图像边框在向左,向右,向下或向上移动时闪烁(闪烁).为什么即使我使用Screen类的render()方法增量值,图像边框闪光灯也会移动?

    package com.me.mygdxgame;
    import com.badlogic.gdx.Gdx;
    import com.badlogic.gdx.Input.Keys;
    import com.badlogic.gdx.InputProcessor;
    import com.badlogic.gdx.graphics.GL10;
    import com.badlogic.gdx.graphics.OrthographicCamera;
    import com.badlogic.gdx.graphics.Texture;
    import com.badlogic.gdx.graphics.Texture.TextureFilter;
    import com.badlogic.gdx.graphics.g2d.Sprite;
    import com.badlogic.gdx.graphics.g2d.SpriteBatch;
    import com.badlogic.gdx.math.Vector3;
    public class MoveSpriteExample extends GdxTest implements InputProcessor  {
        Texture texture;
        SpriteBatch batch;
        OrthographicCamera camera;
        Vector3 spritePosition = new Vector3();
        Sprite sprite;
        public void resize (int width, int height) {
        }

        public void create() {

            float w = Gdx.graphics.getWidth();
            float h = Gdx.graphics.getHeight();
            batch = new SpriteBatch();
            camera= new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
            camera.setToOrtho(false, w, h);
            texture = new Texture(Gdx.files.internal("data/grasswall.png"));
            texture.setFilter(TextureFilter.Linear, TextureFilter.Linear);
            sprite = new Sprite(texture);

            sprite.setSize(32, 32);
            spritePosition.y=100;

            sprite.setPosition(spritePosition.x,spritePosition.x);
           lastUpdateTime = System.nanoTime();
        }

    public void Update(float Delta)
    {
        if (Gdx.input.isKeyPressed(Keys.D)==true)
        {
            spritePosition.x += 150*(Delta / 1000000000.0);

        }else if (Gdx.input.isKeyPressed( Keys.A)==true)
        {
            spritePosition.x -= 150*(Delta / 1000000000.0);
        }
        else if (Gdx.input.isKeyPressed( Keys.Z)==true)
        {
            spritePosition.y -= 150*(Delta / 1000000000.0);
        }
        else if (Gdx.input.isKeyPressed( Keys.W)==true)
        {
            spritePosition.y += 150*(Delta / 1000000000.0);
        }
    }
    float lastUpdateTime;
    float currentTime;
        public void render() {
            currentTime = System.nanoTime();
            Gdx.gl.glClearColor(1, 1, 1, 1);
            Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

            camera.update();

            Update(currentTime - lastUpdateTime);

            sprite.setPosition(spritePosition.x,spritePosition.y);

            batch.setProjectionMatrix(camera.combined);

            batch.begin();

            sprite.draw(batch);

            batch.end();

            lastUpdateTime = currentTime;
        }
    }

pls提供带有示例的代码

解决方案

正如我在您的上一篇文章中所说,您应该看一下该教程! 首先,您不需要自己计算增量时间.我已经在最后一篇文章中为您介绍了如何获得它.

给我一​​个超简短的例子,它带有一个活动的精灵,没有闪烁. 首先是ApplicationListener. (不是GDXtest)

public class MainClass implements ApplicationListener {
    private Screen currentScreen = null;

    @Override
    public void create() {
        Texture.setEnforcePotImages(false);
        this.currentScreen = new TestScreen();
    }

    @Override
    public void dispose() {
        this.currentScreen.dispose();

    }

    @Override
    public void render() {
        this.currentScreen.render(Gdx.graphics.getDeltaTime());
    }

    @Override
    public void resize(int width, int height) {
        this.currentScreen.resize(width, height);
    }

    @Override
    public void pause() {
        this.currentScreen.pause();
    }

    @Override
    public void resume() {
        this.currentScreen.resume();
        ;
    }
}

这非常简单,正如您所看到的,它确实会在增量时间自动调用屏幕渲染! this.currentScreen.render(Gdx.graphics.getDeltaTime()).

接下来您需要的是一个简单的屏幕.因此,确实实现了Screeninterface的某些东西.我真的建议您在舞台上使用Scene2D设置.但这是一个没有的示例.

public class TestScreen implements Screen {
    private Sprite mySprite;
    private SpriteBatch batch = new SpriteBatch();

    public TestScreen() {
        this.mySprite = new Sprite(new Texture(
                Gdx.files.internal("data/appicon.png")));
        this.mySprite.setPosition(50f, 50f);
    }

    @Override
    public void render(float delta) {
        Gdx.gl.glClearColor(1, 1, 1, 1);
        Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
        this.update(delta);
        this.batch.begin();
        this.mySprite.draw(batch);
        this.batch.end();
    }

    public void update(float delta) {
        if (Gdx.input.isKeyPressed(Keys.D) == true) {
            mySprite.setX(mySprite.getX() + 150 * delta);
        } else if (Gdx.input.isKeyPressed(Keys.A) == true) {
            mySprite.setX(mySprite.getX() - 150 * delta);
        } else if (Gdx.input.isKeyPressed(Keys.Z) == true) {
            mySprite.setY(mySprite.getY() - 150 * delta);
        } else if (Gdx.input.isKeyPressed(Keys.W) == true) {
            mySprite.setY(mySprite.getY() + 150 * delta);
        }
    }

    @Override
    public void resize(int width, int height) {
    }

    @Override
    public void show() {
    }

    @Override
    public void hide() {
    }

    @Override
    public void pause() {
    }

    @Override
    public void resume() {
    }

    @Override
    public void dispose() {
    }
}

Regardas,请看一下本教程. (这里又是开始)

This code makes image Border flicker(Flash) while moving left,right,down or up. Why image border flash wile moving even if I use Screen class render() method delta value.

    package com.me.mygdxgame;
    import com.badlogic.gdx.Gdx;
    import com.badlogic.gdx.Input.Keys;
    import com.badlogic.gdx.InputProcessor;
    import com.badlogic.gdx.graphics.GL10;
    import com.badlogic.gdx.graphics.OrthographicCamera;
    import com.badlogic.gdx.graphics.Texture;
    import com.badlogic.gdx.graphics.Texture.TextureFilter;
    import com.badlogic.gdx.graphics.g2d.Sprite;
    import com.badlogic.gdx.graphics.g2d.SpriteBatch;
    import com.badlogic.gdx.math.Vector3;
    public class MoveSpriteExample extends GdxTest implements InputProcessor  {
        Texture texture;
        SpriteBatch batch;
        OrthographicCamera camera;
        Vector3 spritePosition = new Vector3();
        Sprite sprite;
        public void resize (int width, int height) {
        }

        public void create() {

            float w = Gdx.graphics.getWidth();
            float h = Gdx.graphics.getHeight();
            batch = new SpriteBatch();
            camera= new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
            camera.setToOrtho(false, w, h);
            texture = new Texture(Gdx.files.internal("data/grasswall.png"));
            texture.setFilter(TextureFilter.Linear, TextureFilter.Linear);
            sprite = new Sprite(texture);

            sprite.setSize(32, 32);
            spritePosition.y=100;

            sprite.setPosition(spritePosition.x,spritePosition.x);
           lastUpdateTime = System.nanoTime();
        }

    public void Update(float Delta)
    {
        if (Gdx.input.isKeyPressed(Keys.D)==true)
        {
            spritePosition.x += 150*(Delta / 1000000000.0);

        }else if (Gdx.input.isKeyPressed( Keys.A)==true)
        {
            spritePosition.x -= 150*(Delta / 1000000000.0);
        }
        else if (Gdx.input.isKeyPressed( Keys.Z)==true)
        {
            spritePosition.y -= 150*(Delta / 1000000000.0);
        }
        else if (Gdx.input.isKeyPressed( Keys.W)==true)
        {
            spritePosition.y += 150*(Delta / 1000000000.0);
        }
    }
    float lastUpdateTime;
    float currentTime;
        public void render() {
            currentTime = System.nanoTime();
            Gdx.gl.glClearColor(1, 1, 1, 1);
            Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

            camera.update();

            Update(currentTime - lastUpdateTime);

            sprite.setPosition(spritePosition.x,spritePosition.y);

            batch.setProjectionMatrix(camera.combined);

            batch.begin();

            sprite.draw(batch);

            batch.end();

            lastUpdateTime = currentTime;
        }
    }

pls provide code with sample

解决方案

As i said in the last post of you, you should take a look at the Tutorial! First of all you do not need to calculate the delta time yourself. I already postet how you get it in the last post for you.

Ill give you a super short example with a moving sprite without flickering. At first here is the ApplicationListener. (not a GDXtest)

public class MainClass implements ApplicationListener {
    private Screen currentScreen = null;

    @Override
    public void create() {
        Texture.setEnforcePotImages(false);
        this.currentScreen = new TestScreen();
    }

    @Override
    public void dispose() {
        this.currentScreen.dispose();

    }

    @Override
    public void render() {
        this.currentScreen.render(Gdx.graphics.getDeltaTime());
    }

    @Override
    public void resize(int width, int height) {
        this.currentScreen.resize(width, height);
    }

    @Override
    public void pause() {
        this.currentScreen.pause();
    }

    @Override
    public void resume() {
        this.currentScreen.resume();
        ;
    }
}

It's preaty simple and as you can see it does call the render of the screen automatically with the delta time! this.currentScreen.render(Gdx.graphics.getDeltaTime()).

The next thing you need is a simple Screen. So something that does implement the Screeninterface. Id really recommand that you use a Scene2D setup with a stage. But here is an example without.

public class TestScreen implements Screen {
    private Sprite mySprite;
    private SpriteBatch batch = new SpriteBatch();

    public TestScreen() {
        this.mySprite = new Sprite(new Texture(
                Gdx.files.internal("data/appicon.png")));
        this.mySprite.setPosition(50f, 50f);
    }

    @Override
    public void render(float delta) {
        Gdx.gl.glClearColor(1, 1, 1, 1);
        Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
        this.update(delta);
        this.batch.begin();
        this.mySprite.draw(batch);
        this.batch.end();
    }

    public void update(float delta) {
        if (Gdx.input.isKeyPressed(Keys.D) == true) {
            mySprite.setX(mySprite.getX() + 150 * delta);
        } else if (Gdx.input.isKeyPressed(Keys.A) == true) {
            mySprite.setX(mySprite.getX() - 150 * delta);
        } else if (Gdx.input.isKeyPressed(Keys.Z) == true) {
            mySprite.setY(mySprite.getY() - 150 * delta);
        } else if (Gdx.input.isKeyPressed(Keys.W) == true) {
            mySprite.setY(mySprite.getY() + 150 * delta);
        }
    }

    @Override
    public void resize(int width, int height) {
    }

    @Override
    public void show() {
    }

    @Override
    public void hide() {
    }

    @Override
    public void pause() {
    }

    @Override
    public void resume() {
    }

    @Override
    public void dispose() {
    }
}

Regardas and do take a look at the tutorial. (Here is again the beginning of it)

这篇关于移动libgdx时精灵闪烁的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆