简体   繁体   中英

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. 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. 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

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 -

player2Pong.Player2Movement();

Heres the majority of the player2pong class.

 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

  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. 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

Secondly, you never make assign anything to the player2Pong attribute. So when you try and call draw() on it, there's nothing to call it on!:P

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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