Home > Software design >  Accessing to inner class in java
Accessing to inner class in java

Time:09-13

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.

CodePudding user response:

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

  • Related