好吧,所以我需要知道如何根据我上下移动所述物体上/下45度斜率的代码,将物体上下移动315度。目前,物体向上/向下移动315度斜坡,就像它的45度一样,这是错误的方式(当他向下和向右时向上和向右)。
以下是代码:
//you're in a double for loop going through every tile in the map, the int's being used are x, and y
//check if the tile is a slope
if (lv.type[lv.tile[x, y]] == Tiles.SLOPE)
{
//create a rectangle collision box
Rectangle tileCol = new Rectangle(x * lv.tileSize, (y * lv.tileSize), lv.tileSize, lv.tileSize + 1);
//if player collision "col" collides with "tileCol" and you haven't done this before this itteration (only happens once per full double loop)
if (col.Intersects(tileCol) && !onSlope)
{
//get the angle of the tile
float angle = lv.angle[lv.tile[x, y]];
//get the x distance of how far away the player's right is inside the tile
float dist = (col.X + col.Width) - tileCol.X;
//constructs the opposite of a right triangle
float opposite = (float)(Math.Tan(MathHelper.ToRadians(angle)) * (dist));
if (angle < 90)
{
//if player's right is less then or equal to tile's right
if (col.X + col.Width <= tileCol.X + tileCol.Width)
{
//place player on slope. this works properly
pos.Y = tileCol.Y - opposite;
//tell the program we don't wanna go through this again until the next full loop starts.
onSlope = true;
}
}
else if (angle > 90)
{
if (col.X >= tileCol.X)
{
//this is where the error is.
pos.Y = tileCol.Y + lv.tileSize + (dist * -1);
onSlope = true;
}
}
}
}
答案 0 :(得分:1)
我不完全理解你的代码,因为它的编写方式,你的玩家的位置.Y在“工作”if循环从tile的顶部递减,有效地将他放在矩形的顶部,当他认为从斜坡的底部上升。但是 - 根据上面的代码,以下应该适用于所有角度:
// Check if the tile is a slope
if (lv.type[lv.tile[x, y]] == Tiles.SLOPE)
{
// Create rectangle collision that is the same size as the tile
Rectangle tileCol = new Rectangle(x * lv.tileSize, y * lv.tileSize, lv.tileSize, lv.tileSize + 1);
// If player collision "col" standing on "tileCol"
if (col.Intersects(tileCol) && !onSlope)
{
// Get the angle of the tile
float angle = lv.angle[lv.tile[x, y]];
// Get the x distance of how far away the player's right is inside the tile
float dist = col.Right - tileCol.X;
// Figure out how far to offset the player
float offset = (float)(Math.Tan(MathHelper.ToRadians(angle)) * (dist));
// If player's right is less then or equal to tile's right
if (col.Right <= tileCol.Right)
{
if (angle % 180 < 90)
{
pos.Y = tileCol.Bottom + offset;
onSlope = true;
}
else if (angle % 180 > 90)
{
pos.Y = tileCol.Top + offset;
onSlope = true;
}
}
}
45度= 1/8 Pi。 315度= 7/8 Pi。切线函数根据斜率分别给出1和-1,并相应地偏移字符。