Java:两个类中的相同方法,但是方法仅适用于一个类

时间:2018-01-30 04:21:54

标签: java variables methods

注释

一年后回顾这个问题,我认为这是一个很难问的问题,而且有点尴尬。我不确定是要删除这个问题还是改写它,希望如果他们发现自己在我的鞋子里,这可能会有所帮助。

尽管阅读了关于setter和getter的内容,但我对类,范围,依赖关系的实际工作方式缺乏基本的了解。当时提出这个问题对于我把这两个部分放在一起非常有帮助,因为这是朝着正确的方向发展。

已编辑的问题

我通过整理自己的项目来学习Java。我目前正在开发一款简单的游戏,但是,我遇到了让我完全陷入困境的事情。我确定答案很简单,但是,我无法弄清楚为什么会这样。

我有一个方法:

public void inertia () {
    y = speedY+y;
    x= speedX+x;
}

然而,在我尝试过的两个课程中,它的表现不同。

当在[仅]一个类中调用它时,变量y似乎没有改变[在另一个类中]。当在[just the]中调用它时(一个负责动画的类,该类中使用的局部变量)并且sprite像预期的那样落在屏幕上[但是,原始类不会更新]。我只是想知道造成这种行为的原因。

我包含了一个JLabel来查看另一个类中的变量,并且它没有改变。

期望的结果是相应的x和y值改变,以便精灵将围绕JPanel移动

这是我想来的课程:

    public class Mochi {

        private float x;
        private float y;
        private float speedX = 0;
        private float speedY = 3;
        private float gravity = 3;  
        boolean mRunR = true;


        public float getSpeedY(){
                return this.speedY;
        }

        public float getSpeedX() {
            return this.speedX;
        }

        public float getX() {
                return this.x;
            }
            public float getY() {
                return this.y;
            }
       // problem method below:
        public void inertia () {
            y = speedY+y;
            x= speedX+x;
        }

    }

在测试动画时,我在这个课程中写了它,发现它可以在这里工作:

public class Animation {
    Image ms = new ImageIcon("mochirs.png").getImage();
    Image mws = new ImageIcon("mochiws.png").getImage();

    Image currentSprite;

    int aniTime = 1;
    int sW = 21;
    int sH = 14;
    Mochi mochi = new Mochi();
    int x = (int) mochi.getX();
    int y = (int) mochi.getY();
    int speedY = (int) mochi.getSpeedY();
    int speedX = (int) mochi.getSpeedX();
    boolean mRunR = mochi.mRunR;

    public void inertia() {
        y = speedY+y;
        x = speedX+x;
    }


    public void draw (Graphics g) {
        Graphics2D g2 = (Graphics2D) g.create();
        g2.setClip(x, y, sW, sH);
        g2.drawImage(currentSprite, x, y, sW, sH, null);
    }

    public void setCurrentSprite (){
        if (mRunR == true) {
            if (aniTime <= 5) {
                currentSprite = mws;
                aniTime ++;
            }else if (aniTime <= 10) {
                currentSprite = ms;
                aniTime++;
            }else  {
                aniTime = 1;
            }
        }
    }           

}

以下是调用方法:

public class DogLogic extends JPanel {
    Animation animation = new Animation();
    Mochi mochi = new Mochi();
    int refreshRate = 30;


public DogLogic () {
    JPanel testPain = new JPanel();
    JLabel testLabel2= new JLabel (Integer.toString((int)mochi.getX()));
    JLabel tl3 = new JLabel (Integer.toString((int) mochi.getY()));
    JLabel tl4 = new JLabel (Integer.toString((int) mochi.getSpeedY()));
    testPain.add(testLabel2, BorderLayout.SOUTH);
    testPain.add(tl3);
    testPain.add(tl4);
    add (testPain);         
        gameStart();

    }

    public void gameStart() {
        Thread gameThread = new Thread() {
            public void run() {
                while (true) {
                    gameUpdate();
                    repaint();
                    try {
                        Thread.sleep(1000/refreshRate);
                    }catch (InterruptedException e) {
                        System.out.println("An error in gameThread has occured");
                    }
                }

            }
        }; 
        gameThread.start(); 
    }

    public void gameUpdate () {
        animation.setCurrentSprite();
        mochi.inertia(); 
        animation.intertia(); 
    }



        @Override
        public void paintComponent (Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g.create();
            animation.draw(g2);

            }

}

结论

我期待一个类自动地使用来自另一个类的变量,因为我当时不了解类,范围和依赖关系在Java中是如何工作的。

如果您发现自己有类似的问题,研究范围,依赖注入和基本的面向对象设计模式。

1 个答案:

答案 0 :(得分:1)

动画类有两个变量x和y,在调用animation.inertia()时会发生变化。

但是当您在DogLogic Class中调用mochi.inertia()时,属于Mochi类的x和y会发生变化。动画类x和y根本不会改变。

因此,当仅调用mochi.inertia()时,x和y在Animation类中保持不变。

在DogLogic Class中更新gameUpdate:

 public void gameUpdate () {
     animation.setCurrentSprite();
     mochi.inertia();
     animation.updateXY(this.mochi);
 }

在动画类中:

public void  updateXY( Mochi mochi){
    x = (int) mochi.getX();
    y = (int) mochi.getY();
}