java当我将一个参数传递给这个方法时,在这个方法中的任何代码执行之前,它被错误地除以我的一个常量

yqhsw0fo  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(328)

我有一个类,这是一个非常简单的游戏中的水平编辑器的2d游戏组成的平铺图像下精灵。我正在调试的代码的目的是根据用户单击的位置来更新stringbuffer中的char,以便更改在单击位置显示的tile。
正在修改的字符串缓冲区被程序用作一个Map,以标识应该在哪个图块上绘制哪些图像。缓冲区中使用的每个char值将表示一个tile,char的值决定在那里显示哪个图像。为此,我定义了一个常量整数(publicstaticfinalinttile\u size)为40。我的瓷砖都是正方形,大小为40×40像素,所以这个常量用来帮助计算任何需要根据图像的宽度和高度进行调整的内容。
问题是:每当用户单击屏幕时,传递给更新stringbuffer的方法的鼠标的x和y值在方法中的任何代码执行之前被除以40。
以下是相关代码:

private void modifyGeometry(int x, int y, char tile){
        //Levels are 20x20 grids
        int xIndex=x;//The value of the index we will read based on x
        int yIndex=y;//The value of the index we will read based on y

        if(x<21*TILE_SIZE && y<21*TILE_SIZE){//For safety reasons, check that the x and y aren't somehow greater than the screen

        xIndex=xIndex/TILE_SIZE;//Factor x down to which tile in the row it is on

        yIndex=yIndex/TILE_SIZE;//Factor y down to which tile in the column it is on

        if(xIndex>19){//We will need to reduce the value of x if its factor based on the TILE_SIZE is greater than 19 (a row is 0-19)
            int storetemp=xIndex/20;
            xIndex=xIndex-(20*storetemp);//Because xIndex is an int, xIndex/20*20 does not come out to xIndex, but instead only the first digit of xIndex (0-9)
        }

        if(y>19){
            int storetemp=yIndex/20;
            yIndex=yIndex-(20*storetemp);
        }
    }

    int index=xIndex+yIndex;
    this.geometry.setCharAt(index, tile);//This will set the character corresponding to the point the player clicked to the tile selected
    }

...

private class MouseInput extends MouseAdapter{
    public void mouseClicked(MouseEvent e){
        if(layer==0){
            modifyGeometry(e.getX(),e.getY(),currentTile);
        }

我在eclipse的调试器中使用了一些断点来确定e.getx()和e.gety()是否得到了正确的坐标(对此我几乎没有怀疑),但是在int xindex=x通过之前,x和y都被常数(40)除了。在传递的变量和接收它们的方法之间,没有调用我编写的方法。

bvuwiixz

bvuwiixz1#

我非常怀疑这里发生了什么神奇的事情。选项:
你的诊断是错误的
实际上,您没有运行您认为正在运行的代码,例如,由于构建已过时
如果您使用的是aop或其他修改字节码的东西,这可能会产生影响
我会添加一些日志记录,而不是依赖调试器。例如:

private class MouseInput extends MouseAdapter{
    public void mouseClicked(MouseEvent e){
        if(layer==0){
            int x = e.getX();
            int y = e.getY();
            log.info("About to modify geometry; x=" + x + "; y=" + y);
            modifyGeometry(x, y, currentTile);
        }
    }
}

以及:

private void modifyGeometry(int x, int y, char tile) {
    log.info("Within modifyGeometry; x=" + x + "; y="+ y);
    ...
}

我会惊讶地发现那些日志行显示不同的值。
我还要补充一点,关于进一步除以20的业务是非常混乱的,并建议实际上您应该能够大大简化您的设计。

xytpbqjk

xytpbqjk2#

从断点开始,查看modifygeometry的调用者,并追溯传入的x和y的派生。
如果你不知道怎么做。。。在debug视图中,您将看到一个树,其中包含看起来像堆栈跟踪的内容。原来显示的那一行下面的那一行给出了呼叫者的名字。单击该行,您将看到调用modifygeometry的行。variables视图将显示调用者中的变量。

相关问题