繁体   English   中英

需要关于monogame屏幕分辨率和交集的帮助

[英]Need help on monogame screen resolution and intersection

目前在我的游戏中我想尝试将我的物体移向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文件中我将这个 -

 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中的代码)。

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

如果你看到主播放器正在沿着x和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));

多数民众赞成你有球矩形,它是与现实世界物体(非相机物体)相交的相机物体

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

好吧,对于独立的屏幕分辨率,只需创建一个屏幕分辨率处理程序,将场景渲染为由您的尺寸定义的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);
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM