Je fais un jeu de test où je veux que le niveau défile constamment. Pour créer cet effet, j'ai créé une classe de caméra qui stocke simplement une position vector2 et une direction enum. Il contient également une méthode publique de «déplacement» qui modifie simplement la position à un taux fixe. J'utilise ensuite cette position lors de la boucle à travers mon tableau de tuiles lors du dessin. Tout cela fonctionne bien.
Cependant, on m'a dit que je devrais utiliser une matrice de transformation pour déplacer la caméra et que je devrais fournir cela lorsque je démarre le spritebatch. Je suis un peu confus a.) Comment ça marche? comme si je ne le donnais qu'au début du spritebatch, comment sait-il continuer à changer de position? b.) Pourquoi le faire, car j'ai sûrement encore besoin de la position de la caméra pour parcourir les tuiles?
Pour le moment, je ne peux pas le faire fonctionner, mais ce n'est pas une surprise car je ne comprends pas complètement comment il est censé fonctionner. Actuellement, dans ma tentative (code à suivre), les tuiles dessinées changent, ce qui signifie que la position des caméras change, mais la position de la fenêtre reste inchangée (c'est-à-dire à l'origine de la caméra). J'apprécierais vraiment quelques conseils / conseils sur la façon dont il est censé être utilisé?
Caméra:
class Camera {
// The position of the camera.
public Vector2 Position {
get { return mCameraPosition; }
set { mCameraPosition = value; }
}
Vector2 mCameraPosition;
public Vector2 Origin { get; set; }
public float Zoom { get; set; }
public float Rotation { get; set; }
public ScrollDirection Direction { get; set; }
private Vector2 mScrollSpeed = new Vector2(20, 18);
public Camera() {
Position = Vector2.Zero;
Origin = Vector2.Zero;
Zoom = 1;
Rotation = 0;
}
public Matrix GetTransform() {
return Matrix.CreateTranslation(new Vector3(mCameraPosition, 0.0f)) *
Matrix.CreateRotationZ(Rotation) *
Matrix.CreateScale(Zoom, Zoom, 1.0f) *
Matrix.CreateTranslation(new Vector3(Origin, 0.0f));
}
public void MoveCamera(Level level) {
if (Direction == ScrollDirection.Up)
{
mCameraPosition.Y = MathHelper.Clamp(mCameraPosition.Y - mScrollSpeed.Y, 0, (level.Height * Tile.Height - level.mViewport.Height));
}
}
Niveau:
public void Update(GameTime gameTime, TouchCollection touchState) {
Camera.MoveCamera(this);
}
public void Draw(SpriteBatch spriteBatch) {
//spriteBatch.Begin();
spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, SamplerState.LinearClamp, DepthStencilState.Default, RasterizerState.CullCounterClockwise, null, mCamera.GetTransform());
DrawTiles(spriteBatch);
spriteBatch.End();
}
Jeu - appelle simplement le tirage au sein du niveau:
protected override void Draw(GameTime gameTime) {
mGraphics.GraphicsDevice.Clear(Color.Black);
//mSpriteBatch.Begin();
// Draw the level.
mLevel.Draw(mSpriteBatch);
//mSpriteBatch.End();
base.Draw(gameTime);
}
================================================== =============================== EDIT:
Tout d'abord, merci craftworkgames pour votre aide jusqu'à présent.
J'ai joué avec la suggestion. Quand j'ai dessiné toutes les tuiles, le fr a atteint environ 15 sur 30 - probablement parce que les niveaux sont assez grands.
Donc, ce que j'ai fait, c'est appliquer la matrice et se déplacer dans la mise à jour (comme suggéré), mais dans le dessin, j'utilise la position des caméras pour parcourir les tuiles (c'est-à-dire commencer le compteur à gauche et terminer à droite). Tout fonctionne bien et j'en suis satisfait :-)
Mon nouveau problème réside dans le joueur. Évidemment, comme je déplace maintenant la caméra plutôt que le niveau, le joueur est laissé par le camer car sa position reste fixe. J'ai pensé à deux solutions à ce problème, la première est de simplement considérer la position des caméras lors du dessin du lecteur. C'est-à-dire dans la fonction de dessin, ajoutez simplement la position de la caméra à la position du joueur. La seconde consiste à démarrer un nouveau lot de sprites pour le joueur qui n'a pas de transformation. c'est-à-dire terminer le spritebatch après avoir dessiné les tuiles puis en commencer une nouvelle lorsque vous dessinez le joueur. Je sais que les deux fonctionneront, mais je ne peux pas faire de têtes de queues qui seraient meilleures en termes de performances / bon codage? Je ne sais pas quelles sont les implications en termes de performances du démarrage du lot deux fois?