我创建了我的瓷砖地图和我的播放器。
我现在正试图创造碰撞,我觉得我正走在正确的轨道上。
以下是我创建地图的方式。
List<Texture2D> tileTextures = new List<Texture2D>();
int tileWidth = 60;
int tileHeight = 60;
public int[,] Map = new int[,]
{
{2,2,2,2,2,2,2,2,2,2},
{2,2,2,2,1,2,2,2,2,2},
{2,2,2,2,2,2,2,2,2,2},
{2,2,2,2,2,2,2,2,2,2},
};
public void Draw(SpriteBatch spriteBatch)
{
int tileMapWidth = Map.GetLength(1);
int tileMapHeight = Map.GetLength(0);
for (int x = 0; x < tileMapWidth; x++)
{
for (int y = 0; y < tileMapHeight; y++)
{
int textureIndex = Map[y, x];
Texture2D texture = tileTextures[textureIndex];
spriteBatch.Draw(
texture,
source = new Rectangle(x *myTile.Width,
y * myTile.Height,
tileWidth,
tileHeight),
Color.White);
}
}
}
我正在检查具有这种情况的2d阵列坐标,并检查是否有特定的瓷砖,然后我可以设置我之前的位置,如果它是真的。
我目前正在测试1个瓷砖atm。
public void Update(GameTime gameTime)
{
prevPosition = position;
input(gameTime);
if(tiles.Map[(int)playerPosition.X/60,(int)playerPosition.Y/60] == 1)
{
position = prevPosition;
}
}
然而,我的玩家位置不断超出2D阵列的索引边界,我相信我需要将其缩小以便停止此操作,我已经尝试将游戏坐标划分为平铺的宽度但是那还没有奏效。
如果有人能帮助我正确缩放,我将非常感激。
答案 0 :(得分:1)
如果您的玩家的位置类似于-x,y或x,-y或者-x,-y,则会发生这种情况。如果你像这样做一个功能,你的方法可能会更好
public bool CollidesWithWall(int x, int y)
{
if(x < 0 || x > *matrix width* - 1) return false;
if(y < 0 || y > *matrix height* -1) return false;
if (Map[x,y] == 1) return true;
return false;
}
并使用行tiles.Map[(int)playerPosition.X/60,(int)playerPosition.Y/60]
或者,如果您需要返回的瓷砖类型
public int CollidesWithWall(int x, int y)
{
if(x < 0 || x > *matrix width* - 1) return -1;
if(y < 0 || y > *matrix height* -1) return -1;
return Map[x,y];
}
通过这种方式,你会知道你是否偶然发现了一个健康药水(只是将它的ID设置为3)或墙壁(ID为1或者其他东西,那个&#39;完全取决于你)如果它是0,它是空的空间(或者可能是-1)。请注意&#34; -1&#34;部分完全取决于你。只需写下你将拥有的id列表以及它们出现的项目。
其他建议
试试if(tiles.Map[(int)(playerPosition.X/60f),(int)(playerPosition.Y/60f)] == 1)