LibGDX - 来自自定义类的Sprite没有显示

时间:2015-09-18 14:29:15

标签: android libgdx rendering sprite

我一直在努力想象我们这样做6个小时吧... 我有两个课程(PlayerUiButton),两个课程都是 extends Sprite 。 问题是来自 播放器 Sprite 正在渲染 UiButton 中的 Sprite 不是

在这里,看看代码:

Player.java (简化)

public class Player extends Sprite
{
    public Player( float posX, float posY )
    {
        super( new Texture( Gdx.files.internal( "character/char_idle.png" ) ) );
        super.setPosition( posX, posY );
    }
}

UiButton.java

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Sprite;

public class UiButton extends Sprite
{
    public UiButton( Texture texture, float posX, float posY, float rotation )
    {
        super( new Texture( Gdx.files.internal( "ui/arrow.png" ) ) );

        setPosition( posX, posY );
        setRotation( rotation );
    }

    public UiButton( UiButton button )
    {
        super( );
    }

    public void setSize( float toWidth, float toHeight )
    {
        float scaleX = toWidth / super.getWidth( );
        float scaleY = toHeight / super.getHeight( );

        setScale( scaleX, scaleY );
    }

    public boolean isTouched( int touchX, int touchY )
    {
        if( touchX >= getX( ) && touchX <= getX( ) + getWidth( ) )
            if( touchY >= getY( ) && touchY <= getY( ) + getHeight( ) )
                return true;

        return false;
    }

}

GameEngine.java (不是整个文件,而是所需的函数和变量)

public class GameEngine extends ApplicationAdapter implements ApplicationListener
{
    private SpriteBatch spriteBatch;
    private Player      player;
    private Sprite      grid;

    private UiButton arrow_right;
    private UiButton arrow_left;
    private UiButton arrow_down;
    private UiButton arrow_up;

    @Override public void create( )
    {
        /** Setting InputProcessor **/
        InitializeInputProcessor( );

        /** Initializing SpriteBatch **/
        spriteBatch = new SpriteBatch( );
        spriteBatch.maxSpritesInBatch = 10;

        /** Creating UI **/
        GenerateUiArrows( 10, Gdx.graphics.getHeight( ) / 4 );

        /** Creating Player **/
        player = new Player( 100, 100 );

        /** Creating background grid **/
        grid = new Sprite( new Texture( generateGrid( 50 ) ) );
    }

    @Override public void dispose( )
    {
        spriteBatch.dispose( );
    }

    public void doUpdating( )
    {
        player.update( );
    }

    public void doRendering( )
    {
        /** Clearing the screen **/
        Gdx.gl.glClearColor( 1, 1, 1, 1 );
        Gdx.gl.glClear( GL20.GL_COLOR_BUFFER_BIT );

        /** Beginning SpriteBatch rendering **/
        spriteBatch.begin( );

        /** Drawing background grid **/
        grid.draw( spriteBatch );

        /** Drawing Player **/
        player.draw( spriteBatch );

        /** Drawing UI **/
        arrow_right.draw( spriteBatch );
        arrow_left.draw( spriteBatch );
        arrow_down.draw( spriteBatch );
        arrow_up.draw( spriteBatch );

        /** Ending SpriteBatch rendering **/
        spriteBatch.end( );
    }

    @Override public void render( )
    {
        doUpdating( );
        doRendering( );

        /******************************************/
        /** Here was a loop to control framerate **/
        /******************************************/
    }

    private Pixmap generateGrid( int interval )
    {
        /** Creating temporary Pixmap **/
        Pixmap tempMap = new Pixmap( Gdx.graphics.getWidth( ), Gdx.graphics.getHeight( ), Pixmap.Format.RGBA8888 );

        /** Setting lines color to BLACK **/
        tempMap.setColor( Color.BLACK );

        /** Creating horizontal lines **/
        for( int i = interval; i < Gdx.graphics.getWidth( ); i += interval )
            tempMap.drawLine( i, 0, i, Gdx.graphics.getHeight( ) );

        /** Creating vertical lines **/
        for( int i = interval; i < Gdx.graphics.getHeight( ); i += interval )
            tempMap.drawLine( 0, i, Gdx.graphics.getWidth( ), i );

        /** Returning the result **/
        return tempMap;
    }

    private void GenerateUiArrows( float padding, float button_size )
    {
        arrow_right = new UiButton( new Texture( Gdx.files.internal( "ui/arrow.png" ) ), button_size * 2 + padding * 3, padding, 90 );
        arrow_right.setSize( button_size, button_size );

        arrow_left = new UiButton( new Texture( Gdx.files.internal( "ui/arrow.png" ) ), padding, padding, 270 );
        arrow_left.setSize( button_size, button_size );

        arrow_down = new UiButton( new Texture( Gdx.files.internal( "ui/arrow.png" ) ), button_size + padding * 2, padding, 180 );
        arrow_down.setSize( button_size, button_size );

        arrow_up = new UiButton( new Texture( Gdx.files.internal( "ui/arrow.png" ) ), button_size + padding * 2, button_size + padding * 2, 0 );
        arrow_up.setSize( button_size, button_size );
    }

}

未显示任何错误或警告。只是UiButtons没有渲染。我还没有设立OrthographicCamera。所以情况不应该......

1 个答案:

答案 0 :(得分:3)

您的问题出在UiButton类的 setSize()方法中:

    public void setSize( float toWidth, float toHeight )
    {
        //System.out.println("super.width = " + super.getWidth() + ", super.height = " + super.getHeight() ); - you can uncomment it to see the super width/height value in the console

        float scaleX = toWidth / super.getWidth( );
        float scaleY = toHeight / super.getHeight( );

        setScale( scaleX, scaleY );
    }

super.getWidth() super.getHeight()都会返回ZERO(因为您没有为超类对象设置任何宽度/高度) 。然后在scaleX / scaleY变量中你有无穷大值 - 你可以通过在我的代码中取消注释标记行来看到它。

有趣的是,Java允许你除以浮动零 - 返回提到的无穷大值(read more here),这就是为什么你没有异常。

解决方案是通过调用super.setSize(width,height)修复此方法,或者只是删除它并依赖于默认的Sprite类setSize()方法实现。

还有一件事 - 在解决问题后你会发现旋转问题 - 这是关于原点的。您可以将setSize方法更改为

    @Override
    public void setSize(float w, float h)
    {
        super.setSize(w,h);

        setOrigin(w/2f, h/2f);
    }

它会做的事情

enter image description here