gpt4 book ai didi

c# - 在基于网格的游戏中放置墙壁/道路

转载 作者:行者123 更新时间:2023-12-01 19:35:25 24 4
gpt4 key购买 nike

我正在制作一个基于网格的游戏。

在这个游戏中,您可以放置​​建筑物、墙壁和道路。

当某些东西被放置在网格中时,我将单元格 ID 设置为该对象 ID。到目前为止一切顺利,一切正常。

当我需要时,我的问题就来了 Bitmask我的墙壁/道路(通过拖动鼠标放置)。

目前我进行位掩码的方式是检查所有相邻的 cells 是否匹配,并相应地设置正确的模型。即,如果西方和北方匹配,我会创建一个弯道。

当我将墙放在已占用的 cells 顶部时,我的问题就来了。我仍然想以图形方式显示墙(红色),但我不能覆盖当前在该 cell 中的内容。

这意味着我的位掩码不会起作用,因为墙不在实际的 grid 中,它只在世界空间中。

墙壁将单元格设置为 id 0,房屋将单元格设置为 id 1。我无法覆盖 house 单元格中的 id,因此位掩码(正确地)最终会被破坏。

如何管理这样的场景?

单元格:

public class Cell
{
public int x, z;
public int id;
public GameObject go
}

最佳答案

您可以向网格添加图层,并且只合并同一图层上的单元格。

  • 道路与道路交汇。
  • 墙与墙融为一体。

如果您想避免单元格重叠,请检查其他图层中是否已经存在某些内容。从其他层查找值也将允许您交叉合并单元格,尽管它增加了很多复杂性。

这是一些伪代码:

enum Layer {
Building,
Wall,
Road
}

struct Point {
int x,y;
}

class Cell {
Point point;
int value;
}

class Cells {
Dictionary<Point, Cell> cells; // mapping position to the cell object

Cells(int width, int height) {
for x in width
for y in height
Point point = new Point(x,y);
cells.Add(point, new Cell(point, default))
}

Cell Get(Point point) => cells[point];
}

class Grid {
Dictionary<Layer, Cells> layers; // mapping the layer enum to the cells group object

Grid(int width, int height) {
foreach layer in Layer
layers.Add(layer, new Cells(width, height));
}

Cells GetLayer(Layer layer) {
return layers[layer]
}

int GetValue(Point point, Layer layer) {
return GetLayer(layer).Get(point).value;
}

bool IsValueInAllLayers(Point point, int value) {
foreach layer in Layers
if layer.Get(point).value != value
return false;
return true;
}
}

// program entry point
void Main() {
// construct a 10x10 grid
Grid grid = new Grid(10, 10);

Point mousePoint = new Point(2,2);

// to place a building all layers have to be empty (0)
if(grid.IsValueInAllLayers(mousePoint, 0)) {
grid.SetValue(mousePoint, Layer.Building);
}
}

关于c# - 在基于网格的游戏中放置墙壁/道路,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60643615/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com