C# 需要单游戏屏幕分辨率和交集方面的帮助吗

C# 需要单游戏屏幕分辨率和交集方面的帮助吗,c#,xna,monogame,xna-4.0,C#,Xna,Monogame,Xna 4.0,目前在我的游戏中,我想尝试将我的物体向x轴和y轴移动。因为我也想把它放在中间,所以我放了一个摄像头。这是我的摄像头代码- public class Camera { public Matrix transform; public Viewport view; public Vector2 origin; Vector2 baseScreenSize = new Vector2(1136, 720); float horScaling ; floa

目前在我的游戏中,我想尝试将我的物体向x轴和y轴移动。因为我也想把它放在中间,所以我放了一个摄像头。这是我的摄像头代码-

 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是ball的对象,它只是具有移动x和y的功能

在一个单独的begin、end语句中,我正在绘制其余的所有对象-

 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();
这里应用了globaltransformation以获得独立的屏幕分辨率(类似于Camera.cs中的代码)

其余对象按预期工作,但摄影机对象和其余对象的交点未按预期工作。 我猜这是因为分辨率无关性没有应用到相机对象上(我不确定)。我在搜索互联网后尝试了很多代码,但没有一个能像预期的那样工作。 简单地说,我想克隆这个游戏-

如果您看到主要玩家正在沿x轴和y轴移动,但由于摄影机处于固定位置,但障碍物不在摄影机中,那么在这种情况下,如何实现摄影机绘制中的obejct与摄影机中不存在的对象之间的交点
请求所有人帮助,我被困在这里很久了…

我不明白你的问题,但从我收集的信息来看,你想让相机跟随目标的位置,你还想独立的屏幕分辨率

对于独立的屏幕分辨率,只需创建一个屏幕分辨率处理程序,将场景渲染为由大小定义的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);
        }
    }
}
private bool相交(矩形1、矩形2){
返回矩形1.x>=矩形2.x&&
矩形1.y>=矩形2.y&&

矩形1.y没想到这会这么容易…在互联网上搜索,在 他们说的大多数代码都需要对摄影机进行逆变换。 但事实并非如此。从一开始我就说我的问题是摄影机对象和非摄影机对象之间的交集,下面是答案-

首先,我们需要找到摄像机对象的位置,以形成一个世界空间矩形

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是摄影机对象,我们需要像上面的代码一样将其变换为摄影机变换

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

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

也就是说,你有一个球体矩形,它是相机对象,与现实世界的对象(非相机对象)相交

谢谢你的回复,我很快就能实现目标,但问题是交叉点不起作用。嘿,没问题。你希望执行什么样的交叉点?光线投射、边界框等。或者,你可以坚持使用矩形,通过四叉树测试每个对象的每个交叉点。正常干涉在相机对象(本例中为ba.draw)和相机外对象(其中已应用解决方案独立性)之间的。要实现的是简单的相交计算。创建一个屏幕矩形(与您选择的分辨率成比例)并为每个对象创建矩形,然后在名为IntersectionHandler的单独类中测试所有交点。这是最简单的方法,但使用四叉树(2D)或八叉树(3D)对于任何类型的交叉点,相对于屏幕摄影机,它节省了性能,并且易于实现。正如我在问题中提到的,所有交叉点都按预期工作,唯一不工作的是摄影机对象和其他对象之间的交叉点