Accessing to inner class in java

Issue

I’m a beginner in libGdx and I’m making a simple game.

I wrote a nested class. As you can see here:

public class classes{
        public class GameObject{
        
        //declaring section
        private Texture texture;
        private Texture[] spawnAnimation;
        private Texture[] deathAnimation;
        private Texture[] damageAnimation;
        private Texture[] moveAnimation;
        private Texture[] fightAnimation;
        private Texture[] talkAnimation;
        private SpriteBatch batch = new SpriteBatch();
        
        
        private float width, height;
        private float x, y;
        
        private Sound spawnSound, touchSound, deathSound, objSound, moveSound, fightSound;
        
        public GameObject(Texture txtr, float width, float height, float x, float y) {
            this.texture = txtr;
            this.width = width;
            this.height = height;
            this.x = x;
            this.y = y;
        }
        
        //this method checks wether our game object is over an other object
        public boolean isOver(GameObject obj){
            if(((this.x >= obj.x) && (this.x <= (obj.x + obj.width))) && ((this.y >= obj.y) && (this.y <= (obj.y + obj.height))))
                return true;
            return false;
        }
        
        //this method sets the object bounds
        public void setBounds(float width, float height, float x, float y){
            this.width = width;
            this.height = height;
            this.x = x;
            this.y = y;
        }
        
        //this method draws the object
        public void draw(){
            batch.draw(this.texture, this.width, this.height, this.x, this.y);
        }
        
        //animation setting section
        public void setSpawnAnimation(Texture[] texture){
            this.spawnAnimation = texture;
        }
        
        public void setDeathAnimation(Texture[] texture){
            this.deathAnimation = texture;
        }
        
        public void setDamageAnimation(Texture[] texture){
            this.damageAnimation = texture;
        }
        
        public void setMoveAnimation(Texture[] texture){
            this.moveAnimation = texture;
        }
        
        public void setFightAnimation(Texture[] texture){
            this.fightAnimation = texture;
        }
        
        public void setTalkAnimation(Texture[] texture){
            this.talkAnimation = texture;
        }
        
        //sounds setting section
        public void setSpawnSound(Sound sound){
            this.spawnSound = sound;
        }
        
        public void setTouchSound(Sound sound){
            this.touchSound = sound;
        }
        
        public void setDeathSound(Sound sound){
            this.deathSound = sound;
        }
        
        public void setObjSound(Sound sound){
            this.objSound = sound;
        }
        
        public void setMoveSound(Sound sound){
            this.moveSound = sound;
        }
        
        public void setFightSound(Sound sound){
            this.fightSound = sound;
        }
        
        //animation and behavior section
        public void spawn(){
            batch.begin();
            for(int i=0;i<=this.spawnAnimation.length;i++){
                this.texture = this.spawnAnimation[i];
                this.draw();
                try
                {
                    Thread.sleep(0, 1);
                }
                catch (InterruptedException e)
                {}
            }
            batch.end();
        }
        
        public void die(Texture[] deathTexture){
            
        }
    }
}

I went to the other file, in the other class, and I tried to set the object texture

public class MyGdxGame implements ApplicationListener{

    Texture texture;
    SpriteBatch batch;
    classes.GameObject gun;
    @Override
    public void create()
    {
        batch = new SpriteBatch();
        gun = new classes.GameObject(new Texture(Gdx.files.internal("gun.png")), 0, 0, 300, 300);
    }

    @Override
    public void render()
    {        
        Gdx.gl.glClearColor(1, 1, 1, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        batch.begin();
        batch.end();
    }

    @Override
    public void dispose()
    {
    }

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

    @Override
    public void pause()
    {
    }

    @Override
    public void resume()
    {
    }
}

once I try to access it. I face this error: aan instance for an enclosing class is required

note: I’m making this game for android. using AIDE ide which offers developing apps and games directly on your phone.

Solution

Inner classes that are declared without the keyword static are tethered to the outer class they exist in.

To fix

    public static class GameObject{

Why would you want an inner class without static? Here’s an example

public class Game {
  private Data gameData;

  class MyListener {
    public void receiveNewData(Data newData) {
      //update gameData with the new data
    }
  }
}

If MyListener was static, it would not be able to access Game’s gameData

Answered By – ControlAltDel

Answer Checked By – Pedro (FlutterFixes Volunteer)

Leave a Reply

Your email address will not be published. Required fields are marked *