C# XNA如何存储和绘制二维地图?
我有一个问题,我不知道如何解决。 我需要为我的XNA应用程序创建一个2D地图编辑器,其中包含一定数量的平铺。 假设一张地图是50x100块瓷砖 我不确定地图、平铺使用什么样的数据结构,以及如何将其存储在硬盘上以便以后加载 我现在想的是这个。我会将地图存储在文本文件中,如下所示:C# XNA如何存储和绘制二维地图?,c#,xna,C#,Xna,我有一个问题,我不知道如何解决。 我需要为我的XNA应用程序创建一个2D地图编辑器,其中包含一定数量的平铺。 假设一张地图是50x100块瓷砖 我不确定地图、平铺使用什么样的数据结构,以及如何将其存储在硬盘上以便以后加载 我现在想的是这个。我会将地图存储在文本文件中,如下所示: //x, y, ground_type, object_type 0, 0, 1, 0 0, 1, 2, 1 其中,对于地面地形,0=草地,1=河流etcc,对于对象类型,0=无,1=墙 然后我将有一个游戏组件映射类,
//x, y, ground_type, object_type
0, 0, 1, 0
0, 1, 2, 1
其中,对于地面地形,0=草地,1=河流etcc,对于对象类型,0=无,1=墙
然后我将有一个游戏组件映射类,可以读取该文件或从头创建一个新文件:
class Map : DrawableGameComponent {
//These are things like grass, whater, sand...
Tile ground_tiles[,];
//These are things like walls that can be destroyed
Tile object_tiles[,];
public Map(Game game, String filepath){
for line in open(filepath){
//Set the x,y tile to a new tile
ground_tiles[line[0], line[1]] = new Tile(line[3])
object_tiles[line[0], line[1]] = new Tile(line[4])
}
}
public Map(Game game, int width, int heigth){
//constructor
init_map()
}
private void init_map(){
//initialize all the ground_tiles
//to "grass"
for i,j width, heigth{
ground_tiles[i,j] = new Tile(TILE.GRASS)
}
public override Draw(game_time){
for tile in tiles:
sprite_batch.draw(tile.texture, tile.x, tile.y etc..)
}
我的Tile类可能不是游戏组件。
我仍然不太确定如何处理碰撞检测,例如,来自玩家的子弹与地图对象之间的碰撞检测。这应该由Map类或某种超级管理器类来处理吗
欢迎任何提示。
谢谢 为什么不将其存储为:
Height
Width
GroundType * (Height * Width)
提供类似于
4
4
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
它既简单又紧凑。:)对于游戏内存储,2D阵列非常适合,除非您有其他特殊需要。一种典型的碰撞检测技术是由物理子系统中的一个应用程序完成一个广泛的阶段,例如使用边界球体或轴对齐的边界框,然后让可能发生碰撞的对象对进行计算,以确定是否确实发生了碰撞
您的tile类可能不应该是组件,除非您有非常令人信服的理由
编辑:忘记了上面的对象类型,但是集成它也很容易。为什么不将其存储为:
Height
Width
GroundType * (Height * Width)
提供类似于
4
4
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
它既简单又紧凑。:)对于游戏内存储,2D阵列非常适合,除非您有其他特殊需要。一种典型的碰撞检测技术是由物理子系统中的一个应用程序完成一个广泛的阶段,例如使用边界球体或轴对齐的边界框,然后让可能发生碰撞的对象对进行计算,以确定是否确实发生了碰撞
您的tile类可能不应该是组件,除非您有非常令人信服的理由
编辑:忘记了上面的对象类型,但是它也很容易集成。谢谢,但我决定使用(地面类型,对象类型)对。
所以输入文件
0, 1
0, 0,
0, 0,
1, 1
使用以下映射:
地面={0:草地,1:道路}
对象={0:无,1:板条箱}
地图的宽度=2和高度=2将产生以下结果:
grass+crate | grass
grass | road+crate
当然,我必须知道地图的宽度/高度才能理解文件。我也可以把它放在输入文件中。谢谢,但我决定使用(地面类型、对象类型)对。
所以输入文件
0, 1
0, 0,
0, 0,
1, 1
使用以下映射:
地面={0:草地,1:道路}
对象={0:无,1:板条箱}
地图的宽度=2和高度=2将产生以下结果:
grass+crate | grass
grass | road+crate
当然,我必须知道地图的宽度/高度才能理解文件。我也可以把它放在输入文件中