当前位置: 首页 > 知识库问答 >
问题:

LIBGDX:从另一个类调用矩形会导致NullPointerException吗?

耿炎彬
2023-03-14

PlayScreen类:

public class PlayScreen implements Screen {

private Player player;
private OrthographicCamera camera;
private OrthogonalTiledMapRenderer renderer;
private TiledMap map;
private Rectangle rightRectangle, leftRectangle, playerRectangle;


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

    renderer.render();

    renderer.getSpriteBatch().begin();
    player.draw(renderer.getSpriteBatch());
    renderer.getSpriteBatch().end();
}

@Override
public void resize(int width, int height) {
    camera.viewportWidth = width;
    camera.viewportHeight = height;
    camera.update();

}

@Override
public void show() {
    camera = new OrthographicCamera();
    map = new TiledMap();
    renderer = new OrthogonalTiledMapRenderer(map);

    player = new Player(new Sprite(new Texture("img/player.png")), playerRectangle);
    playerRectangle = player.rectangle;
    rightRectangle = new Rectangle(1280,0,0,720);
    leftRectangle = new Rectangle(0,0,0,720);


    boolean wallLeft = leftRectangle.overlaps(player.rectangle);
    boolean wallRight = rightRectangle.overlaps(player.rectangle);


    if(wallLeft){
        System.out.println("wallLeft Overlap");
        player.velocity.x = 0;
    }
    else if(wallRight){
        System.out.println("wallRight Overlap");
        player.velocity.x = 0;

    }

    player.setPosition(Gdx.graphics.getWidth()/2f - player.getWidth()/2f,Gdx.graphics.getHeight()/2f - player.getHeight()/2f - Gdx.graphics.getHeight()/5f);

}

@Override
public void hide() {
    dispose();
}

@Override
public void pause() {

}

@Override
public void resume() {

}

@Override
public void dispose() {
    map.dispose();
    player.getTexture().dispose();
    renderer.dispose();

}

}

玩家等级:

public class Player extends Sprite{

public Vector2 velocity = new Vector2();
private float speed = 500;
public Rectangle rectangle;


public Player(Sprite sprite, Rectangle rectangle){
    super(sprite);
    this.rectangle = rectangle;

}

public void draw(SpriteBatch spriteBatch){

    update(Gdx.graphics.getDeltaTime());
    super.draw(spriteBatch);
}

public void update(float delta) {

    rectangle = new Rectangle(getX() + velocity.x * delta,0,286,160);

    setX(getX() + velocity.x * delta);

}

}

所以,我正在使用矩形来检测我的碰撞。我已经设置了右矩形和左矩形作为我屏幕的边界线。我想给玩家分配一个精灵和一个矩形。我正在处理PlayScreen类中的碰撞,但它导致了NullPointerException。需要帮助来弄清楚为什么我得到了NullPointerException。

谢谢!

空指针异常:

Exception in thread "LWJGL Application" java.lang.NullPointerException
    at com.badlogic.gdx.math.Rectangle.overlaps(Rectangle.java:210)
    at net.dermetfan.asteroids.screens.PlayScreen.show(PlayScreen.java:62)
    at com.badlogic.gdx.Game.setScreen(Game.java:62)
    at net.dermetfan.asteroids.screens.MainMenu$1.clicked(MainMenu.java:75)
    at  
        com.badlogic.gdx.scenes.scene2d.utils.ClickListener.touchUp(ClickListener.java:82)
    at com.badlogic.gdx.scenes.scene2d.InputListener.handle(InputListener.java:57)
    at com.badlogic.gdx.scenes.scene2d.Stage.touchUp(Stage.java:329)
    at com.badlogic.gdx.backends.lwjgl.LwjglInput.processEvents(LwjglInput.java:297)
    at 
     com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:209)
    at    
       com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:114)

共有1个答案

东门奕
2023-03-14

问题出在你的playerRectangle。

player = new Player(new Sprite(new Texture("img/player.png")), playerRectangle); // playerRectangle not initialized!
playerRectangle = player.rectangle;
rightRectangle = new Rectangle(1280,0,0,720);
leftRectangle = new Rectangle(0,0,0,720);

试试这样的东西

    playerRectangle=new Rectangle(x,y,w,h);
 player = new Player(new Sprite(new Texture("img/player.png")), playerRectangle); 
    playerRectangle = player.rectangle; // i don't even think you should put this line is useless
     rightRectangle = new Rectangle(1280,0,0,720);
        leftRectangle = new Rectangle(0,0,0,720);

现在你不应该有任何错误。

或者最好在玩家类中这样做,在主类中不需要玩家矩形

    public Player(Sprite sprite){
    super(sprite);
    this.rectangle = sprite.getBoundingRectangle();

}

在你的班上

   player = new Player(new Sprite(new Texture("img/player.png")));        
         rightRectangle = new Rectangle(1280,0,0,720);
            leftRectangle = new Rectangle(0,0,0,720);
 类似资料:
  • 我正在创建一个简单的Java2D程序。它应该从另一个类中绘制矩形,但它不起作用。如果你们中有人能花点时间看看我哪里出了问题,我将不胜感激。这是我明天要交的最后一项作业。 以下是我迄今为止所编写的代码: Block.java 下面是主类: 非常感谢。

  • 问题内容: 创建哪一个将坐标从一个矩形映射到另一个矩形(给出浮动/双矩形)的最简单方法是什么? 更新1 矩形可以完全不同。例如[(0,0)-(1,1)]和[(150,-14)-(-1000,-14.1)]。并且转换应该统一转换。例如,矩形角应一一变换。例如,坐标(0,0)应该变成(150,-14)。 更新2 我需要对象,而不仅仅是计算。因为我想将其应用于对象。我也想以一些简单转换的串联形式。 更新

  • 我有一个服务类,它的方法doSomething()用@transactional进行了注释,传播类型为“required”。另一个非事务类调用了doSomething()两次。 我假设将有2个事务,为每个调用创建,但结果是两个调用只使用相同的事务。为了进一步混淆我,我使用另一个@RestController非事务性类调用了doThings()两次。但这次结果是每个调用使用不同的事务。 我有两个问题

  • 我正在重温LibGDX游戏编程,不幸的是,我不得不重新学习我以前知道的东西。 我目前正在使用平铺地图编辑器制作一个非常简单的大金刚风格关卡。我总共有大约20个矩形。 我在我的主要游戏屏幕类中创建了一个box2d世界,并有一个for循环来将矩形对象放入世界和调试器。 我的问题是,只有我绘制的底部(和第一个)矩形出现。我已经检查了比例,还放了一个println(),它告诉我已经解析了对象信息,所有的矩

  • 我想从class1调用class2,但是class2没有一个可以引用的主函数,比如

  • 在上面的图片中,我展示了两个矩形 矩形1,其x可以从-900到13700不等,Y可以从-600到6458 矩形2,其坐标X可以从0到3000变化,而y可以从0到2000变化 同样:矩形2的起点位于左上角位置(0,0),而矩形1的起点位于左上角位置(宽度/2,高度/2)。 我需要做的是:使用缩放或平移将矩形1的点转换为矩形2的点。 那么,为了将矩形1的坐标转换为矩形2的坐标,< code>x和< c