Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 总是发生碰撞_Java_Collision - Fatal编程技术网

Java 总是发生碰撞

Java 总是发生碰撞,java,collision,Java,Collision,我创建了一个tilemap和一个播放器(现在只是一个曲线)。我将瓷砖贴图和播放器放在屏幕上,但播放器位于左上角,并且总是卡在瓷砖中。我不知道如何: 把它从角落里拿出来 阻止碰撞的发生,因为它是非阻塞块 在编写代码之前,您需要了解以下几点: tilesheet是一张有不同瓷砖的纸,它会 [未阻止,未阻止] [封锁,封锁] 这是我的对象超类的碰撞部分(我知道它看起来很像,但在开始之后,你可以得到漂移): 如果您还需要什么,请告诉我,我会给您。在calculateCorners中发生的事情(以及该方法

我创建了一个tilemap和一个播放器(现在只是一个曲线)。我将瓷砖贴图和播放器放在屏幕上,但播放器位于左上角,并且总是卡在瓷砖中。我不知道如何:

  • 把它从角落里拿出来
  • 阻止碰撞的发生,因为它是非阻塞块
  • 在编写代码之前,您需要了解以下几点:

    tilesheet是一张有不同瓷砖的纸,它会

    [未阻止,未阻止]
    [封锁,封锁]

    这是我的对象超类的碰撞部分(我知道它看起来很像,但在开始之后,你可以得到漂移):


    如果您还需要什么,请告诉我,我会给您。

    calculateCorners
    中发生的事情(以及该方法操作的变量)也可能与此相关。@MickMemonic好的,添加了它。您可能需要调用重新绘制或在某处验证,手动调整窗口大小以强制重新绘制,并查看播放器是否移动。
    public void calculateCorners(double x, double y) {
    
            int leftTile = (int)(x - cwidth / 2) / tileSize;
            int rightTile = (int)(x + cwidth / 2 - 1) / tileSize;
            int topTile = (int)(y - cheight / 2) / tileSize;
            int bottomTile = (int)(y + cheight / 2) / tileSize;
    
            int tl = tileMap.getType(topTile, leftTile);
            int tr = tileMap.getType(topTile, rightTile);
            int bl = tileMap.getType(bottomTile, leftTile);
            int br = tileMap.getType(bottomTile, rightTile);
    
            topLeft = tl == Tile.BLOCKED;
            topRight = tr == Tile.BLOCKED;
            bottomLeft = bl == Tile.BLOCKED;
            bottomRight = br == Tile.BLOCKED;
    
    
        }
    public void checkTileMapCollision() {
        currCol = (int) x / tileSize;
        currRow = (int) y / tileSize;
        x += velX;
        y += velY;
        calculateCorners(x, ydest);
    
        if (velY < 0) {
            if (topLeft || topRight) {
                velY = 0;
                y = currRow * tileSize + cheight / 2;
                System.out.println("Collision");
            } else {
                y += velY;
            }
        }
    
    
        if (velY > 0) {
            if (bottomLeft || bottomRight) {
                velY = 0;
                falling = false;
                y = (currRow + 1) * tileSize - cheight / 2;
                System.out.println("Collision");
            } else {
                y += velY;
            }
        }
    
        calculateCorners(xdest, y);
    
        if (velX < 0) {
            if (topLeft || bottomLeft) {
                velX = 0;
                System.out.println("Collision");
                x = currCol * tileSize + cwidth / 2;
            } else {
                x += velX;
            }
        }
    
        if (velX > 0) {
            if (topRight || bottomRight) {
                velX = 0;
                System.out.println("Collision");
                x = (currCol + 1) * tileSize - cwidth / 2;
                System.out.println("Collision");
            } else {
                x += velX;
            }
        }
    }
    
    public void update() {
        System.out.println("update");
        getNextPosition();
        checkTileMapCollision();
        setPosition((int) xtemp, (int) ytemp);
    }
    
    public void setLeft(boolean b) {
        left = b;
    }
    
    public void setRight(boolean b) {
        right = b;
    }
    
    public void getNextPosition() {
        if (left) {
            velX = -2;
            System.out.println("Left");
        } else if (right) {
            velX = 2;
            System.out.println("Right");
        }
    }
    
    public void draw(Graphics2D g) {
        x += velX;
        y += velY;
        g.drawImage(spriteSheet, (int) x, (int) y, null);
    }
    
    public void setPosition(int x, int y) {
        this.x = x;
        this.y = y;
    }
    
    public void setVel(int velX, int velY) {
        this.velX = velX;
        this.velY = velY;
    }