- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我现在有这段代码:
private void generateLevel() {
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
tiles[x + y * width] = random.nextInt(4);
}
}
}
允许此方法工作的原因:
public Tile getTile(int x, int y) {
if (x < 0 || y < 0 || x >= width || y >= height) return Tile.voidTile;
if (tiles[x + y * width] == 0) return Tile.grass;
if (tiles[x + y * width] == 1) return Tile.stone;
else return Tile.water;
//return Tile.voidTile;
}
返回这个结果:
我想要的是光滑、圆形的岛屿,到处都是随机的石头沉积物。 Perlin 噪声是否会为此过度杀伤力?我想我可以只生成一个图 block ,检查它旁边的图 block ID,如果相邻的图 block 属于同一类型,则将其放下。但这会创造出无穷无尽的同一 block 瓷砖。有帮助吗?
最佳答案
我要采取的第一步是从您域级别的任何内容创建对象:
public class Island {
private Point2D center = null;
private int radius = 0;
private List<Deposit> deposits = new ArrayList<Deposit>();
public Island(Point2D center, int radius) {
this.center = center;
this.radius = radius;
}
public void generateDeposits(int numDeposits) {
for (int i = 0; i < numDeposits; i++) {
// TODO: I leave it to you to find an x and y inside the island's
// boundary.
int x = getIntInsideCircle(center, radius);
int y = getIntInsideCircle(center, radius);
if (!depositInLocation(x, y)) {
deposits.add(new StoneDeposit(x, y));
} else {
i--; // TODO: This code could potentially go on forever,
// if we keep generating locations that have been used,
// but I'll leave this for you to handle.
}
}
}
}
public abstract class Deposit {
private Point2D location = null;
public Deposit(Point2D location) {
this.location = location;
}
}
public class StoneDeposit extends Deposit {
// TODO: You can fill this with StoneDeposit specifics.
}
现在我们有了代码,可以生成一个带有所有随机存款的岛屿。唯一剩下要做的就是实际放置这些岛屿。我将保持简单,只向 map 添加一个,但我相信您可以弄清楚如何添加多个(我会留下一些评论和我的想法):
public class Map {
private final int WIDTH = 1000;
private final int HEIGHT = 1000;
private List<Island> islands = new ArrayList<Island>();
public void generate() {
// TODO: If you want to make more, make a for loop.
int radius = 100;
Island island = new Island(new Point2D(WIDTH / 2, HEIGHT / 2), radius);
// TODO: If you are going to add more, then you can't simply add them
// all willy-nilly. You are going to have to check if the islands collide
// and, if they do, find a way to handle that.
// You could let them collide and create a mountain range where they do, or,
// you could try to place the next island in a different position (similar
// to what we used above placing deposits, but both situations require
// code a bit better than what I've included).
islands.add(island);
}
}
好的,现在我们已经获得了所需的所有数据。这将我们带到了使用磁贴实际将其绘制到屏幕上的最后一点。我对这个主题不太熟悉,所以这可能效率低下,但它应该作为一个起点。
我概括了一些函数(例如 drawTile(int x, int y, TileType type),因为我不知道您是如何将图 block 绘制到屏幕上的)。
// Generate our data.
Map map = new Map();
map.generate();
// Draw to the screen.
// 1. Fill the entire screen with water.
for (int y = 0; y < HEIGHT; y++) {
for (int x = 0; x < WIDTH; x++) {
drawTile(x, y, Type.WATER);
}
}
// 2. Draw the islands.
// We're going to use this algorithm to draw the circle:
// http://en.wikipedia.org/wiki/Midpoint_circle_algorithm
for (Island island : map.getIslands()) {
int f = 1 - island.getRadius();
int ddF_x = 1;
int ddF_y = -2 * island.getRadius();
int x = 0;
int y = 0;
Point2D center = island.getCenter();
int radius = island.getRadius();
drawTile(center.getX(), center.getY() + radius, TileType.LAND);
drawTile(center.getX(), center.getY() - radius, TileType.LAND);
drawTile(center.getX() + radius, center.getY(), TileType.LAND);
drawTile(center.getX() - radius, center.getY(), TileType.LAND);
while(x < y) {
if(f >= 0) {
y--;
ddF_y += 2;
f += ddF_y;
}
x++;
ddF_x += 2;
f += ddF_x;
drawTile(center.getX() + x, center.getY() + y, TileType.LAND);
drawTile(center.getX() - x, center.getY() + y, TileType.LAND);
drawTile(center.getX() + x, center.getY() - y, TileType.LAND);
drawTile(center.getX() - x, center.getY() - y, TileType.LAND);
drawTile(center.getX() + y, center.getY() + x, TileType.LAND);
drawTile(center.getX() - y, center.getY() + x, TileType.LAND);
drawTile(center.getX() + y, center.getY() - x, TileType.LAND);
drawTile(center.getX() - y, center.getY() - x, TileType.LAND);
}
// TODO: Now you have to figure out how to fill in the guts of the island.
}
// 3. Draw the deposits.
// TODO: I'll leave this one for you.
基本上就是这样 - 还不错。
您总是可以更进一步,添加大部分是水但有一些海岸线的瓷砖。为此,您必须检查您正在绘制的图 block 是边还是角:
+-+-+-+
|1|2|3|
+-+-+-+
+-+-+-+-+
|4|5|6|7|
+-+-+-+-+
+-+-+-+
|8|9|0|
+-+-+-+
这里你可以看到2,9,4都是边缘瓦片。 1、3、8、0都是角砖,5是内砖。当您将一个瓷砖识别为角时,您必须选择所有附着的水瓷砖并将它们绘制为“海岸”瓷砖:
+-+-+
| |x|
+-+-+-+-+
|x|1|2|3|
+-+-+-+-+
+-+-+-+-+
|4|5|6|7|
+-+-+-+-+
+-+-+-+
|8|9|0|
+-+-+-+
所有的 x 都是沿海板 block 。
希望对您有所帮助。
关于java - 二维高架瓦片生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13897951/
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我正在制作一个游戏,世界地图将由称为 Tiles 的 block 创建。所有图 block 都保存在单个 PNG 文件中,类似于下面发布的文件: 我需要分割这个图像并将所有这些 block 分别存储在
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Android custom control to display map tiles 我是 Java 的新
我使用 raster2pgsql 将栅格文件导入到 PostGIS 中,我设置了 -t 50x50,它生成了大约 500 行。我知道这些 -t 将光栅分成小块,并且 rid 可以为它们编制索引。我看到
我正在我的移动应用(Cordova 应用)中使用 Google map 。其中我在 map 上制作一些多边形作为边界。我希望用户也可以在离线模式下查看边界/多边形。对于离线 map ,我正在使用 Le
我现在有这个代码:http://jsfiddle.net/DK67k/2/这里是 2D 瓦片 map ,当你点击瓦片时,你会得到坐标。但是要获得精确坐标,您需要单击左上图 block (图 block
我正在开发一款 Mario 游戏,需要有关如何为图 block map 创建命中检测的帮助和建议。 目前,玩家可以步行/跳跃穿过方 block 。我现在在地面上添加了一个固定检测,我希望用常规的命中检
我正在尝试以灰度显示通过 Cartopy 的 img_tiles 模块下载的图 block 。那是因为我想覆盖彩色编码的卫星数据,并且我更喜欢背景尽可能不分散注意力。 source code 中记录的
问题来了。我有大小为 1 的矩形 Canvas 。因此它的坐标系为 (0.0 ... 1.0 - x 和 0.0 ... 1.0 - y)。 我也有一些瓷砖。瓷砖也是矩形的。它们有不同的大小,瓷砖的数
由于 - (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView 在从缓存中加载图 block 时未调用,是否有办法知道何时加载了所有图 block
我阅读了 google android api 并且对 map 图 block 是什么感到困惑,因为该 api 描述了 google map 如何处理“下载 map 图 block ”。(来源)- h
我一直在尝试在我的 flutter 应用程序的卡片最左边放置一个线条指示器。我尝试了很多东西但没有用。 有一个确切的问题here ,这实际上是我一直试图解决的同一个问题。 公认解决方案的问题是它限制了
最近我正在使用 Phaser.js 开发一个游戏,我开始需要我的瓦片 map 对象,我来看看这个 video . 唯一的问题是看到这个的“ Sprite 制造对象”example ,这个方法用到了ma
我对 libgdx 瓦片 map 中单位比例的实现感到很困惑。例如,如果我将我的单位比例指定为 1/16f,并让一个 Actor 在我的逻辑世界中从 (0,0) 移动到 (0,1),那么 Sprite
我已经为此工作好几天了。我在关卡编辑器中创建了一个瓦片 map 。它可以很好地加载到我的代码中,但是当我遍历这些图 block 时,它们都没有显示为具有定义。不确定我做错了什么。 一切运行正常,但它不
所以我正在尝试构建一个由图 block 组成的基于 3D 的世界。 我已经使用平面几何形状和高度值等成功地做到了这一点。但现在我已经到了可能不得不改变一切的地步。 问题是我想要一个图 block 具有
我遵循将瓦片 map 转换为视网膜显示的指南,方法是将宽度和高度的大小更改为对象的大小和位置的两倍。但正常显示的结果与视网膜显示不同 正常显示正确但视网膜显示不正确 这是非视网膜瓦片 map 这是视网
我正在用 SFML 制作一个 2D 游戏,我正在尝试弄清楚如何与瓦片 map 中的瓦片发生碰撞。我已经编写了一些代码,但问题是我卡在了正在碰撞的方 block 中,如下图所示。我无法向任何方向移动,播
我正在创建一个 HTML5 平台游戏,使用对象进行碰撞检测并使用 2d 图 block map 来渲染关卡。这就是全部工作。 我想使用相同的二维数组动态构建对象数组,以允许玩家根据需要构建 map ,
我正在尝试使用 libgdx 为我的家人制作一个简短的圣诞节游戏,当向前穿过关卡时,屏幕边缘会闪烁,但当向后移动时,没有闪烁,这很烦人。 Here是我的意思的演示。 此外,这是我的代码: if (di
我是一名优秀的程序员,十分优秀!