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

时间:2018-10-20 09:43:30

标签: c# xna monogame xna-4.0

目前,在我的游戏中,我想尝试将对象同时向x轴和y轴移动。由于我也想将其放置在中心位置,所以我已经放置了一个摄像头。这是我的Camera代码-

 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));
    }

}

并像往常一样在begin1语句中的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功能。

在一个单独的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中的代码)。

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

如果您看到主要玩家沿x和y轴移动,但是由于摄影机处于固定位置,但是障碍物不在摄影机中,如何实现摄影机绘制的对象与非摄影对象之间的交集在这种情况下 要求所有帮助,我长期以来一直在这里...

2 个答案:

答案 0 :(得分:5)

从来没有想过这会这么简单...在整个互联网上搜索 他们说的大多数代码都需要逆向进行相机变换。 但是事实并非如此。从一开始我就说我的问题是相机对象和非相机对象之间的交集,这就是答案-

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

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));

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

答案 1 :(得分:1)

我不能一口气理解您的问题,但是从我收集到的信息来看,您希望摄像机跟随目标的位置,并且还希望获得独立的屏幕分辨率?

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

用于相机移动。尝试调整摄像机的位置,使其偏移并跟随小角度插值,以跟随目标的位置,以防止卡顿和平滑动作。

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);
        }
    }
}