需要有关单游戏屏幕分辨率和交集的帮助

Need help on monogame screen resolution and intersection

目前在我的游戏中我想尝试将我的对象同时移向 x 轴和 y axis.As 我也想把它放在中心,我已经放了一个 camera.Here 是我的相机代码-

 public class Camera
{
    public Matrix transform;
    public Viewport view;
    public Vector2 origin;
    Vector2 baseScreenSize = new Vector2(1136, 720);
    float horScaling ;
    float verScaling ;
    Vector3 screenScalingFactor ;
    public Camera(Viewport newView)
    {
        view = newView;
        horScaling = view.Width / baseScreenSize.X;
        verScaling = view.Height / baseScreenSize.Y;
        screenScalingFactor = new Vector3(horScaling, verScaling, 1);
    }

    public void update(GameTime gt, ball pl)
    {
        origin = new Vector2(pl.Position.X + (pl.ballRectangle.Width / 2) - 400, 0);
        transform = Matrix.CreateScale(1,1,0) *
            Matrix.CreateTranslation(new Vector3(-origin.X, -origin.Y, 0));
    }

}

并且在 Game1.cs 文件中像往常一样在 begin 语句中我把这个 -

 spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, null, null, null, null, cm.transform*globalTransformation);
                ba.Draw(spriteBatch, Color.White);
                spriteBatch.End();

这里的ba是球的对象,它只是有移动x和y的功能。

在单独的开始、结束语句中,我正在绘制其余所有对象-

 spriteBatch.Begin(SpriteSortMode.Immediate, null, null, null, null, null, globalTransformation);

                spriteBatch.Draw(mainMenu, new Vector2(0, 0), Color.White);
                spriteBatch.Draw(mainMenu1, new Vector2(450, 100), Color.White);
                spriteBatch.End();

这里已经应用了全局转换来实现独立的屏幕分辨率(类似于 Camera.cs 中的代码)。

其余对象按预期工作,但相机对象与其余对象的交集未按预期工作。 我想这是由于分辨率独立性不适用于相机对象(我不确定)。我在搜索互联网后尝试了很多代码,但其中 none 正在按预期工作。 简单来说——我想克隆这个游戏—— https://play.google.com/store/apps/details?id=com.BitDimensions.BlockyJump

如果你看到主玩家正在沿x和y轴移动,但由于相机处于恒定位置,但障碍物不在相机中,如何实现相机绘图中的对象与相机绘制中的对象之间的交集在这种情况下不在相机中 请求大家的帮助,我被困在这里很久了...

我不明白你说的每个问题,但根据我收集到的信息,你想要相机跟随目标的位置,你还想要独立的屏幕分辨率?

好吧,对于独立的屏幕分辨率,只需创建一个屏幕分辨率处理程序,将场景渲染到由您的尺寸定义的 RenderTarget2D。然后将其绘制到屏幕上。

用于相机运动。尝试调整相机的位置以使用偏移和 slerp 插值跟随目标的位置,以防止卡顿和流畅的动作。

void Update(float gameTime) {
        Vector3 camTransform = Camera.Position + cameraTarget;
        Vector3 newCameraPosition = Vector3.Slerp(cameraPosition, camTransform, 0.2f);
        Camera.Position = newCameraPosition;
}

对于你的路口问题,试试这个

private bool intersects(rectangle1, rectangle2) {
    return rectangle1.x >= rectangle2.x &&
           rectangle1.y >= rectangle2.y &&
           rectangle1.y <= rectangle2.y + rectangle2.h &&
           rectangle1.x <= rectangle2.x + rectangle2.w;
}

private void checkIntersections(gameObjects[]) {
    foreach (var obj in gameobjects) {
        if (intersects(obj.rectangle, camera.rectangle){
             handleIntersections(camera, obj);
        }
    }
}

从没想过这会这么简单...在互联网上搜索,在 他们说的大部分代码我们需要反转相机变换。 但这不是 case.As 从一开始我就说我的问题是相机对象和非相机对象之间的交集,这是答案-

首先我们需要找到相机对象的位置以形成一个世界space矩形

Vector2 hj = Vector2.Transform(ba.Position, cm.transform);
      Rectangle leftRectangleT1 =
                   new Rectangle((int)hj.X, (int)hj.Y, ba.tex.Width, ba.tex.Height);

这里的ba是camera对象,我们需要像上面的代码一样将它转换为camera transform

为了在像素相交的情况下获得 ba 的变换,这里是代码-

Matrix ballTransform = Matrix.CreateTranslation(new Vector3(hj.X, hj.Y, 0.0f));

就是这样,你有球形矩形,它是与现实世界对象(非相机对象)相交的相机对象