简体   繁体   English

我如何从另一个类访问对象变量?

[英]How do I gain access to an objects variable from another class?

I have looked around online and some things have helped but I am still yet to get this thing working. 我已经在网上四处张望,有些事情有所帮助,但我仍然无法使它正常工作。 I am making a simple pong game but I want it so all my code is well set out. 我正在制作一个简单的乒乓球游戏,但我想要它,因此我的所有代码都已确定。 So I have a class for the player1 paddle, the computer paddle, the ball, the main screen and also the play screen. 所以我有一个关于player1球拍,计算机球拍,球,主屏幕以及比赛屏幕的课程。 So, for example, my player1Paddle class will have all the movement for that paddle, the computer paddle class(player2) will have all the movement for that and so on. 因此,例如,我的player1Paddle类将具有该板块的所有移动,而计算机桨叶类(player2)将具有该板的所有移动,依此类推。 But when it comes to coding the simple AI of the computer paddle (basically follow the ball left to right) I am unable to get access to the balls position 但是,在编码计算机键盘的简单AI时(基本上从左到右跟随球),我无法进入球的位置

if(player2Pong.position.x > ballPong.position.x)

It brings an error. 它带来一个错误。 Now i have instantiated the ball class and it works but I have basically made another ball but the movement is not there. 现在,我已经实例化了球类,并且它起作用了,但是我基本上制作了另一个球,但是运动不存在。 Here are parts of the code to try and help. 这是部分代码,可以尝试并提供帮助。 I know there's a lot of code, and probably some un-needed. 我知道有很多代码,可能还不需要。 On my playScreen i call player2movement - 在我的playScreen屏幕上,我称player2movement-

player2Pong.Player2Movement();

Heres the majority of the player2pong class. 这是大多数player2pong类的人。

 public class Player2Pong {
    public Vector2 position;    
    String textureLoc;
    Texture Player2Texture; 
    float stateTime;    
    Rectangle player2Bounds;    
    String movement;    
    int speed = 2;
    int playerXVector = 5;
    SpriteBatch batch;

    //PlayerPong playerpong;
    Player2Pong player2pong;

    Ball ballPong;

    public int paddle_player2_Width = 80;
    public int paddle_player2_Height = 10;

    //PlayerPong player;

    public Player2Pong(Vector2 position, Ball ball){

        Player2Texture = new Texture(Gdx.files.internal(("paddle_player2.png")));
        this.position = position;       

        player2Bounds = new Rectangle(position.x,position.y,paddle_player2_Width, paddle_player2_Height);
        //this.player2pong = player2pong;   
        this.ballPong = ball;

    }

    public void update(){       

    }

public void Player2Movement(){  

    player2pong = new Player2Pong(new Vector2(Gdx.graphics.getWidth() / 2, Gdx.graphics.getHeight() - (Gdx.graphics.getHeight()/8)), ballPong); 

        System.out.println(player2pong.position.x);              

        if(player2pong.position.x > ballPong.getPosition().x){
            System.out.println("right");
            player2pong.position.x -= playerXVector;
        }

         else  if(player2pong.position.x < ballPong.getPosition().x){
            System.out.println("right");
            player2pong.position.x += playerXVector;
        }

         if(player2pong.position.x > Gdx.graphics.getWidth() - player2pong.getPaddle_player2_Width()-5){
             player2pong.position.x -= playerXVector;
         }

         if(player2pong.getPosition().x < 3){
             player2pong.position.x += playerXVector;
         }       

    }


public void draw(SpriteBatch batch){

        batch.draw(Player2Texture, position.x, position.y, paddle_player2_Width, paddle_player2_Height);            
    }

Here is majority of the playScreen class 这是大部分playScreen类

  public class PlayScreenPong implements Screen{

    private static final Color WHITE = null;
    SpriteBatch batch;

    PlayerPong playerPong; 
    Player2Pong player2Pong;

    InputProcessor inputProcessor;  
    Game game;
    Ball ballPong;
    Texture paddle_player1, paddle_player2; 
    ArrayList<Ball> balls;  
    ArrayList<Player2Pong> player2;

    Iterator<Ball> ballsIterator;   
    Vector2 position;   
    ShapeRenderer borderSR, ballSR; 
    Sound sound;
    boolean rectangles = true;
    Stage PlayScreenStage;
    Label label;
    LabelStyle style;
    BitmapFont font;

    int playerXVector = 10;

    int player1Score = 0;
    int player2Score = 0;

    public PlayScreenPong(Game game){
        this.game = game;

    }

    @Override
    public void render(float delta) {
        Gdx.gl.glClearColor(0,0,0,0);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);       

        playerPong.update();
        //player2Pong.update();

        borderSR.begin(ShapeType.Line);
        borderSR.rect(1, 1, Gdx.graphics.getWidth()-5, Gdx.graphics.getHeight()-4);
        borderSR.setColor(1,1,1,1);
        borderSR.end();
        batch.begin();

        ballsIterator = balls.iterator();
        while(ballsIterator.hasNext()){
            Ball cur = ballsIterator.next();    
            cur.update();
            cur.draw(batch);            
        }       
        batch.draw(playerPong.getPlayerTexture(), playerPong.getPosition().x, playerPong.getPosition().y, playerPong.paddle_player1_Width, playerPong.paddle_player1_Height);   
        player2Pong.draw(batch);

        //batch.draw(player2Pong.getPlayer2Texture(), player2Pong.getPosition().x, player2Pong.getPosition().y, player2Pong.paddle_player2_Width, player2Pong.paddle_player2_Height);
        batch.end();
        score();


        PlayScreenStage.act();
        PlayScreenStage.draw();

        if(rectangles == true){
            ballPong.drawRectangle();
        }       
        player2Pong.Player2Movement();

    }

    @Override
    public void show() {

        batch = new SpriteBatch();
        paddle_player1 = new Texture(Gdx.files.internal("paddle_player1.png"));
        paddle_player2 = new Texture(Gdx.files.internal("paddle_player2.png"));
        borderSR = new ShapeRenderer();     

        balls = new ArrayList<Ball>();
        player2 = new ArrayList<Player2Pong>();

        if(Gdx.files.local("paddle_player1.dat").exists()){
            try {
                playerPong = new PlayerPong(new Vector2(Gdx.graphics.getWidth() / 2, Gdx.graphics.getHeight() / 8), "paddle_player1.png");
                playerPong.setPosition(PlayerPong.readPlayer());
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.out.println("File exists, reading file");

        }else{
            playerPong = new PlayerPong(new Vector2(Gdx.graphics.getWidth() / 2, Gdx.graphics.getHeight() / 8),"paddle_player1.png");
            try {
                PlayerPong.savePlayer(playerPong);
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.out.println("Player doesnt exist, creating and saving player");                      
        }

//      player2Pong = new Player2Pong(new Vector2(Gdx.graphics.getWidth() / 2, Gdx.graphics.getHeight() - (Gdx.graphics.getHeight()/8)), playerPong);
//      player2.add(player2Pong);

        ballPong = new Ball(new Vector2(Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2), playerPong);
        balls.add(ballPong);        
    }

    public void score(){        

        PlayScreenStage = new Stage();
        font = new BitmapFont(Gdx.files.internal("font.fnt"), false);
        style = new LabelStyle(font, Color.WHITE);
        label = new Label("Player 1: " + player1Score + "  :  " + player2Score + " :Player 2", style);
        label.setPosition(Gdx.graphics.getWidth()/2 - label.getWidth()/2, Gdx.graphics.getHeight()/25);
        label.setFontScale((float) 0.8);

        PlayScreenStage.addActor(label);
        Gdx.input.setInputProcessor(PlayScreenStage);
        batch = new SpriteBatch();  
        //System.out.println(ballPong.getPosition().y);

        //-------------------------------------if someone scores
        if(ballPong.getPosition().y< 1){
            player2Score = player2Score +1;
            //oppositionScore +=1;
            System.out.println("goal");
            //ballPong.reset();
        }

        if(ballPong.getPosition().y > Gdx.graphics.getHeight()-1 -ballPong.getBallSizeY()){
            player1Score = player1Score + 1;
            //ballPong.reset();
        }

    }

As I said before its a bit long winded but all I want to do is sort the movement of the AI in the player2pong class, the movement of the ball in the ball class and the movement of the player in the player class and then call the methods in the render or show methods in the playscreen class. 就像我之前说的那样,它有点长了,但是我要做的是对AI在player2pong类中的移动,在ball类中的球的移动以及在player类中的球员的移动进行排序,然后调用渲染方法中的方法或播放屏幕类中的显示方法。 Feel free to ask any questions. 随意问任何问题。 I know its an easy answer but im new :( Got to start somewhere 我知道这是一个简单的答案,但我是新手:(开始在某个地方

Okay, so, I might be wrong with this, but it's worth a shot. 好的,所以,我可能对此有误,但是值得一试。

First off, you don't need to create a new Player2pong object every time you call the PlayerMovement() function, you already have one:P 首先,您不需要每次调用PlayerMovement()函数时都创建一个新的Player2pong对象,您已经有了一个:P

Secondly, you never make assign anything to the player2Pong attribute. 其次,您永远都不player2Pong属性分配任何东西。 So when you try and call draw() on it, there's nothing to call it on!:P 因此,当您尝试在其上调用draw()时,没有任何东西可以调用它!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM