Нужна помощь по разрешению и пересечению экрана моногамы - PullRequest
0 голосов
/ 20 октября 2018

В настоящее время в моей игре я хочу попытаться переместить мой объект как к оси 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).

Остальные объекты работают должным образом, но пересечения объекта камеры и остальных объектов не работают должным образом.Я думаю, это связано с тем, что независимость разрешения не применяется к объекту «Камера» (я не уверен). Я пробовал много кодов после поиска в Интернете, но ни один из них не работает так, как ожидалось.Проще говоря - я хочу клонировать эту игру - https://play.google.com/store/apps/details?id=com.BitDimensions.BlockyJump

Если вы видите, что основной игрок движется вдоль осей x и y, но из-за камеры он находится в постоянном положении, но препятствия не находятся в камереКак достичь пересечения между объектом, который находится в кадре камеры, и объектами, которые не находятся в камере, в этом случае просьба всем помочь, я застрял здесь на долгое время ...

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

Никогда не думал, что это будет так просто ... Поиск по всему интернету, в большинстве кодов, которые, как они говорили, нам нужно инвертировать преобразование камеры.Но это не так. С самого начала я говорил, что моя проблема - это пересечение объекта камеры и объекта, не являющегося камерой, вот ответ:

Прежде всего нам нужно найти положение объекта камеры, чтобы сформироватьпрямоугольник мирового пространства

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

То есть у вас есть шариковый прямоугольник, который является объектом камеры, который пересекается с объектами реального мира (не объектами камеры)

0 голосов
/ 22 октября 2018

Я не понимаю ваш вопрос, скажем так, но из того, что я собрал, вы хотите, чтобы камера следовала за положением цели, и вам также нужны независимые разрешения экрана?

Ну, для независимого разрешения экранаПросто создайте обработчик разрешения экрана, который отображает сцену в 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);
        }
    }
}
...