检查网格中单击了哪个图块的正确方法是什么?

时间:2017-06-24 12:56:47

标签: java libgdx

目前我们以这种方式处理点击:

@Override
        public boolean touchDown(int x, int y, int pointer, int button) {

            Vector3 v = new Vector3(x, y, 0);
            camera.unproject(v);
            if (button == Input.Buttons.LEFT) {
                // er word geloopt door alle tiles in de map
                //een for loop om alle rijen te krijgen
                for (int row = 0; row < Basemap.getTiles().length; row++) {
                    //een for loop om alle tiles in de rij te krijgen
                    for (int col = 0; col < Basemap.getTiles()[row].length; col++) {
                        //er wordt een tile opgehaald op de rij en colom waar we doorheen loopen
                        Tile baseTile = Basemap.getTiles()[row][col];
                        Tile heroTile = Heromap.getTiles()[row][col];
                        Tile rangeTile = Rangemap.getTiles()[row][col];

                        if (baseTile.getBoundingBox().contains(v)) {
                            System.out.println(baseTile.getX() + " " + baseTile.getY());

                            // als er geklikt word word setclicked op true gezet
                            if (!baseTile.getClicked()) {
                                baseTile.setClicked(true);
                                heroTile.setClicked(true);
                                rangeTile.setClicked(true);

                            // er wordt gecheckt of er een held wordt aangedrukt terwijl een andere held geselecteerd is
                                if (SelectedHero != null && heroTile.getHero() != null) {
                                    //als de 2e aangedrukte held een enemy is wordt hij aangevallen
                                    if (!SelectedHero.isEnemy() && heroTile.getHero().isEnemy() && heroTile.getHero() != null && rangeTile.getColor() == Color.RED ||
                                            !SelectedHero.isEnemy() && heroTile.getHero().isEnemy() && heroTile.getHero() != null && rangeTile.getColor() == Color.PURPLE) {
                                        if (rangeTile.getColor() == Color.RED) {
                                            SelectedHero.attack(heroTile.getHero(), Heromap);
                                            Attack = Gdx.audio.newSound(Gdx.files.internal("Attack.mp3"));
                                            Attack.play();
                                            SelectedHero.setMoved(true);
                                        } else if (rangeTile.getColor() == Color.PURPLE) {
                                            SelectedHero.specialAttack(heroTile.getHero(), Heromap);
                                            Attack = Gdx.audio.newSound(Gdx.files.internal("Attack.mp3"));
                                            Attack.play();
                                            SelectedHero.setMoved(true);
                                        }

这只是touchDown方法的一小部分。我们的策略游戏的算法是由我的项目组的同学制作的。当我看到这段代码时,我认为它既不是正确的方法也不好。这背后的原因是我认为循环遍历网格中的所有图块以检查鼠标点击发生时是否被点击是不是很有效?或者我错了?

另外,在为某些目的进行调试时,有时候很难找到问题,当屏幕上绘制精灵时出现奇怪的事情。游戏逻辑现在位于touchDown事件中,我感觉不太好。

但是,我不知道如何以不同的方式做到这一点。你们可以把我放在正确的方向,还是这种代码恰到好处?

有没有办法在游戏对象类本身处理点击事件,以便游戏逻辑可以在该类而不是touchDown事件中完成?

提前谢谢,迈克

2 个答案:

答案 0 :(得分:0)

只需获取点击位置的x和y,然后检查地图上对应的瓷砖帽子。

If(Gdx.input.getX() == tileX) {
    do stuff

}

对y轴也一样。

是的,如果你不需要,循环遍历所有的瓷砖效率很低。

答案 1 :(得分:0)

首先,开始用英语写评论。

其次,假设这是一个常规网格,为什么不简单地使用以下内容?

int i = (x - gridOffsetX) / tileWidth;
int j = (y - gridOffsetY) / tileHeight;

- &GT;单击索引i,j处的图块。 (对于gridOffset是网格左上角的坐标)

另一件事,如果你有几十个循环和条件,那么是时候拆分代码了。您可以尽可能地将您可以命名的所有内容都添加到方法中。无论如何,显示攻击和武器声音显然不应该是找到瓦片的方法的一部分。