【问题标题】:Java/Libgdx auto tileJava/Libgdx 自动平铺
【发布时间】:2016-04-12 21:56:03
【问题描述】:

我目前正在开发一个小游戏,因为我只有一些块作为墙,我真的很想实现自动平铺。但是怎么做呢?我还没有找到任何教程,只有一个游戏制作者,但不适用于 java :/

我已经尝试找到一个街区的邻居,而不是改变它的风格,但我想我还需要寻找角落邻居吗?是这样吗?

有人知道如何实现这样的机制吗? :)

----------编辑--------------

所以,我看了一下Ze Rubeus的wiki和一些教程,以为可以解决,但还有一个问题:

当一个块接触另一个块时它可以工作,但是一旦有四个块的块,它就不再起作用了。通常,当一个街区被一个左邻居包围时,一个右一个和一个下,也有一个左右底部的角落,而不是它应该绘制另一个图像,你可以在左右部分看到它。通过顺便说一句,值2是一堵墙。这是我所做的:

//------------------------------------------------------------------
                    //--------------------Checking for all sides------------------------
                    //------------------------------------------------------------------

                    // got an under neighbour
                    directions[2] = copyOfMap[((int) y)-1][(int) x] == 2; 

                    // got an upper neighbour
                    directions[0] = copyOfMap[((int) y)+1][(int) x] == 2;

                    // got an left neighbour
                    directions[1] = copyOfMap[((int) y)][(int) x-1] == 2;

                    // got an right neighbour
                    directions[3] = copyOfMap[((int) y)][(int) x+1] == 2;

                    //------------------------------------------------------------------
                    //--------------------Checking for corners--------------------------
                    //------------------------------------------------------------------


                    corners[0] = copyOfMap[y-1][x+1] == 2 ;

                    corners[2] = copyOfMap[y-1][x-1] == 2;

                    corners[3] = copyOfMap[y+1][x-1] == 2;

                    corners[1] = copyOfMap[y+1][x+1] == 2;





                    // Right
                    if(directions[3]){

                        if(directions[2]){

                            if(directions[1] && corners[1] && corners[3]){

                                region = game.manager.get("DuengonGainersAtlas/DuengonGainersAtlas",TextureAtlas.class).findRegion("Duengon-WallSet");
                                region.setRegion(32, 0, 32, 32);

                                wallLayer.add(region, (x*100)/Box2dVars.UNIT, (y*100)/Box2dVars.UNIT,100/Box2dVars.UNIT,100/Box2dVars.UNIT);


                            }
                            else{
                                region = game.manager.get("DuengonGainersAtlas/DuengonGainersAtlas",TextureAtlas.class).findRegion("Duengon-WallSet");
                                region.setRegion(0, 0, 32, 32);

                                wallLayer.add(region, (x*100)/Box2dVars.UNIT, (y*100)/Box2dVars.UNIT,100/Box2dVars.UNIT,100/Box2dVars.UNIT);
                            }

                        }
                        else if(directions[0]){

                            region = game.manager.get("DuengonGainersAtlas/DuengonGainersAtlas",TextureAtlas.class).findRegion("Duengon-WallSet");
                            region.setRegion(0, 64, 32, 32);

                            wallLayer.add(region, (x*100)/Box2dVars.UNIT, (y*100)/Box2dVars.UNIT,100/Box2dVars.UNIT,100/Box2dVars.UNIT);

                        }
                        else{

                            region = game.manager.get("DuengonGainersAtlas/DuengonGainersAtlas",TextureAtlas.class).findRegion("Duengon-WallSet");
                            region.setRegion(32, 0, 32, 32);

                            wallLayer.add(region, (x*100)/Box2dVars.UNIT, (y*100)/Box2dVars.UNIT,100/Box2dVars.UNIT,100/Box2dVars.UNIT);

                        }
                    }





                    // Left
                    else if(directions[1]){

                        if(directions[2]){

                            if(directions[3] && corners[1] && corners[3]){

                                region = game.manager.get("DuengonGainersAtlas/DuengonGainersAtlas",TextureAtlas.class).findRegion("Duengon-WallSet");
                                region.setRegion(32, 0, 32, 32);

                                wallLayer.add(region, (x*100)/Box2dVars.UNIT, (y*100)/Box2dVars.UNIT,100/Box2dVars.UNIT,100/Box2dVars.UNIT);


                            }   
                            else{
                                region = game.manager.get("DuengonGainersAtlas/DuengonGainersAtlas",TextureAtlas.class).findRegion("Duengon-WallSet");
                                region.setRegion(128, 0, 32, 32);

                                wallLayer.add(region, (x*100)/Box2dVars.UNIT, (y*100)/Box2dVars.UNIT,100/Box2dVars.UNIT,100/Box2dVars.UNIT);
                            }   

                        }
                        else if(directions[0]){

                            region = game.manager.get("DuengonGainersAtlas/DuengonGainersAtlas",TextureAtlas.class).findRegion("Duengon-WallSet");
                            region.setRegion(128, 32, 32, 32);

                            wallLayer.add(region, (x*100)/Box2dVars.UNIT, (y*100)/Box2dVars.UNIT,100/Box2dVars.UNIT,100/Box2dVars.UNIT);

                        }
                        else{
                            region = game.manager.get("DuengonGainersAtlas/DuengonGainersAtlas",TextureAtlas.class).findRegion("Duengon-WallSet");
                            region.setRegion(32, 0, 32, 32);

                            wallLayer.add(region, (x*100)/Box2dVars.UNIT, (y*100)/Box2dVars.UNIT,100/Box2dVars.UNIT,100/Box2dVars.UNIT);
                        }

                    }





                    // Up
                    else if(directions[0]){

                        if(corners[2]){

                            region = game.manager.get("DuengonGainersAtlas/DuengonGainersAtlas",TextureAtlas.class).findRegion("Duengon-WallSet");
                            region.setRegion(0, 32, 32, 32);

                            wallLayer.add(region, (x*100)/Box2dVars.UNIT, (y*100)/Box2dVars.UNIT,100/Box2dVars.UNIT,100/Box2dVars.UNIT);

                        }
                        else if(corners[3]){

                            region = game.manager.get("DuengonGainersAtlas/DuengonGainersAtlas",TextureAtlas.class).findRegion("Duengon-WallSet");
                            region.setRegion(0, 32, 32, 32);

                            wallLayer.add(region, (x*100)/Box2dVars.UNIT, (y*100)/Box2dVars.UNIT,100/Box2dVars.UNIT,100/Box2dVars.UNIT);

                        }
                        else{
                            region = game.manager.get("DuengonGainersAtlas/DuengonGainersAtlas",TextureAtlas.class).findRegion("Duengon-WallSet");
                            region.setRegion(0, 32, 32, 32);

                            wallLayer.add(region, (x*100)/Box2dVars.UNIT, (y*100)/Box2dVars.UNIT,100/Box2dVars.UNIT,100/Box2dVars.UNIT);
                        }

                    }





                    // Down
                    else if(directions[2]){


                        region = game.manager.get("DuengonGainersAtlas/DuengonGainersAtlas",TextureAtlas.class).findRegion("Duengon-WallSet");
                        region.setRegion(0, 32, 32, 32);

                        wallLayer.add(region, (x*100)/Box2dVars.UNIT, (y*100)/Box2dVars.UNIT,100/Box2dVars.UNIT,100/Box2dVars.UNIT);


                    }                       

写得很清楚,如果你能看一下就好了:) 忽略 wallLayer.add 和纹理的东西。

祝你有美好的一天^^

【问题讨论】:

  • 有一个名为 Minicraft 的游戏果酱游戏可以做到这一点,它是用 Java 编写的。您可以查看源代码以获得想法。
  • 谢谢你的回答 :) 已经做了,但是 Notch 做的有点太复杂了
  • 有人有想法吗?
  • 你说你写得很清楚,但你真的没有。每当您的方法变得超过 10 行代码时,您应该问自己一个问题“我可以将其中的某些部分放在单独的方法中吗?”。这可能会创建更多的代码行,但结构会更好。在您的情况下,如果操作正确,您可能会使用两种方法 checkDirection(...)checkCorner(...) 并简单地循环它们。
  • 好的,谢谢您的回复,我会尽快更改 :) 是的,我认为这是一个更好的主意,但这不能解决我的问题:/ 为什么没有教程?

标签: java algorithm sorting libgdx tiles


【解决方案1】:

Libgdx 没有自动为您生成图块的功能,相反,您必须实现自己的 owen 算法来执行此类操作。

我建议你阅读官方 WIKI 中的 this 部分,这里也提供了一个示例,提供了一个 programmatically generates tilemaphere 一个关于如何创建程序生成的教程可以在 LIBGDX 中实现的地牢洞穴系统。

【讨论】:

  • 感谢您的快速回答:) 我更新了我的答案,如果您能看一下我的代码,我会很高兴^^ –
猜你喜欢
  • 2014-10-23
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-24
  • 2016-07-08
  • 1970-01-01
相关资源
最近更新 更多