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

时间:2014-08-21 19:21:29

标签: java object inheritance nullpointerexception libgdx

我在网上看过,有些事情有所帮助,但我还没有把这件事搞定。我正在制作一个简单的乒乓球比赛,但我想要它,所以我的所有代码都很好。所以我有一个类为player1球拍,电脑球拍,球,主屏幕和播放屏幕。 因此,例如,我的player1Paddle类将拥有该拨片的所有移动,计算机拨片类(播放器2)将具有该操作的所有移动,依此类推。 但是当谈到编码电脑桨的简单AI(基本上从左到右跟随球)时,我无法进入球位置

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

它带来了错误。现在我已经实例化了球类并且它有效但我基本上已经制造了另一个球,但运动并不存在。以下是尝试和帮助的部分代码。我知道有很多代码,可能还有一些不需要的代码。 在我的playScreen上,我调用了player2movement -

player2Pong.Player2Movement();

继承了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);            
    }

以下是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();
        }

    }

正如我之前所说的那样有点长,但我想要做的就是在玩家2类中调整AI的运动,球类在球类中的运动以及玩家在玩家类中的运动和然后在playcreen类中调用render或show方法中的方法。随意问任何问题。我知道这是一个简单的答案,但我是新的:(必须从某个地方开始

1 个答案:

答案 0 :(得分:1)

好吧,所以,我可能错了,但值得一试。

首先,每次调用Player2pong函数时都不需要创建新的PlayerMovement()对象,你已经有了一个:P

其次,您永远不会为player2Pong属性分配任何内容。因此,当您尝试在其上调用draw()时,没有任何内容可以调用它!:P

相关问题