web-dev-qa-db-fra.com

Besoin d'aide sur la résolution d'écran et l'intersection monogame

Actuellement dans mon jeu, je veux essayer de déplacer mon objet à la fois vers les axes x et y.Comme je voulais aussi le placer au centre, j'ai mis une caméra.Voici le code de ma caméra-

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

}

et dans le fichier Game1.cs comme d'habitude dans la déclaration de début, je mets this-

 spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, null, null, null, null, cm.transform*globalTransformation);
                ba.Draw(spriteBatch, Color.White);
                spriteBatch.End();

Ici, ba est l’objet de la balle, il n’a que des fonctionnalités mobiles x et y.

Dans une déclaration de début, fin séparée, je dessine tous les objets-

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

Ici, vous avez appliqué la transformation globale à une résolution d'écran indépendante (codes similaires à ceux de Camera.cs).

Le reste des objets fonctionne comme prévu, mais les intersections entre l'objet caméra et le reste des objets ne fonctionnent pas comme prévu. Je suppose que cela est dû au fait que l'indépendance de la résolution n'est pas appliquée à l'objet Camera (je ne suis pas sûr). .J'ai essayé beaucoup de codes après une recherche sur Internet, mais aucun d'entre eux ne fonctionne comme prévu. En quelques mots, je veux cloner ce jeu - https: // play. google.com/store/apps/details?id=com.BitDimensions.BlockyJump

Si vous voyez que le joueur principal se déplace le long des axes x et y, mais que la caméra l’est en position constante, mais que les obstacles ne sont pas à huis clos, comment réaliser l’intersection de l’objet qui se trouve dans la caméra et des objets ce cas Demander à tous de l’aider, je suis coincé ici depuis longtemps ...

12
uncle_scrooge

Jamais pensé que cela serait aussi facile ... Recherche sur Internet, dans La plupart des codes dont ils parlaient nécessitaient l'inverse de la transformation de la caméra. Mais ce n'est pas le cas. Depuis le début, je disais que mon problème est l'intersection entre objet caméra et objet non-caméra, voici la réponse.

Tout d'abord, nous devons trouver les positions de l'objet caméra pour former un rectangle d'espace du monde.

Vector2 hj = Vector2.Transform(ba.Position, cm.transform);
      Rectangle leftRectangleT1 =
                   new Rectangle((int)hj.X, (int)hj.Y, ba.tex.Width, ba.tex.Height);

Ici, ba est l’objet caméra, nous devons le transformer en caméra comme les codes ci-dessus.

Pour obtenir une transformation de ba en cas d'intersection de pixels, voici les codes

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

C’est pour cela que vous avez un rectangle en forme de boule qui est un objet de la caméra à intersecter avec des objets du monde réel (non des objets de la caméra)

5
uncle_scrooge

Je ne comprends pas votre question, mais d'après ce que j'ai compris, vous voulez que la caméra suive la position de la cible et vous voulez également des résolutions d'écran indépendantes?

Eh bien, pour la résolution d'écran indépendante, créez simplement un gestionnaire de résolution d'écran qui restitue la scène en RenderTarget2D, comme défini par vos tailles. Ensuite, dessinez cela à l'écran.

Pour le mouvement de la caméra. Essayez de régler la position de la caméra pour qu'elle suive la position de la cible avec une interpolation offset et une interpolation plus lente pour éviter les mouvements saccadés et les actions en douceur.

void Update(float gameTime) {
        Vector3 camTransform = Camera.Position + cameraTarget;
        Vector3 newCameraPosition = Vector3.Slerp(cameraPosition, camTransform, 0.2f);
        Camera.Position = newCameraPosition;
}

Pour votre problème d’intersection, essayez quelque chose le long de cette

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);
        }
    }
}
1
Linas Paz