我创造了一个自上而下的2D游戏
相关课程为Level
和Entity
。
在Level
我有一个Map
,但让我们把这个类看作墙壁和其他东西的列表,你可以想象它们会有一个身体,实际上是XNA' Rectangle
。
现在,在Level
的{{1}}功能中,我将使Update
的功能解决所有碰撞(墙壁,拾音器) ,其他实体,陷阱等),我正在质疑让每个Entity
知道他周围有什么的最好方法。通过这样做,我想实现创造不同Entity
es的自由,例如不同的玩家,敌人,老板......对于玩游戏的玩家来说,目标是一个很好的父级。/ p>
所以,我希望这个功能能够获得良好的性能(解决冲突),因为我计划制作有大约1000种不同物品和许多实体的地图,并且可以使用#t;决定如何去做。
结构是这样的:Level有一个项目列表(墙壁,拾取器,陷阱......)和一个实体列表(玩家,敌人,老板,宠物,坐骑,等等......),并且每次更新I级循环通过实体,并为每个实体Entity
。
问题我是否:
1) 将整个项目列表发送到每个实体(“更新方法”)并计算每个项目的距离并解决冲突问题
2) 在级别更新方法中计算与实体最接近的项目,然后将较小的项目列表发送给实体,然后将解决冲突
3) (这只是我想到的)XNA' Update
和项目类型的传递列表(这可能意味着我必须创建一个新的地图类的类或新函数,它将返回2个列表:矩形和项类型)
4) 传递整个地图,但是在一个matix(因为地图将是一个网格,而不是项目,也不会是玩家的矩形将旋转)的整数#39 ;对于墙壁有一些类似的东西,0表示无效,2表示陷阱,3表示健康包装等。但这只会解决地图问题,因为其他实体都不会在网格坐标中(墙的位置会像32x32,0x64等,所有都将是32x32,但是实体赢了&t; t他们将是32x16,他们的位置可能会有所不同。这也是我刚想到的。
注意,实体和物品的身体很可能只有Rectangle
。将有用于不同目的的纹理,动画和其他基本类型的变量,并且对于与该项目的实体冲突解决,大多数变量不需要。当与墙碰撞时,实体不需要该物品图像来解决碰撞,但如果该物品是健康药水则需要物品(比方说)X值。
你如何解决这个问题,以便代码有效,或者你是如何在游戏中解决这个问题的? 我正在寻找简洁和高效,这就是我在你的答案中所寻求的。
答案 0 :(得分:1)
我根本没有测试过这段代码,所以如果它不起作用,那就是原因。
鉴于Entity是一个包含以下代码的结构,
struct Entity{
Rectangle pos;
Texture2D tex;
bool hasAgency;
public Entity(Rectangle pos, Texture2D tex, bool hasAgency){
this.pos = pos;
this.tex = tex;
this.hasAgency = hasAgency;
}
}
然后这应该有用。
List<Entity> entityList = new List<Entity>//your entities are here
for(int testIndex=0; testIndex<entityList.Count; testIndex++){
for(int entityBeingTested = 0; entityBeingTested<entityList.Count; entityBeingTested++){
if(testIndex!=entityBeingTested && entityList[testIndex].hasAgency)
{
if(entityList[testIndex].pos.Intersects(entityList[entityBeingTested.pos]))
//hit logic here
}
}
}