在我的玩家类中,玩家的位置矢量一直在添加到类的速度矢量。我也有一个oldPosition Vector,看看玩家是否已经移动。我在游戏过程中使用了2d布尔数组进行碰撞。
这是Player类。
public Player(){
this.velocity = new Vector2();
this.position = new Vector2(MapGrid.MAP_WIDTH / 2, MapGrid.MAP_HEIGHT + 200);
this.oldPosition = position;
this.gridPosition = new Vector2((int)(this.position.x / MapGrid.CELL_SIZE), (int)(this.position.y / MapGrid.CELL_SIZE));
}
public void create(){
this.canFall = true;
}
public void update(){
velocity.x += MainScreen.GRAVITY.x;
System.out.println("Grid calc x- " + (int)(this.position.x / MapGrid.CELL_SIZE));
System.out.println("Grid calc y- " + (int)(this.position.y / MapGrid.CELL_SIZE));
System.out.println("position top x- " + this.position.x);
System.out.println("position top y- " + this.position.y);
this.gridPosition.x = (int)(this.position.x / MapGrid.CELL_SIZE);
this.gridPosition.y = (int)(this.position.y / MapGrid.CELL_SIZE);
oldPosition.x = getGridPosition().x;
oldPosition.y = getGridPosition().y;
position.x += velocity.x;
position.y += velocity.y;
if(oldPosition.x == getGridPosition().x || oldPosition.y == getGridPosition().y){
hasMoved = false;
}
else{
hasMoved = true;
}
if(!canFall){
velocity.y = 0;
}else
velocity.y += MainScreen.GRAVITY.y;
if(Gdx.input.isKeyPressed(Keys.A)){
velocity.x -= 10 * Gdx.graphics.getDeltaTime();
}
else if(Gdx.input.isKeyPressed(Keys.D)){
velocity.x += 10 * Gdx.graphics.getDeltaTime();
}else
velocity.x = 0;
System.out.println("position after input x- " + this.position.x);
System.out.println("position after input y- " + this.position.y);
}
这是MapGrid类。 CELL_SIZE = 50
public void create(){
for(int x = 0; x < mapGrid.length; x++){
for(int y = 0; y < mapGrid[x].length; y++){
mapGrid[x][y] = false;
}
}
}
public void addToMap(Collidables object){
objectList.add(object);
}
public void update(){
for(int l = 0; l < objectList.size(); l++){
mapGrid[(int) objectList.get(l).getGridPosition().x][(int) objectList.get(l).getGridPosition().y] = true;
if(objectList.get(l).hasMoved()){
mapGrid[(int) objectList.get(l).getOldGridPosition().x][(int) objectList.get(l).getOldGridPosition().y] = false;
}
if(!objectList.get(l).isAlive()){
mapGrid[(int) objectList.get(l).getGridPosition().x][(int) objectList.get(l).getGridPosition().y] = false;
objectList.get(l).destroy();
}
}
}
最后是碰撞处理程序类
private Entity entity;
private MapGrid mapGrid;
public CollisionHandler(MapGrid mapGrid, Entity entity){
this.entity = entity;
this.mapGrid = mapGrid;
}
public void update(){
}
@Override
public void run() {
if(mapGrid.getGrid()[(int) (entity.getGridPosition().x + 1)][(int) entity.getGridPosition().y]){
entity.setCanMoveRight(false);
}else
entity.setCanMoveRight(true);
System.out.println("X: " + (int) (entity.getGridPosition().x - 1));
System.out.println("Y: " + (int) (entity.getGridPosition().y));
/*=============================*/
/*ONE LINE UNDER IS WHERE THE */
/*=========ERROR LIES!=========*/
/*=============================*/
if(mapGrid.getGrid()[(int) (entity.getGridPosition().x - 1)][(int) entity.getGridPosition().y]){
entity.setCanMoveLeft(false);
}else
entity.setCanMoveLeft(true);
if(mapGrid.getGrid()[(int) (entity.getGridPosition().x)][(int) entity.getGridPosition().y - 1]){
entity.setCanFall(false);
}else
entity.setCanFall(true);
}
当我运行游戏时,游戏显示几秒钟,然后崩溃并显示以下错误报告。
前两行(网格计算)计算玩家在网格中的位置,即玩家位置/网格的单元格大小。 控制台的后两行(位置顶部)是玩家在屏幕上的位置。 第三行(输入后的位置)与正常位置的日志相同,但是在输入后我将其打印在更新方法的底部。 最后,第四条2行是从碰撞处理程序运行方法中打印出来的。
我似乎无法找到为什么玩家网格坐标似乎在不断发生分裂时实际上并没有发生。网格坐标基于玩家位置除以单元格大小(50),然后玩家网格坐标被发送到-1,这当然是导致错误的原因。我到处寻找,真的需要帮助。