【问题标题】:Need help on monogame screen resolution and intersection在monogame屏幕分辨率和交叉点上需要帮助
【发布时间】:2018-10-20 09:43:29
【问题描述】:

目前在我的游戏中,我想尝试将我的对象同时移向 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();

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

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

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

【问题讨论】:

    标签: c# xna monogame xna-4.0


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 感谢您的回复,目前我能够实现跟随目标,但问题是十字路口不起作用..
      • 嘿,没问题。您希望执行什么样的交叉路口?光线投射、边界框等...或者,您可以坚持使用矩形并通过四叉树测试每个对象与每个交点。
      • 相机对象(在本例中为 ba.draw)与已应用 rsolution 独立性的相机对象之间的正常交互
      • 你想要实现的是简单的交集计算。创建一个屏幕矩形(与您选择的分辨率成比例)并为每个对象创建矩形,然后在一个名为 IntersectionHandler 的单独类中测试所有交叉点。这是最简单的方法,但是使用 QuadTree (2D) 或 Octtree (3D) 进行任何类型的交叉点,针对屏幕摄像头,它可以节省性能并且易于实现
      • 正如我在问题中提到的,所有的交叉点都按预期工作,唯一不工作的是相机对象和其他对象之间的交叉点
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-25
      • 1970-01-01
      • 2011-02-02
      • 1970-01-01
      相关资源
      最近更新 更多