【问题标题】:Java diamond-shape isometric map tile pick [closed]Java菱形等距地图瓷砖拾取[关闭]
【发布时间】:2014-10-31 14:41:09
【问题描述】:

我正在用 Java 编写一个等距游戏,但是当我想获得鼠标指向的瓷砖时,我卡住了。

有办法计算吗?

这里是渲染代码

int posX = 10;
int posY = 0;      
static int beginY = 500-72;
static int beginX = 800-36;
static int newLineY = 60;
static int newLineX = 200;    

posY = ((0+1)*9)-9+beginY/2;
posX = ((beginX)/2)+18-(18*(0+1));

for (int y = 0; y <= world.length-1; y++) {
    for (int x = 0; x <= world[y].length-1; x++) {
        if (world[y][x] == 1) {
            g.drawImage(grass, posX, posY, null);
            posX += 18;
            posY += 9;
        } else if (world[y][x] == 2) {
            g.drawImage(wall, posX, posY-38, null);
            posX += 18;
            posY += 9;
        } else if (world[y][x] == 3) {
            g.drawImage(stone, posX, posY, null);
            posX += 18;
            posY += 9;
        } else if (world[y][x] == 4) {
            g.drawImage(water, posX, posY, null);
            posX += 18;
            posY += 9;
        } else {
            posX += 18;
            posY += 9;
        }
        if ((y-pPosX) * (y-pPosX) + (x-pPosY) * (x-pPosY) <= 3*3 && world[y][x] != 0 && world[y][x] != 2 && world[y][x] != 4) {
            g.drawImage(hollow, posX-18, posY-9, null);
        }
        if (y == selectedX && x == selectedY) {
            g.drawImage(selected, posX-18, posY-9, null);
        }
        if (world2[y][x] == 9) {
            g.drawImage(character, posX-18, posY-53, null);
        }
    }
    posY = ((y+1)*9)+beginY/2;
    posX = ((beginX)/2)-(18*(y+1));
}

这就是结果。 beginXbeginY 从菱形的顶角开始:

【问题讨论】:

  • 信息不够,请澄清。例如,您使用的是引擎、一些 openGL 实现还是基于摇摆的 GUI(使用 Canvas)?如果您可以添加一些代码,那将是最好的。你如何加载瓷砖?是图像还是直接绘制?
  • 我不使用任何引擎,也不使用OpenGL,只使用JFrame。
  • 我创建一个缓冲图像,然后定义它的路径。我插入代码。

标签: java cursor mouse isometric


【解决方案1】:

首先将 MouseListener 注册到您的面板(您要在其中绘制图块的面板)。 现在,根据您的渲染代码,您实际上“知道”每个图块从哪里开始。因此,您所要做的就是计算点击了哪个图块。

JPanel gamePanel = new JPanel();
gamePanel.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent event) {
        int x=event.getX();
        int y=event.getY();
        System.out.println("clicked at ("+x+","+y+")");  //these co-ords are relative to the your gamePanel           
    }
});

编辑:

我改成上面的代码,不正确。但我相信你会弄清楚的。因此,上面的代码向您展示了如何将MouseListener 添加到您的面板/框架中。如果它有效,您应该能够在您单击的控制台中看到。

现在您只需计算点击了哪个图块:

(x,y) --> + - - - 
          '    /\
          '  /    \
          '/        \
           \        /
             \    /
               \/     + <-- (x+36, y+18)

您的鼠标指针需要位于(x,y)(x+36, y+18) 两点之间。 当然还有一个额外的问题是有人可以点击 (x,y) 和 (y+36, y+18) 之间的某个位置,但仍然没有点击磁贴(也许有人点击了左上角的磁贴)然后你可能需要决定要选择哪个图块。

另一种方法是将您的面板划分为一个正方形面板。但当然没有画它们。想象一下,每个图块中间可以有一个正方形:

               /\
             /____\
           / |    | \
           \ |____| /
             \    /
               \/    

类似的东西。所以你只需要计算是否有人在广场内点击。

【讨论】:

  • 不,每个图块是 36 像素宽和 18 像素高,因为它是等距的,所以所有图块都是菱形的。这是一张照片:i.stack.imgur.com/mRul8.png
  • 这是我的项目:imgur.com/zfUi1eH,beginX 和 beginY 靠近菱形的顶角。
  • @Bálint,我编辑了您的问题并添加了您发布的代码并包含了图像。如果您想为您的问题添加信息,请使用帖子上的编辑按钮。现在到你的问题:(顺便说一句,不错的游戏)我的意思是,你计算你的瓷砖的位置,所以你计算它的同样方式,你可以实际计算你的鼠标点击哪个瓷砖。
  • 谢谢,我唯一的想法是用矩阵计算。
  • 对不起,我看到你的评论太晚了。好吧,这听起来确实是个好主意。我现在不知道从哪里开始 :) 并坚持简单的 backwards-calculating 方法。另一种方法是您创建自己的类Tile,并在创建游戏时,用您的图块填充数组并设置每个图块的 x 和 y 位置。因此,当用户单击时,您会遍历数组并测试 mouseX&gt;tile.getX()mouseX&lt;(tile.getX()+tile.getWidth())... 是否像这样。
【解决方案2】:

这里是渲染代码

int posX = 10;
int posY = 0;      
static int beginY = 500-72;
static int beginX = 800-36;
static int newLineY = 60;
static int newLineX = 200;    

posY = ((0+1)*9)-9+beginY/2;
posX = ((beginX)/2)+18-(18*(0+1));
for (int y = 0; y <= world.length-1; y++) {
for (int x = 0; x <= world[y].length-1; x++) {
    if (world[y][x] == 1) {
        g.drawImage(grass, posX, posY, null);
        posX += 18;
        posY += 9;
    } else if (world[y][x] == 2) {
        g.drawImage(wall, posX, posY-38, null);
        posX += 18;
        posY += 9;
    } else if (world[y][x] == 3) {
        g.drawImage(stone, posX, posY, null);
        posX += 18;
        posY += 9;
    } else if (world[y][x] == 4) {
        g.drawImage(water, posX, posY, null);
        posX += 18;
        posY += 9;
    } else {
        posX += 18;
        posY += 9;
    }
    if ((y-pPosX) * (y-pPosX) + (x-pPosY) * (x-pPosY) <= 3*3 && world[y][x] != 0 && world[y][x] != 2 && world[y][x] != 4) {
        g.drawImage(hollow, posX-18, posY-9, null);
    }
    if (y == selectedX && x == selectedY) {
        g.drawImage(selected, posX-18, posY-9, null);
    }
    if (world2[y][x] == 9) {
        g.drawImage(character, posX-18, posY-53, null);
    }
}
posY = ((y+1)*9)+beginY/2;
posX = ((beginX)/2)-(18*(y+1));
}

【讨论】:

    猜你喜欢
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    相关资源
    最近更新 更多